15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
3819a24084c0fd90d56e54653b4b286e085037da6Mudumba Ananth *  Copyright (C) 1999-2014 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 functions that handle inquiries. These include
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  setting discoverable mode, controlling the mode of the Baseband, and
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  maintaining a small database of inquiry responses, with API for people
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  to browse it.
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdlib.h>
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stddef.h>
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3379ecab5d0418fde77e9afcdd451bd713af73e180Chris Manton#include "device/include/controller.h"
34d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "osi/include/time.h"
35d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach
36d3842ed786d7adf1de9f0f9b2cd0de18fa5576e2Andre Eisenbach#include "bt_types.h"
37258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcimsgs.h"
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_int.h"
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hcidefs.h"
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/* 3 second timeout waiting for responses */
4578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#define BTM_INQ_REPLY_TIMEOUT_MS (3 * 1000)
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* TRUE to enable DEBUG traces for btm_inq */
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTM_INQ_DEBUG
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTM_INQ_DEBUG   FALSE
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
5178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
5278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue;
5378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*                 L O C A L    D A T A    D E F I N I T I O N S                */
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const LAP general_inq_lap = {0x9e,0x8b,0x33};
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const LAP limited_inq_lap = {0x9e,0x8b,0x00};
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT16 BTM_EIR_UUID_LKUP_TBL[BTM_EIR_MAX_SERVICES] =
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_SERVICE_DISCOVERY_SERVER,
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_BROWSE_GROUP_DESCRIPTOR,   */
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_PUBLIC_BROWSE_GROUP,       */
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_SERIAL_PORT,
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_LAN_ACCESS_USING_PPP,
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_DIALUP_NETWORKING,
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_IRMC_SYNC,
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_OBEX_OBJECT_PUSH,
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_OBEX_FILE_TRANSFER,
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_IRMC_SYNC_COMMAND,
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HEADSET,
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_CORDLESS_TELEPHONY,
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_AUDIO_SOURCE,
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_AUDIO_SINK,
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_AV_REM_CTRL_TARGET,
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_ADV_AUDIO_DISTRIBUTION,    */
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_AV_REMOTE_CONTROL,
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_VIDEO_CONFERENCING,        */
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_INTERCOM,
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_FAX,
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HEADSET_AUDIO_GATEWAY,
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_WAP,                       */
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_WAP_CLIENT,                */
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_PANU,
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_NAP,
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_GN,
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_DIRECT_PRINTING,
895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_REFERENCE_PRINTING,        */
905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_IMAGING,
915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_IMAGING_RESPONDER,
925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_IMAGING_AUTO_ARCHIVE,
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_IMAGING_REF_OBJECTS,
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HF_HANDSFREE,
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_AG_HANDSFREE,
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_DIR_PRT_REF_OBJ_SERVICE,
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_REFLECTED_UI,              */
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_BASIC_PRINTING,
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_PRINTING_STATUS,
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HUMAN_INTERFACE,
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_CABLE_REPLACEMENT,
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HCRP_PRINT,
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HCRP_SCAN,
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_COMMON_ISDN_ACCESS,        */
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_VIDEO_CONFERENCING_GW,     */
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_UDI_MT,                    */
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_UDI_TA,                    */
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_VCP,                       */
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_SAP,
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_PBAP_PCE,
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_PBAP_PSE,
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_PHONE_ACCESS,
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HEADSET_HS,
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_PNP_INFORMATION,
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_GENERIC_NETWORKING,        */
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_GENERIC_FILETRANSFER,      */
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_GENERIC_AUDIO,             */
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_GENERIC_TELEPHONY,         */
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_UPNP_SERVICE,              */
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_UPNP_IP_SERVICE,           */
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_ESDP_UPNP_IP_PAN,          */
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_ESDP_UPNP_IP_LAP,          */
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_ESDP_UPNP_IP_L2CAP,        */
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_VIDEO_SOURCE,
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_VIDEO_SINK,
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*    UUID_SERVCLASS_VIDEO_DISTRIBUTION         */
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_MESSAGE_ACCESS,
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_MESSAGE_NOTIFICATION,
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HDP_SOURCE,
1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UUID_SERVCLASS_HDP_SINK
1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*              L O C A L    F U N C T I O N     P R O T O T Y P E S            */
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/********************************************************************************/
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void         btm_initiate_inquiry (tBTM_INQUIRY_VAR_ST *p_inq);
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS  btm_set_inq_event_filter (UINT8 filter_cond_type, tBTM_INQ_FILT_COND *p_filt_cond);
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void         btm_clr_inq_result_flt (void);
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8        btm_convert_uuid_to_eir_service( UINT16 uuid16 );
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void         btm_set_eir_uuid( UINT8 *p_eir, tBTM_INQ_RESULTS *p_results );
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8       *btm_eir_get_uuid_list( UINT8 *p_eir, UINT8 uuid_size,
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                           UINT8 *p_num_uuid, UINT8 *p_uuid_list_type );
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT16       btm_convert_uuid_to_uuid16( UINT8 *p_uuid, UINT8 uuid_size );
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetDiscoverability
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the device into or out of
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  discoverable mode. Discoverable mode means inquiry
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  scans are enabled.  If a value of '0' is entered for window or
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  interval, the default values are used.
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS if successful
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY if a setting of the filter is already in progress
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if couldn't get a memory pool buffer
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_ILLEGAL_VALUE if a bad parameter was detected
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if the device is not up.
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetDiscoverability (UINT16 inq_mode, UINT16 window, UINT16 interval)
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8        scan_mode = 0;
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16       service_class;
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8       *p_cod;
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8        major, minor;
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    DEV_CLASS    cod;
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    LAP          temp_lap[2];
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN      is_limited;
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN      cod_limited;
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetDiscoverability");
1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && BLE_INCLUDED == TRUE)
17530e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (controller_get_interface()->supports_ble())
1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1773aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        if (btm_ble_set_discoverability((UINT16)(inq_mode))
1783aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                            == BTM_SUCCESS)
1793aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        {
1803aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach            btm_cb.btm_inq_vars.discoverable_mode &= (~BTM_BLE_DISCOVERABLE_MASK);
181819a24084c0fd90d56e54653b4b286e085037da6Mudumba Ananth            btm_cb.btm_inq_vars.discoverable_mode |= (inq_mode & BTM_BLE_DISCOVERABLE_MASK);
1823aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        }
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    inq_mode &= ~BTM_BLE_DISCOVERABLE_MASK;
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Check mode parameter ***/
1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (inq_mode > BTM_MAX_DISCOVERABLE)
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_ILLEGAL_VALUE);
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure the controller is active */
19230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->get_is_ready())
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_DEV_RESET);
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the window and/or interval is '0', set to default values */
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!window)
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        window = BTM_DEFAULT_DISC_WINDOW;
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!interval)
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        interval = BTM_DEFAULT_DISC_INTERVAL;
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetDiscoverability: mode %d [NonDisc-0, Lim-1, Gen-2], window 0x%04x, interval 0x%04x",
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        inq_mode, window, interval);
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Check for valid window and interval parameters ***/
2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Only check window and duration if mode is connectable ***/
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (inq_mode != BTM_NON_DISCOVERABLE)
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* window must be less than or equal to interval */
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (window < HCI_MIN_INQUIRYSCAN_WINDOW     ||
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            window > HCI_MAX_INQUIRYSCAN_WINDOW     ||
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            interval < HCI_MIN_INQUIRYSCAN_INTERVAL ||
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            interval > HCI_MAX_INQUIRYSCAN_INTERVAL ||
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            window > interval)
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (BTM_ILLEGAL_VALUE);
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Set the IAC if needed */
2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (inq_mode != BTM_NON_DISCOVERABLE)
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (inq_mode & BTM_LIMITED_DISCOVERABLE)
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Use the GIAC and LIAC codes for limited discoverable mode */
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (temp_lap[0], limited_inq_lap, LAP_LEN);
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (temp_lap[1], general_inq_lap, LAP_LEN);
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!btsnd_hcic_write_cur_iac_lap (2, (LAP * const) temp_lap))
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (BTM_NO_RESOURCES);  /* Cannot continue */
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!btsnd_hcic_write_cur_iac_lap (1, (LAP * const) &general_inq_lap))
2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (BTM_NO_RESOURCES);  /* Cannot continue */
2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        scan_mode |= HCI_INQUIRY_SCAN_ENABLED;
2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Send down the inquiry scan window and period if changed */
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((window != btm_cb.btm_inq_vars.inq_scan_window) ||
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (interval != btm_cb.btm_inq_vars.inq_scan_period))
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btsnd_hcic_write_inqscan_cfg (interval, window))
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.btm_inq_vars.inq_scan_window = window;
2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_cb.btm_inq_vars.inq_scan_period = interval;
2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (BTM_NO_RESOURCES);
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.btm_inq_vars.connectable_mode & BTM_CONNECTABLE_MASK)
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        scan_mode |= HCI_PAGE_SCAN_ENABLED;
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_write_scan_enable (scan_mode))
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.discoverable_mode &= (~BTM_DISCOVERABLE_MASK);
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.discoverable_mode |= inq_mode;
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_NO_RESOURCES);
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Change the service class bit if mode has changed */
2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_cod = BTM_ReadDeviceClass();
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_COD_SERVICE_CLASS(service_class, p_cod);
2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    is_limited = (inq_mode & BTM_LIMITED_DISCOVERABLE) ? TRUE : FALSE;
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    cod_limited = (service_class & BTM_COD_SERVICE_LMTD_DISCOVER) ? TRUE : FALSE;
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (is_limited ^ cod_limited)
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_COD_MINOR_CLASS(minor, p_cod );
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_COD_MAJOR_CLASS(major, p_cod );
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_limited)
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_class |= BTM_COD_SERVICE_LMTD_DISCOVER;
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            service_class &= ~BTM_COD_SERVICE_LMTD_DISCOVER;
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        FIELDS_TO_COD(cod, minor, major, service_class);
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (void) BTM_SetDeviceClass (cod);
2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (BTM_SUCCESS);
2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetInquiryScanType
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the iquiry scan-type to
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  standard or interlaced.
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS if successful
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MODE_UNSUPPORTED if not a 1.2 device
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if the device is not up.
2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetInquiryScanType (UINT16 scan_type)
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3015344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetInquiryScanType");
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (scan_type != BTM_SCAN_TYPE_STANDARD && scan_type != BTM_SCAN_TYPE_INTERLACED)
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_ILLEGAL_VALUE);
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* whatever app wants if device is not 1.2 scan type should be STANDARD */
30630e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_interlaced_inquiry_scan())
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     return (BTM_MODE_UNSUPPORTED);
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check for scan type if configuration has been changed */
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (scan_type != btm_cb.btm_inq_vars.inq_scan_type)
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_IsDeviceUp())
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btsnd_hcic_write_inqscan_type ((UINT8)scan_type))
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.btm_inq_vars.inq_scan_type = scan_type;
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (BTM_NO_RESOURCES);
3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else return (BTM_WRONG_MODE);
3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (BTM_SUCCESS);
3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetPageScanType
3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the page scan-type to
3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  standard or interlaced.
3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS if successful
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MODE_UNSUPPORTED if not a 1.2 device
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if the device is not up.
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetPageScanType (UINT16 scan_type)
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3385344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPageScanType");
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (scan_type != BTM_SCAN_TYPE_STANDARD && scan_type != BTM_SCAN_TYPE_INTERLACED)
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_ILLEGAL_VALUE);
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* whatever app wants if device is not 1.2 scan type should be STANDARD */
34330e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->supports_interlaced_inquiry_scan())
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     return (BTM_MODE_UNSUPPORTED);
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check for scan type if configuration has been changed */
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (scan_type != btm_cb.btm_inq_vars.page_scan_type)
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (BTM_IsDeviceUp())
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btsnd_hcic_write_pagescan_type ((UINT8)scan_type))
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.btm_inq_vars.page_scan_type  = scan_type;
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (BTM_NO_RESOURCES);
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else return (BTM_WRONG_MODE);
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (BTM_SUCCESS);
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetInquiryMode
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set standard or with RSSI
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mode of the inquiry for local device.
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Output Params:   mode - standard, with RSSI, extended
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS if successful
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if couldn't get a memory pool buffer
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_ILLEGAL_VALUE if a bad parameter was detected
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if the device is not up.
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetInquiryMode (UINT8 mode)
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
37930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    const controller_t *controller = controller_get_interface();
3805344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetInquiryMode");
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (mode == BTM_INQ_RESULT_STANDARD)
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* mandatory mode */
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (mode == BTM_INQ_RESULT_WITH_RSSI)
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
38730e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson        if (!controller->supports_rssi_with_inquiry_results())
38830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson            return (BTM_MODE_UNSUPPORTED);
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (mode == BTM_INQ_RESULT_EXTENDED)
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
39230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson        if (!controller->supports_extended_inquiry_response())
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (BTM_MODE_UNSUPPORTED);
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_ILLEGAL_VALUE);
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_IsDeviceUp())
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_WRONG_MODE);
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_write_inquiry_mode (mode))
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_NO_RESOURCES);
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (BTM_SUCCESS);
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadDiscoverability
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the current discoverability
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mode of the device.
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Output Params:   p_window - current inquiry scan duration
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_interval - current inquiry scan interval
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_NON_DISCOVERABLE, BTM_LIMITED_DISCOVERABLE, or
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_GENERAL_DISCOVERABLE
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_ReadDiscoverability (UINT16 *p_window, UINT16 *p_interval)
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4235344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_ReadDiscoverability");
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_window)
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_window = btm_cb.btm_inq_vars.inq_scan_window;
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_interval)
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_interval = btm_cb.btm_inq_vars.inq_scan_period;
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (btm_cb.btm_inq_vars.discoverable_mode);
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetPeriodicInquiryMode
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the device periodic inquiry mode.
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  If the duration is zero, the periodic inquiry mode is cancelled.
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Note: We currently do not allow concurrent inquiry and periodic inquiry.
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_inqparms - pointer to the inquiry information
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      mode - GENERAL or LIMITED inquiry
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      duration - length in 1.28 sec intervals (If '0', the inquiry is CANCELLED)
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      max_resps - maximum amount of devices to search for before ending the inquiry
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      filter_cond_type - BTM_CLR_INQUIRY_FILTER, BTM_FILTER_COND_DEVICE_CLASS, or
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                         BTM_FILTER_COND_BD_ADDR
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      filter_cond - value for the filter (based on filter_cond_type)
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  max_delay - maximum amount of time between successive inquiries
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  min_delay - minimum amount of time between successive inquiries
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_results_cb - callback returning pointer to results (tBTM_INQ_RESULTS)
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_CMD_STARTED if successfully started
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_ILLEGAL_VALUE if a bad parameter is detected
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if could not allocate a message buffer
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_SUCCESS - if cancelling the periodic inquiry
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY - if an inquiry is already active
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if the device is not up.
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetPeriodicInquiryMode (tBTM_INQ_PARMS *p_inqparms, UINT16 max_delay,
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                        UINT16 min_delay, tBTM_INQ_RESULTS_CB *p_results_cb)
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS  status;
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4695344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetPeriodicInquiryMode: mode: %d, dur: %d, rsps: %d, flt: %d, min: %d, max: %d",
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps,
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inqparms->filter_cond_type, min_delay, max_delay);
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Make sure the device is ready ***/
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_IsDeviceUp())
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_WRONG_MODE);
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Only one active inquiry is allowed in this implementation.
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       Also do not allow an inquiry if the inquiry filter is being updated */
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->inq_active || p_inq->inqfilt_active)
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_BUSY);
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If illegal parameters return FALSE */
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inqparms->mode != BTM_GENERAL_INQUIRY &&
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inqparms->mode != BTM_LIMITED_INQUIRY)
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_ILLEGAL_VALUE);
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Verify the parameters for this command */
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inqparms->duration < BTM_MIN_INQUIRY_LEN     ||
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inqparms->duration > BTM_MAX_INQUIRY_LENGTH  ||
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        min_delay <= p_inqparms->duration              ||
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        min_delay < BTM_PER_INQ_MIN_MIN_PERIOD         ||
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        min_delay > BTM_PER_INQ_MAX_MIN_PERIOD         ||
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        max_delay <= min_delay                         ||
494ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        max_delay < BTM_PER_INQ_MIN_MAX_PERIOD)
495ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /*       max_delay > BTM_PER_INQ_MAX_MAX_PERIOD)*/
496ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /*  BTM_PER_INQ_MAX_MAX_PERIOD set to 1's in all bits. Condition resulting in false always*/
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_ILLEGAL_VALUE);
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the inquiry parameters to be used upon the completion of setting/clearing the inquiry filter */
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->inqparms = *p_inqparms;
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->per_min_delay = min_delay;
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->per_max_delay = max_delay;
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->inq_cmpl_info.num_resp = 0;         /* Clear the results counter */
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->p_inq_results_cb = p_results_cb;
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->inq_active = (UINT8)((p_inqparms->mode == BTM_LIMITED_INQUIRY) ?
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            (BTM_LIMITED_INQUIRY_ACTIVE | BTM_PERIODIC_INQUIRY_ACTIVE) :
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            (BTM_GENERAL_INQUIRY_ACTIVE | BTM_PERIODIC_INQUIRY_ACTIVE));
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If a filter is specified, then save it for later and clear the current filter.
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       The setting of the filter is done upon completion of clearing of the previous
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       filter.
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inqparms->filter_cond_type != BTM_CLR_INQUIRY_FILTER)
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->state = BTM_INQ_CLR_FILT_STATE;
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inqparms->filter_cond_type = BTM_CLR_INQUIRY_FILTER;
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else    /* The filter is not being used so simply clear it; the inquiry can start after this operation */
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->state = BTM_INQ_SET_FILT_STATE;
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Before beginning the inquiry the current filter must be cleared, so initiate the command */
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((status = btm_set_inq_event_filter (p_inqparms->filter_cond_type, &p_inqparms->filter_cond)) != BTM_CMD_STARTED)
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If set filter command is not succesful reset the state */
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->p_inq_results_cb = NULL;
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->state = BTM_INQ_INACTIVE_STATE;
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (status);
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_CancelPeriodicInquiry
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function cancels a periodic inquiry
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if could not allocate a message buffer
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_SUCCESS - if cancelling the periodic inquiry
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if the device is not up.
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_CancelPeriodicInquiry(void)
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS          status = BTM_SUCCESS;
5535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_CancelPeriodicInquiry called");
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Make sure the device is ready ***/
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_IsDeviceUp())
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_WRONG_MODE);
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Only cancel if one is active */
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.btm_inq_vars.inq_active & BTM_PERIODIC_INQUIRY_ACTIVE)
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.inq_active = BTM_INQUIRY_INACTIVE;
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.p_inq_results_cb = (tBTM_INQ_RESULTS_CB *) NULL;
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_exit_per_inq ())
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_NO_RESOURCES;
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the event filter is in progress, mark it so that the processing of the return
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           event will be ignored */
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(p_inq->inqfilt_active)
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->pending_filt_complete_event++;
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->inqfilt_active = FALSE;
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->inq_counter++;
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (status);
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_SetConnectability
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the device into or out of
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  connectable mode. Discoverable mode means page scans enabled.
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS if successful
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_ILLEGAL_VALUE if a bad parameter is detected
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if could not allocate a message buffer
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if the device is not up.
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_SetConnectability (UINT16 page_mode, UINT16 window, UINT16 interval)
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    scan_mode = 0;
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetConnectability");
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE && BLE_INCLUDED == TRUE)
60230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (controller_get_interface()->supports_ble())
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6043aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        if (btm_ble_set_connectability(page_mode) != BTM_SUCCESS)
6053aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        {
6063aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach            return BTM_NO_RESOURCES;
6073aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        }
6083aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        p_inq->connectable_mode &= (~BTM_BLE_CONNECTABLE_MASK);
6093aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        p_inq->connectable_mode |= (page_mode & BTM_BLE_CONNECTABLE_MASK);
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    page_mode &= ~BTM_BLE_CONNECTABLE_MASK;
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Check mode parameter ***/
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (page_mode != BTM_NON_CONNECTABLE && page_mode != BTM_CONNECTABLE)
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_ILLEGAL_VALUE);
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure the controller is active */
61930e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (!controller_get_interface()->get_is_ready())
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_DEV_RESET);
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the window and/or interval is '0', set to default values */
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!window)
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        window = BTM_DEFAULT_CONN_WINDOW;
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!interval)
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        interval = BTM_DEFAULT_CONN_INTERVAL;
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_SetConnectability: mode %d [NonConn-0, Conn-1], window 0x%04x, interval 0x%04x",
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        page_mode, window, interval);
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Check for valid window and interval parameters ***/
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Only check window and duration if mode is connectable ***/
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (page_mode == BTM_CONNECTABLE)
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* window must be less than or equal to interval */
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (window < HCI_MIN_PAGESCAN_WINDOW     ||
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            window > HCI_MAX_PAGESCAN_WINDOW     ||
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            interval < HCI_MIN_PAGESCAN_INTERVAL ||
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            interval > HCI_MAX_PAGESCAN_INTERVAL ||
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            window > interval)
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (BTM_ILLEGAL_VALUE);
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        scan_mode |= HCI_PAGE_SCAN_ENABLED;
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((window != p_inq->page_scan_window) ||
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (interval != p_inq->page_scan_period))
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->page_scan_window = window;
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->page_scan_period = interval;
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_write_pagescan_cfg (interval, window))
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (BTM_NO_RESOURCES);
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Keep the inquiry scan as previouosly set */
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->discoverable_mode & BTM_DISCOVERABLE_MASK)
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        scan_mode |= HCI_INQUIRY_SCAN_ENABLED;
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_write_scan_enable (scan_mode))
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->connectable_mode &= (~BTM_CONNECTABLE_MASK);
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->connectable_mode |= page_mode;
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_SUCCESS);
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (BTM_NO_RESOURCES);
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadConnectability
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to read the current discoverability
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mode of the device.
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Output Params    p_window - current page scan duration
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_interval - current time between page scans
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_NON_CONNECTABLE or BTM_CONNECTABLE
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_ReadConnectability (UINT16 *p_window, UINT16 *p_interval)
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_ReadConnectability");
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_window)
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_window = btm_cb.btm_inq_vars.page_scan_window;
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_interval)
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_interval = btm_cb.btm_inq_vars.page_scan_period;
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (btm_cb.btm_inq_vars.connectable_mode);
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_IsInquiryActive
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function returns a bit mask of the current inquiry state
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_INQUIRY_INACTIVE if inactive (0)
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_LIMITED_INQUIRY_ACTIVE if a limted inquiry is active
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_GENERAL_INQUIRY_ACTIVE if a general inquiry is active
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_PERIODIC_INQUIRY_ACTIVE if a periodic inquiry is active
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT16 BTM_IsInquiryActive (void)
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7145344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_IsInquiryActive");
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return(btm_cb.btm_inq_vars.inq_active);
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_CancelInquiry
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function cancels an inquiry if active
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS if successful
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if could not allocate a message buffer
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if the device is not up.
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_CancelInquiry(void)
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS           status = BTM_SUCCESS;
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
7367f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
7377f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    UINT8 active_mode=p_inq->inq_active;
7387f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
7395344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_CancelInquiry called");
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Make sure the device is ready ***/
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_IsDeviceUp())
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_WRONG_MODE);
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Only cancel if not in periodic mode, otherwise the caller should call BTM_CancelPeriodicMode */
746ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_inq->inq_active &BTM_INQUIRY_ACTIVE_MASK) != 0 &&
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (!(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE)))
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->inq_active = BTM_INQUIRY_INACTIVE;
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->state = BTM_INQ_INACTIVE_STATE;
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->p_inq_results_cb = (tBTM_INQ_RESULTS_CB *) NULL; /* Do not notify caller anymore */
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->p_inq_cmpl_cb = (tBTM_CMPL_CB *) NULL;    /* Do not notify caller anymore */
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the event filter is in progress, mark it so that the processing of the return
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            event will be ignored */
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_inq->inqfilt_active)
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->inqfilt_active = FALSE;
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->pending_filt_complete_event++;
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         /* Initiate the cancel inquiry */
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7647f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            if (((p_inq->inqparms.mode & BTM_BR_INQUIRY_MASK) != 0)
7657f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
7667f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            &&(active_mode & BTM_BR_INQUIRY_MASK)
7677f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
7687f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            )
769ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
770ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (!btsnd_hcic_inq_cancel())
771ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    status = BTM_NO_RESOURCES;
772ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
7747f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            if (((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0)
7757f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
7767fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            &&(active_mode & BTM_BLE_INQ_ACTIVE_MASK)
7777f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
7787f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            )
7797fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                btm_ble_stop_inquiry();
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Do not send the BUSY_LEVEL event yet. Wait for the cancel_complete event
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * and then send the BUSY_LEVEL event
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT);
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         */
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7880830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora         p_inq->inq_counter++;
7890830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora         btm_clr_inq_result_flt();
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (status);
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_StartInquiry
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start an inquiry.
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters:      p_inqparms - pointer to the inquiry information
803ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta**                      mode - GENERAL or LIMITED inquiry, BR/LE bit mask seperately
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      duration - length in 1.28 sec intervals (If '0', the inquiry is CANCELLED)
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      max_resps - maximum amount of devices to search for before ending the inquiry
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      filter_cond_type - BTM_CLR_INQUIRY_FILTER, BTM_FILTER_COND_DEVICE_CLASS, or
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                         BTM_FILTER_COND_BD_ADDR
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      filter_cond - value for the filter (based on filter_cond_type)
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_results_cb   - Pointer to the callback routine which gets called
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                upon receipt of an inquiry result. If this field is
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                NULL, the application is not notified.
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_cmpl_cb   - Pointer to the callback routine which gets called
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                upon completion.  If this field is NULL, the
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                application is not notified when completed.
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tBTM_STATUS
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_CMD_STARTED if successfully initiated
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY if already in progress
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_ILLEGAL_VALUE if parameter(s) are out of range
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if could not allocate resources to start the command
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if the device is not up.
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_StartInquiry (tBTM_INQ_PARMS *p_inqparms, tBTM_INQ_RESULTS_CB *p_results_cb,
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              tBTM_CMPL_CB *p_cmpl_cb)
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
828ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_STATUS  status = BTM_CMD_STARTED;
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8315344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_StartInquiry: mode: %d, dur: %d, rsps: %d, flt: %d",
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_inqparms->mode, p_inqparms->duration, p_inqparms->max_resps,
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_inqparms->filter_cond_type);
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Only one active inquiry is allowed in this implementation.
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       Also do not allow an inquiry if the inquiry filter is being updated */
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->inq_active || p_inq->inqfilt_active)
8380830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora    {
8390830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
8400830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        /*check if LE observe is already running*/
8410830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        if(p_inq->scan_type==INQ_LE_OBSERVE && p_inq->p_inq_ble_results_cb!=NULL)
8420830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        {
8435344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_StartInquiry: LE observe in progress");
8440830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora            p_inq->scan_type = INQ_GENERAL;
8450830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora            p_inq->inq_active = BTM_INQUIRY_INACTIVE;
8460830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora            btm_cb.ble_ctr_cb.inq_var.scan_type = BTM_BLE_SCAN_MODE_NONE;
8470830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora            btsnd_hcic_ble_set_scan_enable (BTM_BLE_SCAN_DISABLE, BTM_BLE_DUPLICATE_ENABLE);
8480830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        }
8490830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        else
8500830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora#endif
8510830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        {
8520830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora            return (BTM_BUSY);
8535344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM_StartInquiry: return BUSY");
8540830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        }
8550830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora    }
8560830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora    else
8570830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        p_inq->scan_type = INQ_GENERAL;
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /*** Make sure the device is ready ***/
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_IsDeviceUp())
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_WRONG_MODE);
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_inqparms->mode & BTM_BR_INQUIRY_MASK)!= BTM_GENERAL_INQUIRY &&
864ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        (p_inqparms->mode & BTM_BR_INQUIRY_MASK)!= BTM_LIMITED_INQUIRY
865ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (BLE_INCLUDED == TRUE)
866ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        && (p_inqparms->mode & BTM_BLE_INQUIRY_MASK)!= BTM_BLE_GENERAL_INQUIRY
867ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        && (p_inqparms->mode & BTM_BLE_INQUIRY_MASK)!= BTM_BLE_LIMITED_INQUIRY
868ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
869ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        )
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_ILLEGAL_VALUE);
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8727f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
8737f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        if(p_inq->next_state==BTM_FINISH)
8747f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            return BTM_ILLEGAL_VALUE;
8757f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
8767f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
8777f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save the inquiry parameters to be used upon the completion of setting/clearing the inquiry filter */
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->inqparms = *p_inqparms;
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Initialize the inquiry variables */
8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->state = BTM_INQ_ACTIVE_STATE;
8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->p_inq_cmpl_cb = p_cmpl_cb;
8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->p_inq_results_cb = p_results_cb;
8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->inq_cmpl_info.num_resp = 0;         /* Clear the results counter */
886ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    p_inq->inq_active = p_inqparms->mode;
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8885344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG("BTM_StartInquiry: p_inq->inq_active = 0x%02x", p_inq->inq_active);
8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8907f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie/* interleave scan minimal conditions */
8917f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (BLE_INCLUDED==TRUE && (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE))
8927f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
8937f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    /* check if both modes are present */
8947f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    if((p_inqparms->mode & BTM_BLE_INQUIRY_MASK) && (p_inqparms->mode & BTM_BR_INQUIRY_MASK))
8957f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    {
8965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_API("BTM:Interleave Inquiry Mode Set");
8977f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        p_inqparms->duration=p_inqparms->intl_duration[p_inq->next_state];
8987f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        p_inq->inqparms.duration=p_inqparms->duration;
8997f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    }
9007f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    else
9017f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    {
9025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_API("BTM:Single Mode: No interleaving, Mode:0x%02x", p_inqparms->mode);
9037f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        p_inq->next_state=BTM_NO_INTERLEAVING;
9047f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    }
9057f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
9067f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
9077f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
9087f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* start LE inquiry here if requested */
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
9117f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    if ((p_inqparms->mode & BTM_BLE_INQUIRY_MASK)
9127f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
9137f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        &&(p_inq->next_state==BTM_BLE_ONE || p_inq->next_state==BTM_BLE_TWO ||
9147f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie           p_inq->next_state==BTM_NO_INTERLEAVING)
9157f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
9167f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        )
9177f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9197f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
9207f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        p_inq->inq_active = (p_inqparms->mode & BTM_BLE_INQUIRY_MASK);
9215344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_API("BTM:Starting LE Scan with duration %d and activeMode:0x%02x",
9227f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie                       p_inqparms->duration, (p_inqparms->mode & BTM_BLE_INQUIRY_MASK));
9237f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
92430e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson        if (!controller_get_interface()->supports_ble())
9253aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        {
9263aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach            p_inq->inqparms.mode &= ~ BTM_BLE_INQUIRY_MASK;
9273aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach            status = BTM_ILLEGAL_VALUE;
9283aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        }
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* BLE for now does not support filter condition for inquiry */
9303aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach        else if ((status = btm_ble_start_inquiry((UINT8)(p_inqparms->mode & BTM_BLE_INQUIRY_MASK),
9313aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach                                            p_inqparms->duration)) != BTM_CMD_STARTED)
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_ERROR("Err Starting LE Inquiry.");
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->inqparms.mode &= ~ BTM_BLE_INQUIRY_MASK;
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9367f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (!defined(BTA_HOST_INTERLEAVE_SEARCH) || BTA_HOST_INTERLEAVE_SEARCH == FALSE)
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inqparms->mode &= ~BTM_BLE_INQUIRY_MASK;
9387f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
9397f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
9407f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
9417f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        if(p_inq->next_state==BTM_NO_INTERLEAVING)
9427f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        {
9437f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            p_inq->next_state=BTM_FINISH;
9447f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        }
9457f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        else
9467f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        {
9475344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM:Interleaving: started LE scan, Advancing to next state: %d",
9487f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie                           p_inq->next_state+1);
9497f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            p_inq->next_state+=1;
9507f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        }
9517f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        /* reset next_state if status <> BTM_Started */
9527f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        if(status!=BTM_CMD_STARTED)
9537f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            p_inq->next_state=BTM_BR_ONE;
9547f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
9557f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        /* if interleave scan..return here */
9567f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        return status;
9577f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
9587f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9605344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_DEBUG("BTM_StartInquiry: mode = %02x", p_inqparms->mode);
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* end of BLE_INCLUDED */
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
964ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* we're done with this routine if BR/EDR inquiry is not desired. */
965ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if ((p_inqparms->mode & BTM_BR_INQUIRY_MASK) == BTM_INQUIRY_NONE)
966ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta        return status;
967ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
9687f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    /* BR/EDR inquiry portion */
9697f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
9707f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    if((p_inq->next_state==BTM_BR_ONE || p_inq->next_state==BTM_BR_TWO ||
9717f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        p_inq->next_state==BTM_NO_INTERLEAVING ))
9727f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    {
9737f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        p_inq->inq_active = (p_inqparms->mode & BTM_BR_INQUIRY_MASK);
9747f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If a filter is specified, then save it for later and clear the current filter.
9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       The setting of the filter is done upon completion of clearing of the previous
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       filter.
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_inqparms->filter_cond_type)
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_CLR_INQUIRY_FILTER:
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->state = BTM_INQ_SET_FILT_STATE;
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_FILTER_COND_DEVICE_CLASS:
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_FILTER_COND_BD_ADDR:
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* The filter is not being used so simply clear it;
9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            the inquiry can start after this operation */
9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->state = BTM_INQ_CLR_FILT_STATE;
9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inqparms->filter_cond_type = BTM_CLR_INQUIRY_FILTER;
9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* =============>>>> adding LE filtering here ????? */
9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_ILLEGAL_VALUE);
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Before beginning the inquiry the current filter must be cleared, so initiate the command */
9997f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    if ((status = btm_set_inq_event_filter (p_inqparms->filter_cond_type,
10007f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie                                            &p_inqparms->filter_cond)) != BTM_CMD_STARTED)
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->state = BTM_INQ_INACTIVE_STATE;
10027f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
10037f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
10047f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        if (p_inq->next_state==BTM_NO_INTERLEAVING)
10057f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            p_inq->next_state=BTM_FINISH;
10067f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        else
10077f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        {
10085344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_API("BTM:Interleaving: Started BTM inq, Advancing to next state: %d",
10097f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie                           p_inq->next_state+1);
10107f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            p_inq->next_state+=1;
10117f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        }
10127f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie     }
10137f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie     if (status!=BTM_CMD_STARTED)
10147f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie     {
10157f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie         /* Some error beginning the scan process.
10167f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie            Reset the next_state parameter.. Do we need to reset the inq_active also?
10177f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie         */
10185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_API("BTM:Interleaving: Error in Starting inquiry, status: 0x%02x", status);
10197f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        p_inq->next_state=BTM_BR_ONE;
10207f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie     }
10217f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
10227f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
10237f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (status);
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadRemoteDeviceName
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function initiates a remote device HCI command to the
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  controller and calls the callback when the process has completed.
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Params:    remote_bda      - device address of name to retrieve
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_cb            - callback function called when BTM_CMD_STARTED
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                    is returned.
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                    A pointer to tBTM_REMOTE_DEV_NAME is passed to the
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                    callback.
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_CMD_STARTED is returned if the request was successfully sent
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  to HCI.
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY if already in progress
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_UNKNOWN_ADDR if device address is bad
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if could not allocate resources to start the command
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if the device is not up.
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10507fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi BattatBTM_STATUS  BTM_ReadRemoteDeviceName (BD_ADDR remote_bda, tBTM_CMPL_CB *p_cb
10517fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                                                ,tBT_TRANSPORT transport)
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_INFO   *p_cur = NULL;
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tINQ_DB_ENT     *p_i;
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10565344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_ReadRemoteDeviceName: bd addr [%02x%02x%02x%02x%02x%02x]",
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               remote_bda[0], remote_bda[1], remote_bda[2],
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               remote_bda[3], remote_bda[4], remote_bda[5]);
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Use the remote device's clock offset if it is in the local inquiry database */
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_i = btm_inq_db_find (remote_bda)) != NULL)
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cur = &p_i->inq_info;
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10655344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("no device found in inquiry db");
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE)
10687fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta    if (transport == BT_TRANSPORT_LE)
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return btm_ble_read_remote_name(remote_bda, p_cur, p_cb);
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (btm_initiate_rem_name (remote_bda, p_cur, BTM_RMT_NAME_EXT,
107678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                   BTM_EXT_RMT_NAME_TIMEOUT_MS, p_cb));
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_CancelRemoteDeviceName
10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function initiates the cancel request for the specified
10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  remote device.
10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Params:    None
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_CMD_STARTED is returned if the request was successfully sent
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                  to HCI.
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if could not allocate resources to start the command
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if there is not an active remote name request.
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS  BTM_CancelRemoteDeviceName (void)
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10995344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_CancelRemoteDeviceName()");
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure there is not already one in progress */
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->remname_active)
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
11056975b4d711142b885af479721cada448952c6b41Andre Eisenbach        if (BTM_UseLeLink(p_inq->remname_bda))
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_ble_cancel_remote_name(p_inq->remname_bda))
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (BTM_CMD_STARTED);
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (BTM_UNKNOWN_ADDR);
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btsnd_hcic_rmt_name_req_cancel (p_inq->remname_bda))
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (BTM_CMD_STARTED);
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (BTM_NO_RESOURCES);
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_WRONG_MODE);
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_InqDbRead
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function looks through the inquiry database for a match
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  based on Bluetooth Device Address. This is the application's
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  interface to get the inquiry details of a specific BD address.
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to entry, or NULL if not found
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_INQ_INFO *BTM_InqDbRead (BD_ADDR p_bda)
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11365344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API ("BTM_InqDbRead: bd addr [%02x%02x%02x%02x%02x%02x]",
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               p_bda[0], p_bda[1], p_bda[2], p_bda[3], p_bda[4], p_bda[5]);
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11398d10e49089edbfebfc1e72227a59626440983a83Zach Johnson    tINQ_DB_ENT *p_ent = btm_inq_db_find(p_bda);
11408d10e49089edbfebfc1e72227a59626440983a83Zach Johnson    if (!p_ent)
11418d10e49089edbfebfc1e72227a59626440983a83Zach Johnson      return NULL;
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11438d10e49089edbfebfc1e72227a59626440983a83Zach Johnson    return &p_ent->inq_info;
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_InqDbFirst
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function looks through the inquiry database for the first
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  used entry, and returns that. This is used in conjunction with
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_InqDbNext by applications as a way to walk through the
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  inquiry database.
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to first in-use entry, or NULL if DB is empty
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_INQ_INFO *BTM_InqDbFirst (void)
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16       xx;
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tINQ_DB_ENT  *p_ent = btm_cb.btm_inq_vars.inq_db;
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++)
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ent->in_use)
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (&p_ent->inq_info);
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, no used entry found */
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return ((tBTM_INQ_INFO *)NULL);
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_InqDbNext
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function looks through the inquiry database for the next
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  used entry, and returns that.  If the input parameter is NULL,
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the first entry is returned.
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to next in-use entry, or NULL if no more found.
11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_INQ_INFO *BTM_InqDbNext (tBTM_INQ_INFO *p_cur)
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tINQ_DB_ENT  *p_ent;
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16        inx;
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cur)
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_ent = (tINQ_DB_ENT *) ((UINT8 *)p_cur - offsetof (tINQ_DB_ENT, inq_info));
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        inx = (UINT16)((p_ent - btm_cb.btm_inq_vars.inq_db) + 1);
11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (p_ent = &btm_cb.btm_inq_vars.inq_db[inx]; inx < BTM_INQ_DB_SIZE; inx++, p_ent++)
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_ent->in_use)
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return (&p_ent->inq_info);
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If here, more entries found */
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return ((tBTM_INQ_INFO *)NULL);
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_InqDbFirst());
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ClearInqDb
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to clear out a device or all devices
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the inquiry database.
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        p_bda - (input) BD_ADDR ->  Address of device to clear
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                              (NULL clears all entries)
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_BUSY if an inquiry, get remote name, or event filter
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          is active, otherwise BTM_SUCCESS
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ClearInqDb (BD_ADDR p_bda)
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST     *p_inq = &btm_cb.btm_inq_vars;
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If an inquiry or remote name is in progress return busy */
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->inq_active != BTM_INQUIRY_INACTIVE ||
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->inqfilt_active)
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_BUSY);
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_clr_inq_db(p_bda);
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (BTM_SUCCESS);
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_ReadInquiryRspTxPower
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This command will read the inquiry Transmit Power level used
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  to transmit the FHS and EIR data packets.
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This can be used directly in the Tx Power Level EIR data type.
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS if successful
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_ReadInquiryRspTxPower (tBTM_CMPL_CB *p_cb)
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
125178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    if (btm_cb.devcb.p_inq_tx_power_cmpl_cb)
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_BUSY);
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
125478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    btm_cb.devcb.p_inq_tx_power_cmpl_cb = p_cb;
125578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_set_on_queue(btm_cb.devcb.read_inq_tx_power_timer,
125678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       BTM_INQ_REPLY_TIMEOUT_MS,
125778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       btm_read_inq_tx_power_timeout, NULL,
125878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       btu_general_alarm_queue);
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!btsnd_hcic_read_inq_tx_power ())
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
126278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        btm_cb.devcb.p_inq_tx_power_cmpl_cb = NULL;
126378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_cancel(btm_cb.devcb.read_inq_tx_power_timer);
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_NO_RESOURCES);
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_CMD_STARTED);
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*********************************************************************************
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**********************************************************************************
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                                                              **
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      BTM Internal Inquiry Functions                          **
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                                                              **
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**********************************************************************************
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*********************************************************************************/
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_inq_db_reset
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called at at reset to clear the inquiry
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  database & pending callback.
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_inq_db_reset (void)
12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_REMOTE_DEV_NAME     rem_name;
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST     *p_inq = &btm_cb.btm_inq_vars;
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                    num_responses;
12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                    temp_inq_active;
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS              status;
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If an inquiry or periodic inquiry is active, reset the mode to inactive */
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->inq_active != BTM_INQUIRY_INACTIVE)
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        temp_inq_active = p_inq->inq_active;    /* Save so state can change BEFORE
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                       callback is called */
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->inq_active = BTM_INQUIRY_INACTIVE;
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If not a periodic inquiry, the complete callback must be called to notify caller */
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (temp_inq_active == BTM_LIMITED_INQUIRY_ACTIVE ||
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            temp_inq_active == BTM_GENERAL_INQUIRY_ACTIVE)
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_inq->p_inq_cmpl_cb)
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                num_responses = 0;
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*p_inq->p_inq_cmpl_cb)(&num_responses);
13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Cancel a remote name request if active, and notify the caller (if waiting) */
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->remname_active )
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
131778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_cancel(p_inq->remote_name_timer);
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->remname_active = FALSE;
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_inq->remname_bda, 0, BD_ADDR_LEN);
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_inq->p_remname_cmpl_cb)
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_name.status = BTM_DEV_RESET;
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_inq->p_remname_cmpl_cb)(&rem_name);
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->p_remname_cmpl_cb = NULL;
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Cancel an inquiry filter request if active, and notify the caller (if waiting) */
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->inqfilt_active)
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->inqfilt_active = FALSE;
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_inq->p_inqfilter_cmpl_cb)
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_DEV_RESET;
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (*p_inq->p_inqfilter_cmpl_cb)(&status);
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->state = BTM_INQ_INACTIVE_STATE;
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->pending_filt_complete_event = 0;
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->p_inq_results_cb = NULL;
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_clr_inq_db(NULL);   /* Clear out all the entries in the database */
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_clr_inq_result_flt();
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->discoverable_mode = BTM_NON_DISCOVERABLE;
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->connectable_mode  = BTM_NON_CONNECTABLE;
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->page_scan_type    = BTM_SCAN_TYPE_STANDARD;
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->inq_scan_type     = BTM_SCAN_TYPE_STANDARD;
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->discoverable_mode |= BTM_BLE_NON_DISCOVERABLE;
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->connectable_mode  |= BTM_BLE_NON_CONNECTABLE;
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return;
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*********************************************************************************
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_inq_db_init
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called at startup to initialize the inquiry
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  database.
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_inq_db_init (void)
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if 0  /* cleared in btm_init; put back in if called from anywhere else! */
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (&btm_cb.btm_inq_vars, 0, sizeof (tBTM_INQUIRY_VAR_ST));
13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
137678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_free(btm_cb.btm_inq_vars.remote_name_timer);
137778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    btm_cb.btm_inq_vars.remote_name_timer =
137878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_new("btm_inq.remote_name_timer");
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.btm_inq_vars.no_inc_ssp = BTM_NO_SSP_ON_INQUIRY;
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*********************************************************************************
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_inq_stop_on_ssp
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called on incoming SSP
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_inq_stop_on_ssp(void)
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 normal_active = (BTM_GENERAL_INQUIRY_ACTIVE|BTM_LIMITED_INQUIRY_ACTIVE);
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE)
13965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_inq_stop_on_ssp: no_inc_ssp=%d inq_active:0x%x state:%d inqfilt_active:%d",
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.no_inc_ssp, btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.btm_inq_vars.no_inc_ssp)
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_cb.btm_inq_vars.state == BTM_INQ_ACTIVE_STATE)
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btm_cb.btm_inq_vars.inq_active & BTM_PERIODIC_INQUIRY_ACTIVE)
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_CancelPeriodicInquiry();
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (btm_cb.btm_inq_vars.inq_active & normal_active)
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* can not call BTM_CancelInquiry() here. We need to report inquiry complete evt */
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_inq_cancel();
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* do not allow inquiry to start */
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.inq_active |= BTM_SSP_INQUIRY_ACTIVE;
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*********************************************************************************
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_inq_clear_ssp
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when pairing_state becomes idle
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_inq_clear_ssp(void)
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.btm_inq_vars.inq_active &= ~BTM_SSP_INQUIRY_ACTIVE;
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*********************************************************************************
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_clr_inq_db
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to clear out a device or all devices
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the inquiry database.
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameter        p_bda - (input) BD_ADDR ->  Address of device to clear
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                              (NULL clears all entries)
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_clr_inq_db (BD_ADDR p_bda)
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST     *p_inq = &btm_cb.btm_inq_vars;
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tINQ_DB_ENT             *p_ent = p_inq->inq_db;
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                   xx;
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE)
14525344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_clr_inq_db: inq_active:0x%x state:%d",
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state);
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++)
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ent->in_use)
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If this is the specified BD_ADDR or clearing all devices */
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_bda == NULL ||
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (!memcmp (p_ent->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN)))
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_ent->in_use = FALSE;
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE)
14685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("inq_active:0x%x state:%d",
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state);
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_clr_inq_result_flt
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function looks through the bdaddr database for a match
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  based on Bluetooth Device Address
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if found, else FALSE (new entry)
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_clr_inq_result_flt (void)
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1488abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov    osi_free_and_reset((void **)&p_inq->p_bd_db);
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->num_bd_entries = 0;
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->max_bd_entries = 0;
14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_inq_find_bdaddr
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function looks through the bdaddr database for a match
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  based on Bluetooth Device Address
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if found, else FALSE (new entry)
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btm_inq_find_bdaddr (BD_ADDR p_bda)
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tINQ_BDADDR         *p_db = &p_inq->p_bd_db[0];
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16       xx;
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Don't bother searching, database doesn't exist or periodic mode */
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) || !p_db)
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (FALSE);
15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < p_inq->num_bd_entries; xx++, p_db++)
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!memcmp(p_db->bd_addr, p_bda, BD_ADDR_LEN)
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && p_db->inq_count == p_inq->inq_counter)
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (TRUE);
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (xx < p_inq->max_bd_entries)
15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_db->inq_count = p_inq->inq_counter;
15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(p_db->bd_addr, p_bda, BD_ADDR_LEN);
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->num_bd_entries++;
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, New Entry */
15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (FALSE);
15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_inq_db_find
15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function looks through the inquiry database for a match
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  based on Bluetooth Device Address
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to entry, or NULL if not found
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttINQ_DB_ENT *btm_inq_db_find (BD_ADDR p_bda)
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16       xx;
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tINQ_DB_ENT  *p_ent = btm_cb.btm_inq_vars.inq_db;
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++)
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((p_ent->in_use) && (!memcmp (p_ent->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN)))
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_ent);
15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, not found */
15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (NULL);
15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_inq_db_new
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function looks through the inquiry database for an unused
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  entry. If no entry is free, it allocates the oldest entry.
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer to entry
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttINQ_DB_ENT *btm_inq_db_new (BD_ADDR p_bda)
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16       xx;
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tINQ_DB_ENT  *p_ent = btm_cb.btm_inq_vars.inq_db;
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tINQ_DB_ENT  *p_old = btm_cb.btm_inq_vars.inq_db;
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32       ot = 0xFFFFFFFF;
15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < BTM_INQ_DB_SIZE; xx++, p_ent++)
15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!p_ent->in_use)
15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset (p_ent, 0, sizeof (tINQ_DB_ENT));
15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy (p_ent->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN);
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_ent->in_use = TRUE;
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (p_ent);
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_ent->time_of_resp < ot)
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_old = p_ent;
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            ot    = p_ent->time_of_resp;
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If here, no free entry found. Return the oldest. */
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset (p_old, 0, sizeof (tINQ_DB_ENT));
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy (p_old->inq_info.results.remote_bd_addr, p_bda, BD_ADDR_LEN);
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_old->in_use = TRUE;
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return (p_old);
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_set_inq_event_filter
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to set the inquiry event filter.
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  It is called by either internally, or by the external API function
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  (BTM_SetInqEventFilter).  It is used internally as part of the
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  inquiry processing.
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Params:
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  filter_cond_type - this is the type of inquiry filter to apply:
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          BTM_FILTER_COND_DEVICE_CLASS,
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          BTM_FILTER_COND_BD_ADDR, or
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          BTM_CLR_INQUIRY_FILTER
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_filt_cond - this is either a BD_ADDR or DEV_CLASS depending on the
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                          filter_cond_type  (See section 4.7.3 of Core Spec 1.0b).
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_CMD_STARTED if successfully initiated
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if couldn't get a memory pool buffer
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_ILLEGAL_VALUE if a bad parameter was detected
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTM_STATUS btm_set_inq_event_filter (UINT8 filter_cond_type,
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                             tBTM_INQ_FILT_COND *p_filt_cond)
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    condition_length = DEV_CLASS_LEN * 2;
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8    condition_buf[DEV_CLASS_LEN * 2];
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_cond = condition_buf;                    /* points to the condition to pass to HCI */
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE)
16335344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_set_inq_event_filter: filter type %d [Clear-0, COD-1, BDADDR-2]",
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        filter_cond_type);
16355344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("                       condition [%02x%02x%02x %02x%02x%02x]",
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               p_filt_cond->bdaddr_cond[0], p_filt_cond->bdaddr_cond[1], p_filt_cond->bdaddr_cond[2],
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               p_filt_cond->bdaddr_cond[3], p_filt_cond->bdaddr_cond[4], p_filt_cond->bdaddr_cond[5]);
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Load the correct filter condition to pass to the lower layer */
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (filter_cond_type)
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_FILTER_COND_DEVICE_CLASS:
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* copy the device class and device class fields into contiguous memory to send to HCI */
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (condition_buf, p_filt_cond->cod_cond.dev_class, DEV_CLASS_LEN);
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy (&condition_buf[DEV_CLASS_LEN],
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_filt_cond->cod_cond.dev_class_mask, DEV_CLASS_LEN);
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* condition length should already be set as the default */
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_FILTER_COND_BD_ADDR:
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_cond = p_filt_cond->bdaddr_cond;
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* condition length should already be set as the default */
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTM_CLR_INQUIRY_FILTER:
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        condition_length = 0;
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_ILLEGAL_VALUE);     /* Bad parameter was passed in */
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_cb.btm_inq_vars.inqfilt_active = TRUE;
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Filter the inquiry results for the specified condition type and value */
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btsnd_hcic_set_event_filter(HCI_FILTER_INQUIRY_RESULT, filter_cond_type,
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                    p_cond, condition_length))
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_CMD_STARTED);
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_NO_RESOURCES);
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_event_filter_complete
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a set event filter has completed.
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  Note: This routine currently only handles inquiry filters.
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      Connection filters are ignored for now.
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_event_filter_complete (UINT8 *p)
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            hci_status;
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS      status;
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CMPL_CB   *p_cb = p_inq->p_inqfilter_cmpl_cb;
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE)
16975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_event_filter_complete: inq_active:0x%x state:%d inqfilt_active:%d",
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the filter complete event is from an old or cancelled request, ignore it */
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_inq->pending_filt_complete_event)
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->pending_filt_complete_event--;
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Only process the inquiry filter; Ignore the connection filter until it
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       is used by the upper layers */
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->inqfilt_active == TRUE )
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Extract the returned status from the buffer */
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8 (hci_status, p);
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (hci_status != HCI_SUCCESS)
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If standalone operation, return the error status; if embedded in the inquiry, continue the inquiry */
17165344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_WARNING ("BTM Warning: Set Event Filter Failed (HCI returned 0x%x)", hci_status);
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_ERR_PROCESSING;
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            status = BTM_SUCCESS;
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If the set filter was initiated externally (via BTM_SetInqEventFilter), call the
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           callback function to notify the initiator that it has completed */
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_inq->state == BTM_INQ_INACTIVE_STATE)
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->inqfilt_active = FALSE;
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cb)
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*p_cb) (&status);
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else    /* An inquiry is active (the set filter command was internally generated),
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   process the next state of the process (Set a new filter or start the inquiry). */
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(status != BTM_SUCCESS)
17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Process the inquiry complete (Error Status) */
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_process_inq_complete (BTM_ERR_PROCESSING, (UINT8)(p_inq->inqparms.mode & BTM_BR_INQUIRY_MASK));
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* btm_process_inq_complete() does not restore the following settings on periodic inquiry */
17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_inq->inqfilt_active = FALSE;
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_inq->inq_active = BTM_INQUIRY_INACTIVE;
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_inq->state = BTM_INQ_INACTIVE_STATE;
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Check to see if a new filter needs to be set up */
17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_inq->state == BTM_INQ_CLR_FILT_STATE)
17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((status = btm_set_inq_event_filter (p_inq->inqparms.filter_cond_type, &p_inq->inqparms.filter_cond)) == BTM_CMD_STARTED)
17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_inq->state = BTM_INQ_SET_FILT_STATE;
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else    /* Error setting the filter: Call the initiator's callback function to indicate a failure */
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_inq->inqfilt_active = FALSE;
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* Process the inquiry complete (Error Status) */
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btm_process_inq_complete (BTM_ERR_PROCESSING, (UINT8)(p_inq->inqparms.mode & BTM_BR_INQUIRY_MASK));
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else    /* Initiate the Inquiry or Periodic Inquiry */
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_inq->state = BTM_INQ_ACTIVE_STATE;
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_inq->inqfilt_active = FALSE;
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_initiate_inquiry (p_inq);
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_initiate_inquiry
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to start an inquiry or periodic inquiry
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  upon completion of the setting and/or clearing of the inquiry filter.
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Inputs:          p_inq (btm_cb.btm_inq_vars) - pointer to saved inquiry information
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      mode - GENERAL or LIMITED inquiry
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      duration - length in 1.28 sec intervals (If '0', the inquiry is CANCELLED)
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      max_resps - maximum amount of devices to search for before ending the inquiry
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      filter_cond_type - BTM_CLR_INQUIRY_FILTER, BTM_FILTER_COND_DEVICE_CLASS, or
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                         BTM_FILTER_COND_BD_ADDR
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                      filter_cond - value for the filter (based on filter_cond_type)
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          If an error occurs the initiator's callback is called with the error status.
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btm_initiate_inquiry (tBTM_INQUIRY_VAR_ST *p_inq)
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    const LAP       *lap;
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_PARMS  *p_inqparms = &p_inq->inqparms;
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE)
17965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_initiate_inquiry: inq_active:0x%x state:%d inqfilt_active:%d",
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_update_busy_level (BTM_BLI_INQ_EVT);
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->inq_active & BTM_SSP_INQUIRY_ACTIVE)
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_process_inq_complete (BTM_NO_RESOURCES, (UINT8)(p_inqparms->mode & BTM_BR_INQUIRY_MASK));
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure the number of responses doesn't overflow the database configuration */
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inqparms->max_resps = (UINT8)((p_inqparms->max_resps <= BTM_INQ_DB_SIZE) ? p_inqparms->max_resps : BTM_INQ_DB_SIZE);
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    lap = (p_inq->inq_active & BTM_LIMITED_INQUIRY_ACTIVE) ? &limited_inq_lap : &general_inq_lap;
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE)
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_per_inq_mode (p_inq->per_max_delay,
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_inq->per_min_delay,
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      *lap, p_inqparms->duration,
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                      p_inqparms->max_resps))
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_process_inq_complete (BTM_NO_RESOURCES, (UINT8)(p_inqparms->mode & BTM_BR_INQUIRY_MASK));
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_clr_inq_result_flt();
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Allocate memory to hold bd_addrs responding */
18255fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_inq->p_bd_db = (tINQ_BDADDR *)osi_calloc(BT_DEFAULT_BUFFER_SIZE);
18265fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        p_inq->max_bd_entries = (UINT16)(BT_DEFAULT_BUFFER_SIZE / sizeof(tINQ_BDADDR));
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!btsnd_hcic_inquiry(*lap, p_inqparms->duration, 0))
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_process_inq_complete (BTM_NO_RESOURCES, (UINT8)(p_inqparms->mode & BTM_BR_INQUIRY_MASK));
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_process_inq_results
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when inquiry results are received from
18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the device. It updates the inquiry database. If the inquiry
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  database is full, the oldest entry is discarded.
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       inq_res_mode - BTM_INQ_RESULT_STANDARD
18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                 BTM_INQ_RESULT_WITH_RSSI
18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                 BTM_INQ_RESULT_EXTENDED
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_process_inq_results (UINT8 *p, UINT8 inq_res_mode)
18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            num_resp, xx;
18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BD_ADDR          bda;
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tINQ_DB_ENT     *p_i;
1853ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_INQ_RESULTS *p_cur=NULL;
18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN          is_new = TRUE;
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN          update = FALSE;
18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT8             i_rssi;
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_RESULTS_CB *p_inq_results_cb = p_inq->p_inq_results_cb;
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            page_scan_rep_mode = 0;
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            page_scan_per_mode = 0;
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            page_scan_mode = 0;
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            rssi = 0;
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    DEV_CLASS        dc;
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16           clock_offset;
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8            *p_eir_data = NULL;
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE)
18685344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_process_inq_results inq_active:0x%x state:%d inqfilt_active:%d",
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1871ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    /* Only process the results if the BR inquiry is still active */
1872ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if (!(p_inq->inq_active & BTM_BR_INQ_ACTIVE_MASK))
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8 (num_resp, p);
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18779eb4ddab2e1a8069dd9a10b6a17021ed7676ccbcMyles Watson    if (inq_res_mode == BTM_INQ_RESULT_EXTENDED && (num_resp > 1)) {
18789eb4ddab2e1a8069dd9a10b6a17021ed7676ccbcMyles Watson        BTM_TRACE_ERROR ("btm_process_inq_results() extended results (%d) > 1",
18799eb4ddab2e1a8069dd9a10b6a17021ed7676ccbcMyles Watson                         num_resp);
18809eb4ddab2e1a8069dd9a10b6a17021ed7676ccbcMyles Watson        return;
18819eb4ddab2e1a8069dd9a10b6a17021ed7676ccbcMyles Watson    }
18829eb4ddab2e1a8069dd9a10b6a17021ed7676ccbcMyles Watson
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for (xx = 0; xx < num_resp; xx++)
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        update = FALSE;
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Extract inquiry results */
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_BDADDR   (bda, p);
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8    (page_scan_rep_mode, p);
18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8    (page_scan_per_mode, p);
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (inq_res_mode == BTM_INQ_RESULT_STANDARD)
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT8(page_scan_mode, p);
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_DEVCLASS (dc, p);
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16   (clock_offset, p);
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (inq_res_mode != BTM_INQ_RESULT_STANDARD)
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT8(rssi, p);
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_i = btm_inq_db_find (bda);
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Only process the num_resp is smaller than max_resps.
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           If results are queued to BTU task while canceling inquiry,
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           or when more than one result is in this response, > max_resp
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           responses could be processed which can confuse some apps
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_inq->inqparms.max_resps &&
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->inq_cmpl_info.num_resp >= p_inq->inqparms.max_resps
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* new device response */
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && ( p_i == NULL ||
19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* exisiting device with BR/EDR info */
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (p_i && (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BREDR) != 0)
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               )
19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            )
19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19225344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati/*            BTM_TRACE_WARNING("INQ RES: Extra Response Received...ignoring"); */
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Check if this address has already been processed for this inquiry */
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btm_inq_find_bdaddr(bda))
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati/*             BTM_TRACE_DEBUG("BDA seen before [%02x%02x %02x%02x %02x%02x]",
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                             bda[0], bda[1], bda[2], bda[3], bda[4], bda[5]);*/
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             /* By default suppose no update needed */
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            i_rssi = (INT8)rssi;
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If this new RSSI is higher than the last one */
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(p_inq->inqparms.report_dup && (rssi != 0) &&
19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               p_i && (i_rssi > p_i->inq_info.results.rssi || p_i->inq_info.results.rssi == 0
19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project               /* BR/EDR inquiry information update */
19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       || (p_i->inq_info.results.device_type & BT_DEVICE_TYPE_BREDR) != 0
19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       ))
19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cur = &p_i->inq_info.results;
19445344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati                BTM_TRACE_DEBUG("update RSSI new:%d, old:%d", i_rssi, p_cur->rssi);
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cur->rssi = i_rssi;
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                update = TRUE;
19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If we received a second Extended Inq Event for an already */
19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* discovered device, this is because for the first one EIR was not received */
19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if ((inq_res_mode == BTM_INQ_RESULT_EXTENDED) && (p_i))
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cur = &p_i->inq_info.results;
19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                update = TRUE;
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If no update needed continue with next response (if any) */
19565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
19575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                continue;
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If existing entry, use that, else get a new one (possibly reusing the oldest) */
19615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_i == NULL)
19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_i = btm_inq_db_new (bda);
19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_new = TRUE;
19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If an entry for the device already exists, overwrite it ONLY if it is from
19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           a previous inquiry. (Ignore it if it is a duplicate response from the same
19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           inquiry.
19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        */
19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (p_i->inq_count == p_inq->inq_counter
19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BLE_INCLUDED == TRUE )
1973cdfb11a323a75ff3458309e76239753b7aae8391Nitin Arora            && (p_i->inq_info.results.device_type == BT_DEVICE_TYPE_BREDR)
19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            )
19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            is_new = FALSE;
19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* keep updating RSSI to have latest value */
19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( inq_res_mode != BTM_INQ_RESULT_STANDARD )
19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_i->inq_info.results.rssi = (INT8)rssi;
19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_i->inq_info.results.rssi = BTM_INQ_RES_IGNORE_RSSI;
19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_new == TRUE)
19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Save the info */
19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cur = &p_i->inq_info.results;
19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cur->page_scan_rep_mode = page_scan_rep_mode;
19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cur->page_scan_per_mode = page_scan_per_mode;
19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cur->page_scan_mode     = page_scan_mode;
19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cur->dev_class[0]       = dc[0];
19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cur->dev_class[1]       = dc[1];
19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cur->dev_class[2]       = dc[2];
19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cur->clock_offset       = clock_offset  | BTM_CLOCK_OFFSET_VALID;
19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1996c196f214c5ae349ec2022f8d3cbaf56910b3b9f8Pavlin Radoslavov            p_i->time_of_resp = time_get_os_boottime_ms();
19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_i->inq_count != p_inq->inq_counter)
19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_inq->inq_cmpl_info.num_resp++;       /* A new response was found */
20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_cur->inq_result_type    = BTM_INQ_RESULT_BR;
20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_i->inq_count != p_inq->inq_counter)
20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cur->device_type  = BT_DEVICE_TYPE_BREDR;
20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_i->scan_rsp       = FALSE;
20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_cur->device_type    |= BT_DEVICE_TYPE_BREDR;
20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_i->inq_count = p_inq->inq_counter;   /* Mark entry for current inquiry */
20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the number of responses found and not unlimited, issue a cancel inquiry */
20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) &&
20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_inq->inqparms.max_resps &&
20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_inq->inq_cmpl_info.num_resp == p_inq->inqparms.max_resps
20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* BLE scanning is active and received adv */
20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                && ((((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0) &&
20205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     p_cur->device_type == BT_DEVICE_TYPE_DUMO && p_i->scan_rsp) ||
20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) == 0)
20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                )
20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
20255344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati/*                BTM_TRACE_DEBUG("BTMINQ: Found devices, cancelling inquiry..."); */
20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btsnd_hcic_inq_cancel();
20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ((p_inq->inqparms.mode & BTM_BLE_INQUIRY_MASK) != 0)
20307fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta                    btm_ble_stop_inquiry();
20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT);
20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Initialize flag to FALSE. This flag is set/used by application */
20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_i->inq_info.appl_knows_rem_name = FALSE;
20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
20375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_new || update)
20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( inq_res_mode == BTM_INQ_RESULT_EXTENDED )
20415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
20425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                memset( p_cur->eir_uuid, 0,
20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        BTM_EIR_SERVICE_ARRAY_SIZE * (BTM_EIR_ARRAY_BITS/8));
20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* set bit map of UUID list from received EIR */
20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_set_eir_uuid( p, p_cur );
20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_eir_data = p;
20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_eir_data = NULL;
20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If a callback is registered, call it with the results */
20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_inq_results_cb)
20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (p_inq_results_cb)((tBTM_INQ_RESULTS *) p_cur, p_eir_data);
20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_sort_inq_result
20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when inquiry complete is received
20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the device to sort inquiry results based on rssi.
20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_sort_inq_result(void)
20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20705fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    UINT8 xx, yy, num_resp;
20715fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    tINQ_DB_ENT *p_ent  = btm_cb.btm_inq_vars.inq_db;
20725fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    tINQ_DB_ENT *p_next = btm_cb.btm_inq_vars.inq_db+1;
20735fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    int size;
20745fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    tINQ_DB_ENT *p_tmp = (tINQ_DB_ENT *)osi_malloc(sizeof(tINQ_DB_ENT));
20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    num_resp = (btm_cb.btm_inq_vars.inq_cmpl_info.num_resp<BTM_INQ_DB_SIZE)?
20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_cb.btm_inq_vars.inq_cmpl_info.num_resp: BTM_INQ_DB_SIZE;
20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20795fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    size = sizeof(tINQ_DB_ENT);
20805fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    for (xx = 0; xx < num_resp-1; xx++, p_ent++) {
20815fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        for (yy = xx+1, p_next = p_ent+1; yy < num_resp; yy++, p_next++) {
20825fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov            if (p_ent->inq_info.results.rssi < p_next->inq_info.results.rssi) {
20835fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                memcpy(p_tmp, p_next, size);
20845fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                memcpy(p_next, p_ent,  size);
20855fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov                memcpy(p_ent, p_tmp,  size);
20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20895fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov
20905fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    osi_free(p_tmp);
20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_process_inq_complete
20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when inquiry complete is received
20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the device.  Call the callback if not in periodic inquiry
20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  mode AND it is not NULL (The caller wants the event).
21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  The callback pass back the status and the number of responses
21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_process_inq_complete (UINT8 status, UINT8 mode)
21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CMPL_CB        *p_inq_cb = btm_cb.btm_inq_vars.p_inq_cmpl_cb;
21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21117f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
21127f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    /* inquiry inactive case happens when inquiry is cancelled.
21137f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie       Make mode 0 for no further inquiries from the current inquiry process
21147f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    */
21157f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    if(status!=HCI_SUCCESS || p_inq->next_state==BTM_FINISH || !p_inq->inq_active)
21167f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    {
21177f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        /* re-initialize for next inquiry request */
21187f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        p_inq->next_state=BTM_BR_ONE;
21197f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        /* make the mode 0 here */
21207f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie        p_inq->inqparms.mode &= ~(p_inq->inqparms.mode);
21217f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
21227f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie    }
21237f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21257f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (!defined(BTA_HOST_INTERLEAVE_SEARCH) || BTA_HOST_INTERLEAVE_SEARCH == FALSE)
21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_inq->inqparms.mode &= ~(mode);
21277f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
21287f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
21290830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora    if(p_inq->scan_type == INQ_LE_OBSERVE && !p_inq->inq_active)
21300830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora    {
21310830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        /*end of LE observe*/
21320830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        p_inq->p_inq_ble_results_cb = (tBTM_INQ_RESULTS_CB *) NULL;
21330830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        p_inq->p_inq_ble_cmpl_cb = (tBTM_CMPL_CB *) NULL;
21340830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        p_inq->scan_type=INQ_NONE;
21350830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora    }
21367f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie
21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE)
21395344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("btm_process_inq_complete inq_active:0x%x state:%d inqfilt_active:%d",
21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_acl_update_busy_level (BTM_BLI_INQ_DONE_EVT);
21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Ignore any stray or late complete messages if the inquiry is not active */
21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_inq->inq_active)
21455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->inq_cmpl_info.status = (tBTM_STATUS)((status == HCI_SUCCESS) ? BTM_SUCCESS : BTM_ERR_PROCESSING);
21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Notify caller that the inquiry has completed; (periodic inquiries do not send completion events */
21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (!(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE) && p_inq->inqparms.mode == 0)
21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2151444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#if BLE_INCLUDED == TRUE
2152444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji            btm_clear_all_pending_le_entry();
2153444a8da807abaf5f9e813ce70c56a79160495fb3Satya Calloji#endif
21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->state = BTM_INQ_INACTIVE_STATE;
21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Increment so the start of a next inquiry has a new count */
21575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->inq_counter++;
21585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btm_clr_inq_result_flt();
21605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21613aa60544585b5fb0f35c1165539a4a859fc0f25cAndre Eisenbach            if((p_inq->inq_cmpl_info.status == BTM_SUCCESS) &&
216230e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson                controller_get_interface()->supports_rssi_with_inquiry_results())
21635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
21645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_sort_inq_result();
21655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
21665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Clear the results callback if set */
21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->p_inq_results_cb = (tBTM_INQ_RESULTS_CB *) NULL;
21695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->inq_active = BTM_INQUIRY_INACTIVE;
21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->p_inq_cmpl_cb = (tBTM_CMPL_CB *) NULL;
21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If we have a callback registered for inquiry complete, call it */
21735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG ("BTM Inq Compl Callback: status 0x%02x, num results %d",
21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        p_inq->inq_cmpl_info.status, p_inq->inq_cmpl_info.num_resp);
21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_inq_cb)
21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (p_inq_cb)((tBTM_INQUIRY_CMPL *) &p_inq->inq_cmpl_info);
21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
21797f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#if (defined(BTA_HOST_INTERLEAVE_SEARCH) && BTA_HOST_INTERLEAVE_SEARCH == TRUE)
21807fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        if(p_inq->inqparms.mode != 0 && !(p_inq->inq_active & BTM_PERIODIC_INQUIRY_ACTIVE))
21817fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        {
21827fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* make inquiry inactive for next iteration */
21837fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            p_inq->inq_active = BTM_INQUIRY_INACTIVE;
21847fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            /* call the inquiry again */
21857fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta            BTM_StartInquiry(&p_inq->inqparms,p_inq->p_inq_results_cb,p_inq->p_inq_cmpl_cb);
21867fa4fba6f59f97df00aff07dbe8fb21b114b3c2cGanesh Ganapathi Batta        }
21877f3e42943b834ff0f556cd5c063a896f54d53167Matthew Xie#endif
21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21890830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora    if(p_inq->inqparms.mode == 0 && p_inq->scan_type == INQ_GENERAL)//this inquiry is complete
21900830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora    {
21910830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        p_inq->scan_type = INQ_NONE;
21920830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora#if (defined BLE_INCLUDED && BLE_INCLUDED == TRUE)
21930830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        /* check if the LE observe is pending */
21940830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        if(p_inq->p_inq_ble_results_cb != NULL)
21950830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        {
21965344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("BTM Inq Compl: resuming a pending LE scan");
21970830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora            BTM_BleObserve(1,0, p_inq->p_inq_ble_results_cb, p_inq->p_inq_ble_cmpl_cb);
21980830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora        }
21990830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora#endif
22000830ad47f790fea658ddc6fa857fb36880e0c552Nitin Arora    }
22015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_INQ_DEBUG == TRUE)
22025344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG ("inq_active:0x%x state:%d inqfilt_active:%d",
22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_cb.btm_inq_vars.inq_active, btm_cb.btm_inq_vars.state, btm_cb.btm_inq_vars.inqfilt_active);
22045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
22055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
22065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
22085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_process_cancel_complete
22105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when inquiry cancel complete is received
22125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  from the device.This function will also call the btm_process_inq_complete
22135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  This function is needed to differentiate a cancel_cmpl_evt from the
22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  inq_cmpl_evt
22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_process_cancel_complete(UINT8 status, UINT8 mode)
22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
22215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     btm_acl_update_busy_level (BTM_BLI_INQ_CANCEL_EVT);
22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project     btm_process_inq_complete(status, mode);
22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
22255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_initiate_rem_name
22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function looks initiates a remote name request.  It is called
22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  either by GAP or by the API call BTM_ReadRemoteDeviceName.
22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Input Params:    p_cur         - pointer to an inquiry result structure (NULL if nonexistent)
22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_cb            - callback function called when BTM_CMD_STARTED
22335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                    is returned.
22345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                    A pointer to tBTM_REMOTE_DEV_NAME is passed to the
22355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                                    callback.
22365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
22385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_CMD_STARTED is returned if the request was sent to HCI.
22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_BUSY if already in progress
22405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_NO_RESOURCES if could not allocate resources to start the command
22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_WRONG_MODE if the device is not up.
22425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
22435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS  btm_initiate_rem_name (BD_ADDR remote_bda, tBTM_INQ_INFO *p_cur,
224578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                    UINT8 origin, period_ms_t timeout_ms,
224678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                    tBTM_CMPL_CB *p_cb)
22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
22485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST *p_inq = &btm_cb.btm_inq_vars;
22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN              cmd_ok;
22505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*** Make sure the device is ready ***/
22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!BTM_IsDeviceUp())
22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return (BTM_WRONG_MODE);
22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (origin == BTM_RMT_NAME_SEC)
22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        cmd_ok = btsnd_hcic_rmt_name_req (remote_bda, HCI_PAGE_SCAN_REP_MODE_R1,
22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         HCI_MANDATARY_PAGE_SCAN_MODE, 0);
22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (cmd_ok)
22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_CMD_STARTED;
22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return BTM_NO_RESOURCES;
22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Make sure there are no two remote name requests from external API in progress */
22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if (origin == BTM_RMT_NAME_EXT)
22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_inq->remname_active)
22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return (BTM_BUSY);
22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
22745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If there is no remote name request running,call the callback function and start timer */
22765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_inq->p_remname_cmpl_cb = p_cb;
22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy(p_inq->remname_bda, remote_bda, BD_ADDR_LEN);
227878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
227978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            alarm_set_on_queue(p_inq->remote_name_timer, timeout_ms,
228078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               btm_inq_remote_name_timer_timeout, NULL,
228178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                               btu_general_alarm_queue);
22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* If the database entry exists for the device, use its clock offset */
22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_cur)
22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cmd_ok = btsnd_hcic_rmt_name_req (remote_bda,
22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_cur->results.page_scan_rep_mode,
22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         p_cur->results.page_scan_mode,
22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         (UINT16)(p_cur->results.clock_offset |
22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                  BTM_CLOCK_OFFSET_VALID));
22915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else /* Otherwise use defaults and mark the clock offset as invalid */
22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                cmd_ok = btsnd_hcic_rmt_name_req (remote_bda, HCI_PAGE_SCAN_REP_MODE_R1,
22955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                         HCI_MANDATARY_PAGE_SCAN_MODE, 0);
22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (cmd_ok)
22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
22995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_inq->remname_active = TRUE;
23005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return BTM_CMD_STARTED;
23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return BTM_NO_RESOURCES;
23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_ILLEGAL_VALUE;
23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_process_remote_name
23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called when a remote name is received from
23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  the device. If remote names are cached, it updates the inquiry
23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  database.
23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_process_remote_name (BD_ADDR bda, BD_NAME bdn, UINT16 evt_len, UINT8 hci_status)
23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2325ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    tBTM_REMOTE_DEV_NAME    rem_name;
23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQUIRY_VAR_ST    *p_inq = &btm_cb.btm_inq_vars;
23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_CMPL_CB           *p_cb = p_inq->p_remname_cmpl_cb;
23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8                  *p_n1;
23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16                 temp_evt_len;
23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bda != NULL)
23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23345344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_EVENT("BDA %02x:%02x:%02x:%02x:%02x:%02x",bda[0], bda[1],
23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 bda[2], bda[3],
23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                 bda[4], bda[5]);
23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
233953c5eb27d0f933ddc3c23d89a0b7fcf14c906f64Zach Johnson    BTM_TRACE_EVENT("Inquire BDA %02x:%02x:%02x:%02x:%02x:%02x",p_inq->remname_bda[0], p_inq->remname_bda[1],
23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             p_inq->remname_bda[2], p_inq->remname_bda[3],
23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             p_inq->remname_bda[4], p_inq->remname_bda[5]);
23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* If the inquire BDA and remote DBA are the same, then stop the timer and set the active to false */
23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if ((p_inq->remname_active ==TRUE)&&
23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (((bda != NULL) &&
23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (memcmp(bda, p_inq->remname_bda,BD_ADDR_LEN)==0)) || bda == NULL))
23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
235053c5eb27d0f933ddc3c23d89a0b7fcf14c906f64Zach Johnson    {
23515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if BLE_INCLUDED == TRUE
23526975b4d711142b885af479721cada448952c6b41Andre Eisenbach        if (BTM_UseLeLink(p_inq->remname_bda))
23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (hci_status == HCI_ERR_UNSPECIFIED)
23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btm_ble_cancel_remote_name(p_inq->remname_bda);
23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
235878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        alarm_cancel(p_inq->remote_name_timer);
23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->remname_active = FALSE;
23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         /* Clean up and return the status if the command was not successful */
23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         /* Note: If part of the inquiry, the name is not stored, and the    */
23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         /*       inquiry complete callback is called.                       */
23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2364104e3f238f500cacdb8afaccdc672dfc34eae7eeBernhard Rosenkränzer        if (hci_status == HCI_SUCCESS)
23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Copy the name from the data stream into the return structure */
23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Note that even if it is not being returned, it is used as a  */
23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*      temporary buffer.                                       */
23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_n1 = (UINT8 *)rem_name.remote_bd_name;
23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_name.length = (evt_len < BD_NAME_LEN) ? evt_len : BD_NAME_LEN;
2371ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            rem_name.remote_bd_name[rem_name.length] = 0;
23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_name.status = BTM_SUCCESS;
23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            temp_evt_len = rem_name.length;
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            while (temp_evt_len > 0)
23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                *p_n1++ = *bdn++;
23785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                temp_evt_len--;
23795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
2380ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            rem_name.remote_bd_name[rem_name.length] = 0;
23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* If processing a stand alone remote name then report the error in the callback */
23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_name.status = BTM_BAD_VALUE_RET;
23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_name.length = 0;
23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            rem_name.remote_bd_name[0] = 0;
23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Reset the remote BAD to zero and call callback if possible */
23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memset(p_inq->remname_bda, 0, BD_ADDR_LEN);
23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_inq->p_remname_cmpl_cb = NULL;
23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_cb)
23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (p_cb)((tBTM_REMOTE_DEV_NAME *)&rem_name);
23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
240078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid btm_inq_remote_name_timer_timeout(UNUSED_ATTR void *data)
240178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov{
240278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    btm_inq_rmt_name_failed();
240378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov}
240478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_inq_rmt_name_failed
24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is if timeout expires while getting remote
24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  name.  This is done for devices that incorrectly do not
24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  report operation failure
24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
24165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_inq_rmt_name_failed (void)
24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
24185344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_ERROR ("btm_inq_rmt_name_failed()  remname_active=%d", btm_cb.btm_inq_vars.remname_active);
24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btm_cb.btm_inq_vars.remname_active)
24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_process_remote_name (btm_cb.btm_inq_vars.remname_bda, NULL, 0, HCI_ERR_UNSPECIFIED);
24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
24235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btm_process_remote_name (NULL, NULL, 0, HCI_ERR_UNSPECIFIED);
24245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btm_sec_rmt_name_request_complete (NULL, NULL, HCI_ERR_UNSPECIFIED);
24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
242778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
242878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov/*******************************************************************************
242978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov**
243078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov** Function         btm_read_inq_tx_power_timeout
243178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov**
243278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov** Description      Callback when reading the inquiry tx power times out.
243378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov**
243478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov** Returns          void
243578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov**
243678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov*******************************************************************************/
243778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid btm_read_inq_tx_power_timeout(UNUSED_ATTR void *data)
243878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov{
243978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    tBTM_CMPL_CB  *p_cb = btm_cb.devcb.p_inq_tx_power_cmpl_cb;
244078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    btm_cb.devcb.p_inq_tx_power_cmpl_cb = NULL;
244178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    if (p_cb)
244278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        (*p_cb)((void *) NULL);
244378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov}
244478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
244778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov** Function         btm_read_inq_tx_power_complete
24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      read inquiry tx power level complete callback function.
24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
245478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovvoid btm_read_inq_tx_power_complete(UINT8 *p)
24555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
245678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    tBTM_CMPL_CB                *p_cb = btm_cb.devcb.p_inq_tx_power_cmpl_cb;
24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_INQ_TXPWR_RESULTS        results;
24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
245978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    BTM_TRACE_DEBUG("%s", __func__);
246078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_cancel(btm_cb.devcb.read_inq_tx_power_timer);
246178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    btm_cb.devcb.p_inq_tx_power_cmpl_cb = NULL;
24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
246378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    /* If there was a registered callback, call it */
24645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_cb)
24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8  (results.hci_status, p);
24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (results.hci_status == HCI_SUCCESS)
24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            results.status = BTM_SUCCESS;
24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT8 (results.tx_power, p);
24735344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_EVENT ("BTM INQ TX POWER Complete: tx_power %d, hci status 0x%02x",
24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                              results.tx_power, results.hci_status);
24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            results.status = BTM_ERR_PROCESSING;
24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        (*p_cb)(&results);
24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_WriteEIR
24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to write EIR data to controller.
24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_buff - allocated HCI command buffer including extended
24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                           inquriry response
24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_SUCCESS  - if successful
24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_MODE_UNSUPPORTED - if local device cannot support it
24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_STATUS BTM_WriteEIR( BT_HDR *p_buff )
24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
249830e58068c1adaac7c5ccb3aa9cfb045d41d2a10eZach Johnson    if (controller_get_interface()->supports_extended_inquiry_response())
24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25005344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_API("Write Extended Inquiry Response to controller");
25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btsnd_hcic_write_ext_inquiry_response (p_buff, BTM_EIR_DEFAULT_FEC_REQUIRED);
25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_SUCCESS;
25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2506abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov        osi_free(p_buff);
25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_MODE_UNSUPPORTED;
25085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_CheckEirData
25145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to get EIR data from significant part.
25165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_eir - pointer of EIR significant part
25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  type   - finding EIR data type
25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_length - return the length of EIR data not including type
25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          pointer of EIR data
25225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
25245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 *BTM_CheckEirData( UINT8 *p_eir, UINT8 type, UINT8 *p_length )
25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 *p = p_eir;
25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 length;
25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 eir_type;
25295344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("BTM_CheckEirData type=0x%02X", type);
25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    STREAM_TO_UINT8(length, p);
25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while( length && (p - p_eir <= HCI_EXT_INQ_RESPONSE_LEN))
25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8(eir_type, p);
25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( eir_type == type )
25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* length doesn't include itself */
25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            *p_length = length - 1; /* minus the length of type */
25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return p;
25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p += length - 1; /* skip the length of data */
25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT8(length, p);
25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_length = 0;
25465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return NULL;
25475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_convert_uuid_to_eir_service
25525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to get the bit position of UUID.
25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       uuid16 - UUID 16-bit
25565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM EIR service ID if found
25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_EIR_MAX_SERVICES - if not found
25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
25615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btm_convert_uuid_to_eir_service( UINT16 uuid16 )
25625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
25635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 xx;
25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for( xx = 0; xx < BTM_EIR_MAX_SERVICES; xx++ )
25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( uuid16 == BTM_EIR_UUID_LKUP_TBL[xx])
25685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
25695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return xx;
25705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
25715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_EIR_MAX_SERVICES;
25735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
25765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_HasEirService
25785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to know if UUID in bit map of UUID.
25805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_eir_uuid - bit map of UUID list
25825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  uuid16 - UUID 16-bit
25835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE - if found
25855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  FALSE - if not found
25865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
25875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
25885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN BTM_HasEirService( UINT32 *p_eir_uuid, UINT16 uuid16 )
25895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
25905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 service_id;
25915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    service_id = btm_convert_uuid_to_eir_service(uuid16);
25935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( service_id < BTM_EIR_MAX_SERVICES )
25945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return( BTM_EIR_HAS_SERVICE( p_eir_uuid, service_id ));
25955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
25965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return( FALSE );
25975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_HasInquiryEirService
26025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to know if UUID in bit map of UUID list.
26045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_results - inquiry results
26065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  uuid16 - UUID 16-bit
26075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_EIR_FOUND - if found
26095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_EIR_NOT_FOUND - if not found and it is complete list
26105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_EIR_UNKNOWN - if not found and it is not complete list
26115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTM_EIR_SEARCH_RESULT BTM_HasInquiryEirService( tBTM_INQ_RESULTS *p_results, UINT16 uuid16 )
26145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( BTM_HasEirService( p_results->eir_uuid, uuid16 ))
26165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_EIR_FOUND;
26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if( p_results->eir_complete_list )
26205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_EIR_NOT_FOUND;
26225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
26245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return BTM_EIR_UNKNOWN;
26255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_AddEirService
26305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to add a service in bit map of UUID list.
26325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_eir_uuid - bit mask of UUID list for EIR
26345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  uuid16 - UUID 16-bit
26355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_AddEirService( UINT32 *p_eir_uuid, UINT16 uuid16 )
26405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 service_id;
26425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    service_id = btm_convert_uuid_to_eir_service(uuid16);
26445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( service_id < BTM_EIR_MAX_SERVICES )
26455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_EIR_SET_SERVICE( p_eir_uuid, service_id );
26465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_RemoveEirService
26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to remove a service in bit map of UUID list.
26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_eir_uuid - bit mask of UUID list for EIR
26555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  uuid16 - UUID 16-bit
26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
26585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid BTM_RemoveEirService( UINT32 *p_eir_uuid, UINT16 uuid16 )
26615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 service_id;
26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    service_id = btm_convert_uuid_to_eir_service(uuid16);
26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( service_id < BTM_EIR_MAX_SERVICES )
26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_EIR_CLR_SERVICE( p_eir_uuid, service_id );
26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_GetEirSupportedServices
26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to get UUID list from bit map of UUID list.
26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_eir_uuid - bit mask of UUID list for EIR
26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p - reference of current pointer of EIR
26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  max_num_uuid16 - max number of UUID can be written in EIR
26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  num_uuid16 - number of UUID have been written in EIR
26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BTM_EIR_MORE_16BITS_UUID_TYPE, if it has more than max
26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_EIR_COMPLETE_16BITS_UUID_TYPE, otherwise
26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_GetEirSupportedServices( UINT32 *p_eir_uuid,    UINT8 **p,
26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                   UINT8  max_num_uuid16, UINT8 *p_num_uuid16)
26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 service_index;
26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_num_uuid16 = 0;
26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(service_index = 0; service_index < BTM_EIR_MAX_SERVICES; service_index++)
26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if( BTM_EIR_HAS_SERVICE( p_eir_uuid, service_index ))
26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( *p_num_uuid16 < max_num_uuid16 )
26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UINT16_TO_STREAM(*p, BTM_EIR_UUID_LKUP_TBL[service_index]);
26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (*p_num_uuid16)++;
26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if max number of UUIDs are stored and found one more */
27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return BTM_EIR_MORE_16BITS_UUID_TYPE;
27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return BTM_EIR_COMPLETE_16BITS_UUID_TYPE;
27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         BTM_GetEirUuidList
27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function parses EIR and returns UUID list.
27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_eir - EIR
27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  uuid_size - LEN_UUID_16, LEN_UUID_32, LEN_UUID_128
27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_num_uuid - return number of UUID in found list
27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_uuid_list - return UUID list
27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  max_num_uuid - maximum number of UUID to be returned
27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          0 - if not found
27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_EIR_COMPLETE_16BITS_UUID_TYPE
27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_EIR_MORE_16BITS_UUID_TYPE
27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_EIR_COMPLETE_32BITS_UUID_TYPE
27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_EIR_MORE_32BITS_UUID_TYPE
27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_EIR_COMPLETE_128BITS_UUID_TYPE
27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  BTM_EIR_MORE_128BITS_UUID_TYPE
27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 BTM_GetEirUuidList( UINT8 *p_eir, UINT8 uuid_size, UINT8 *p_num_uuid,
27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                            UINT8 *p_uuid_list, UINT8 max_num_uuid)
27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
27345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_uuid_data;
27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   type;
27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   yy, xx;
27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  *p_uuid16 = (UINT16 *)p_uuid_list;
27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  *p_uuid32 = (UINT32 *)p_uuid_list;
27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    char    buff[LEN_UUID_128 * 2 + 1];
27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_uuid_data = btm_eir_get_uuid_list( p_eir, uuid_size, p_num_uuid, &type );
27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( p_uuid_data == NULL )
27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return 0x00;
27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( *p_num_uuid > max_num_uuid )
27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27495344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("BTM_GetEirUuidList number of uuid in EIR = %d, size of uuid list = %d",
27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                           *p_num_uuid, max_num_uuid );
27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_num_uuid = max_num_uuid;
27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27545344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_DEBUG("BTM_GetEirUuidList type = %02X, number of uuid = %d", type, *p_num_uuid );
27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( uuid_size == LEN_UUID_16 )
27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for( yy = 0; yy < *p_num_uuid; yy++ )
27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16(*(p_uuid16 + yy), p_uuid_data);
27615344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("                     0x%04X", *(p_uuid16 + yy));
27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if( uuid_size == LEN_UUID_32 )
27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for( yy = 0; yy < *p_num_uuid; yy++ )
27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT32(*(p_uuid32 + yy), p_uuid_data);
27695344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("                     0x%08X", *(p_uuid32 + yy));
27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if( uuid_size == LEN_UUID_128 )
27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for( yy = 0; yy < *p_num_uuid; yy++ )
27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_ARRAY16(p_uuid_list + yy * LEN_UUID_128, p_uuid_data);
27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for( xx = 0; xx < LEN_UUID_128; xx++ )
27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sprintf(buff + xx*2, "%02X", *(p_uuid_list + yy * LEN_UUID_128 + xx));
27795344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati            BTM_TRACE_DEBUG("                     0x%s", buff);
27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return type;
27845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_eir_get_uuid_list
27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function searches UUID list in EIR.
27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_eir - address of EIR
27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  uuid_size - size of UUID to find
27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_num_uuid - number of UUIDs found
27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_uuid_list_type - EIR data type
27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          NULL - if UUID list with uuid_size is not found
27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  beginning of UUID list in EIR - otherwise
28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 *btm_eir_get_uuid_list( UINT8 *p_eir, UINT8 uuid_size,
28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                     UINT8 *p_num_uuid, UINT8 *p_uuid_list_type )
28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_uuid_data;
28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   complete_type, more_type;
28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   uuid_len;
28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch( uuid_size )
28105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case LEN_UUID_16:
28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        complete_type = BTM_EIR_COMPLETE_16BITS_UUID_TYPE;
28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        more_type     = BTM_EIR_MORE_16BITS_UUID_TYPE;
28145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
28155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case LEN_UUID_32:
28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        complete_type = BTM_EIR_COMPLETE_32BITS_UUID_TYPE;
28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        more_type     = BTM_EIR_MORE_32BITS_UUID_TYPE;
28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case LEN_UUID_128:
28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        complete_type = BTM_EIR_COMPLETE_128BITS_UUID_TYPE;
28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        more_type     = BTM_EIR_MORE_128BITS_UUID_TYPE;
28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_num_uuid = 0;
28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return NULL;
28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_uuid_data = BTM_CheckEirData( p_eir, complete_type, &uuid_len );
28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_uuid_data == NULL)
28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_uuid_data = BTM_CheckEirData( p_eir, more_type, &uuid_len );
28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_uuid_list_type = more_type;
28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        *p_uuid_list_type = complete_type;
28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    *p_num_uuid = uuid_len / uuid_size;
28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_uuid_data;
28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_convert_uuid_to_uuid16
28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function converts UUID to UUID 16-bit.
28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_uuid - address of UUID
28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  uuid_size - size of UUID
28525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          0 - if UUID cannot be converted to UUID 16-bit
28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  UUID 16-bit - otherwise
28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT16 btm_convert_uuid_to_uuid16( UINT8 *p_uuid, UINT8 uuid_size )
28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    static const UINT8  base_uuid[LEN_UUID_128] = {0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80,
28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                                                   0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
28615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 uuid16 = 0;
28625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 uuid32;
28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_base_uuid;
28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8  xx;
28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (uuid_size)
28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case LEN_UUID_16:
28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT16 (uuid16, p_uuid);
28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case LEN_UUID_32:
28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        STREAM_TO_UINT32 (uuid32, p_uuid);
28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (uuid32 < 0x10000)
28745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            uuid16 = (UINT16) uuid32;
28755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case LEN_UUID_128:
28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* See if we can compress his UUID down to 16 or 32bit UUIDs */
28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        is_base_uuid = TRUE;
28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for (xx = 0; xx < LEN_UUID_128 - 4; xx++)
28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_uuid[xx] != base_uuid[xx])
28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                is_base_uuid = FALSE;
28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
28865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (is_base_uuid)
28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((p_uuid[LEN_UUID_128 - 1] == 0) && (p_uuid[LEN_UUID_128 - 2] == 0))
28905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
28915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_uuid += (LEN_UUID_128 - 4);
28925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                STREAM_TO_UINT16(uuid16, p_uuid);
28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
28945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
28975344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati        BTM_TRACE_WARNING("btm_convert_uuid_to_uuid16 invalid uuid size");
28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return( uuid16);
29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         btm_set_eir_uuid
29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      This function is called to store received UUID into inquiry result.
29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Parameters       p_eir - pointer of EIR significant part
29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**                  p_results - pointer of inquiry result
29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btm_set_eir_uuid( UINT8 *p_eir, tBTM_INQ_RESULTS *p_results )
29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   *p_uuid_data;
29195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   num_uuid;
29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16  uuid16;
29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   yy;
29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   type = BTM_EIR_MORE_16BITS_UUID_TYPE;
29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_uuid_data = btm_eir_get_uuid_list( p_eir, LEN_UUID_16, &num_uuid, &type );
29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(type == BTM_EIR_COMPLETE_16BITS_UUID_TYPE)
29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_results->eir_complete_list = TRUE;
29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_results->eir_complete_list = FALSE;
29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29355344d6dcb09a184eaf1f9e46cc1ac3962822435cSharvil Nanavati    BTM_TRACE_API("btm_set_eir_uuid eir_complete_list=0x%02X", p_results->eir_complete_list);
29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( p_uuid_data )
29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for( yy = 0; yy < num_uuid; yy++ )
29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            STREAM_TO_UINT16(uuid16, p_uuid_data);
29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            BTM_AddEirService( p_results->eir_uuid, uuid16 );
29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_uuid_data = btm_eir_get_uuid_list( p_eir, LEN_UUID_32, &num_uuid, &type );
29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( p_uuid_data )
29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for( yy = 0; yy < num_uuid; yy++ )
29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            uuid16 = btm_convert_uuid_to_uuid16( p_uuid_data, LEN_UUID_32 );
29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_uuid_data += LEN_UUID_32;
29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( uuid16 )
29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_AddEirService( p_results->eir_uuid, uuid16 );
29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_uuid_data = btm_eir_get_uuid_list( p_eir, LEN_UUID_128, &num_uuid, &type );
29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if( p_uuid_data )
29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        for( yy = 0; yy < num_uuid; yy++ )
29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            uuid16 = btm_convert_uuid_to_uuid16( p_uuid_data, LEN_UUID_128 );
29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_uuid_data += LEN_UUID_128;
29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if( uuid16 )
29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                BTM_AddEirService( p_results->eir_uuid, uuid16 );
29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2970