16ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach/******************************************************************************
2e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *
3e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *  Copyright (C) 2009-2012 Broadcom Corporation
4e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *
56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Licensed under the Apache License, Version 2.0 (the "License");
66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  you may not use this file except in compliance with the License.
76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  You may obtain a copy of the License at:
8e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *
96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  http://www.apache.org/licenses/LICENSE-2.0
10e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *
116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  Unless required by applicable law or agreed to in writing, software
126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  distributed under the License is distributed on an "AS IS" BASIS,
136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  See the License for the specific language governing permissions and
156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach *  limitations under the License.
16e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *
176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/
18e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
19e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************
20e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *
21e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *  Filename:      btif_core.c
22e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach *
235140bed9a19aadca962184ebc9ed823d5d7cb745jechao *  Description:   Contains core functionality related to interfacing between
245140bed9a19aadca962184ebc9ed823d5d7cb745jechao *                 Bluetooth HAL and BTE core stack.
25254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren *
26e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach ***********************************************************************************/
27e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
2835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <stdlib.h>
29e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <hardware/bluetooth.h>
30e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include <string.h>
3135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <sys/types.h>
3235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <sys/stat.h>
3335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <fcntl.h>
3435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <dirent.h>
3535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <ctype.h>
3635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy#include <cutils/properties.h>
3735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
38e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define LOG_TAG "BTIF_CORE"
39e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btif_api.h"
40e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bta_api.h"
41e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "gki.h"
42e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btu.h"
43e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bte.h"
44e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "bd.h"
452fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren#include "btif_av.h"
46e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btif_storage.h"
47e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#include "btif_util.h"
48b888218fb9061d8ddf41013dba6d0956b3322fd6zzy#include "btif_sock.h"
498e6e9356d5386501d5e0988ce23d0c9aaed31a64zzy#include "btif_pan.h"
50fe1b7a6c392ef7ccc371e3bf580f2e853d0d6c65Ganesh Ganapathi Batta#include "btif_profile_queue.h"
5154cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy#include "btif_config.h"
52e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************
53e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Constants & Macros
54e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/
55e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
56e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#ifndef BTIF_TASK_STACK_SIZE
5795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_TASK_STACK_SIZE       0x2000         /* In bytes */
58e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
59e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
605edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi T#ifndef BTE_DID_CONF_FILE
615edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi T#define BTE_DID_CONF_FILE "/etc/bluetooth/bt_did.conf"
625edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi T#endif
635edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi T
64e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#define BTIF_TASK_STR        ((INT8 *) "BTIF")
6595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy
66e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************
67e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Local type definitions
68e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/
6929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
70e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* These type definitions are used when passing data from the HAL to BTIF context
71e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*  in the downstream path for the adapter and remote_device property APIs */
7229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
73e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef struct {
74e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach  bt_bdaddr_t bd_addr;
75e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach  bt_property_type_t type;
76e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} btif_storage_read_t;
77e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
78e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef struct {
79e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach  bt_bdaddr_t bd_addr;
80e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach  bt_property_t prop;
81e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} btif_storage_write_t;
82e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
83e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachtypedef union {
84e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach  btif_storage_read_t read_req;
85e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach  btif_storage_write_t write_req;
86e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach} btif_storage_req_t;
8729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
8829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrentypedef enum {
8929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    BTIF_CORE_STATE_DISABLED = 0,
9029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    BTIF_CORE_STATE_ENABLING,
9129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    BTIF_CORE_STATE_ENABLED,
9229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    BTIF_CORE_STATE_DISABLING
9329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren} btif_core_state_t;
9429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
95e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************
96e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Static variables
97e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/
9829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
9935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamybt_bdaddr_t btif_local_bd_addr;
10029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
10129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrenstatic UINT32 btif_task_stack[(BTIF_TASK_STACK_SIZE + 3) / 4];
10229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
10329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren/* holds main adapter state */
10429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrenstatic btif_core_state_t btif_core_state = BTIF_CORE_STATE_DISABLED;
10529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
10629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrenstatic int btif_shutdown_pending = 0;
10729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrenstatic tBTA_SERVICE_MASK btif_enabled_services = 0;
10829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
109a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/*
110a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy* This variable should be set to 1, if the Bluedroid+BTIF libraries are to
111a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy* function in DUT mode.
112a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*
113a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy* To set this, the btif_init_bluetooth needs to be called with argument as 1
114a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*/
115a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamystatic UINT8 btif_dut_mode = 0;
116a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy
117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************
118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Static functions
119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/
1205140bed9a19aadca962184ebc9ed823d5d7cb745jechaostatic bt_status_t btif_associate_evt(void);
1215140bed9a19aadca962184ebc9ed823d5d7cb745jechaostatic bt_status_t btif_disassociate_evt(void);
122e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
123e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/* sends message to btif task */
124e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void btif_sendmsg(void *p_msg);
125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************
127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Externs
128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/
1295edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi Textern void bte_load_did_conf(const char *p_path);
130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/** TODO: Move these to _common.h */
132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bte_main_boot_entry(void);
13335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamyvoid bte_main_enable(uint8_t *local_addr);
134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bte_main_disable(void);
135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bte_main_shutdown(void);
136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE)
137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bte_main_enable_lpm(BOOLEAN enable);
138e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid bte_main_postload_cfg(void);
140b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamyvoid btif_dm_execute_service_request(UINT16 event, char *p_param);
141a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huang#ifdef BTIF_DM_OOB_TEST
142a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huangvoid btif_dm_load_local_oob(void);
143a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huang#endif
144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/************************************************************************************
146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**  Functions
147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach************************************************************************************/
148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
150e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*****************************************************************************
151e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**   Context switching functions
152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*****************************************************************************/
153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
156e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
157e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_context_switched
158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1595140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Description      Callback used to execute transferred context callback
160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_msg : message to be executed in btif context
162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1635140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Returns          void
164e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
165e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
166e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void btif_context_switched(void *p_msg)
168e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
169e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTIF_CONTEXT_SWITCH_CBACK *p;
170e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
171e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_VERBOSE0("btif_context_switched");
172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    p = (tBTIF_CONTEXT_SWITCH_CBACK *) p_msg;
174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
175e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* each callback knows how to parse the data */
176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (p->p_cb)
1775140bed9a19aadca962184ebc9ed823d5d7cb745jechao        p->p_cb(p->event, p->p_param);
178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_transfer_context
184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      This function switches context to btif task
186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_cback   : callback used to process message in btif context
188e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  event     : event id of message
189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  p_params  : parameter area passed to callback (copied)
190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  param_len : length of parameter area
191254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren**                  p_copy_cback : If set this function will be invoked for deep copy
192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
193254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          void
194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_transfer_context (tBTIF_CBACK *p_cback, UINT16 event, char* p_params, int param_len, tBTIF_COPY_CBACK *p_copy_cback)
198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1995140bed9a19aadca962184ebc9ed823d5d7cb745jechao    tBTIF_CONTEXT_SWITCH_CBACK *p_msg;
200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_VERBOSE2("btif_transfer_context event %d, len %d", event, param_len);
202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
203e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* allocate and send message that will be executed in btif context */
204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if ((p_msg = (tBTIF_CONTEXT_SWITCH_CBACK *) GKI_getbuf(sizeof(tBTIF_CONTEXT_SWITCH_CBACK) + param_len)) != NULL)
205254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren    {
206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_msg->hdr.event = BT_EVT_CONTEXT_SWITCH_EVT; /* internal event */
207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_msg->p_cb = p_cback;
208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        p_msg->event = event;                         /* callback event */
210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
211e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* check if caller has provided a copy callback to do the deep copy */
212e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (p_copy_cback)
213e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
214e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            p_copy_cback(event, p_msg->p_param, p_params);
215e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
216e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        else if (p_params)
217e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
218e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            memcpy(p_msg->p_param, p_params, param_len);  /* callback parameter data */
219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btif_sendmsg(p_msg);
222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return BT_STATUS_SUCCESS;
223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* let caller deal with a failed allocation */
227e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return BT_STATUS_NOMEM;
228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
229e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
231a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/*******************************************************************************
232a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
233a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Function         btif_is_dut_mode
234a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
235a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Description      checks if BTIF is currently in DUT mode
236a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
237a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Returns          1 if test mode, otherwize 0
238a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
239a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*******************************************************************************/
240a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy
241a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik SinnaswamyUINT8 btif_is_dut_mode(void)
242a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy{
243a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    return (btif_dut_mode == 1);
244a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy}
24529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
24629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren/*******************************************************************************
24729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren**
24829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Function         btif_is_enabled
24929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren**
25029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Description      checks if main adapter is fully enabled
25129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren**
25229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Returns          1 if fully enabled, otherwize 0
25329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren**
25429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren*******************************************************************************/
25529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
25629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agrenint btif_is_enabled(void)
25729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren{
258a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    return ((!btif_is_dut_mode()) && (btif_core_state == BTIF_CORE_STATE_ENABLED));
25929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren}
26029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_task
264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      BTIF task handler managing all messages being passed
266e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  Bluetooth HAL and BTA.
267e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
2685140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Returns          void
269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void btif_task(UINT32 params)
273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    UINT16   event;
275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BT_HDR   *p_msg;
276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_DEBUG0("btif task starting");
278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
2795140bed9a19aadca962184ebc9ed823d5d7cb745jechao    btif_associate_evt();
280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    for(;;)
282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* wait for specified events */
284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        event = GKI_wait(0xFFFF, 0);
2855140bed9a19aadca962184ebc9ed823d5d7cb745jechao
286254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren        /*
287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         * Wait for the trigger to init chip and stack. This trigger will
288254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren         * be received by btu_task once the UART is opened and ready
289e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         */
290254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren        if (event == BT_EVT_TRIGGER_STACK_INIT)
291e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            BTIF_TRACE_DEBUG0("btif_task: received trigger stack init event");
293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            BTA_EnableBluetooth(bte_dm_evt);
294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if (event & EVENT_MASK(GKI_SHUTDOWN_EVT))
297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        if(event & TASK_MBOX_1_EVT_MASK)
300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            while((p_msg = GKI_read_mbox(BTU_BTIF_MBOX)) != NULL)
302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                BTIF_TRACE_VERBOSE1("btif task fetched event %x", p_msg->event);
3045140bed9a19aadca962184ebc9ed823d5d7cb745jechao
305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                switch (p_msg->event)
306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    case BT_EVT_CONTEXT_SWITCH_EVT:
308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        btif_context_switched(p_msg);
3095140bed9a19aadca962184ebc9ed823d5d7cb745jechao                        break;
310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    default:
311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        BTIF_TRACE_ERROR1("unhandled btif event (%d)", p_msg->event & BT_EVT_MASK);
312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        break;
313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                GKI_freebuf(p_msg);
316e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
317e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }
318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
3195140bed9a19aadca962184ebc9ed823d5d7cb745jechao
3205140bed9a19aadca962184ebc9ed823d5d7cb745jechao    btif_disassociate_evt();
3215140bed9a19aadca962184ebc9ed823d5d7cb745jechao
3225140bed9a19aadca962184ebc9ed823d5d7cb745jechao    BTIF_TRACE_DEBUG0("btif task exiting");
323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_sendmsg
329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Sends msg to BTIF task
331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
332254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          void
333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btif_sendmsg(void *p_msg)
337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    GKI_send_msg(BTIF_TASK, BTU_BTIF_MBOX, p_msg);
339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
340e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
34135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamystatic void btif_fetch_local_bdaddr(bt_bdaddr_t *local_addr)
34235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy{
34335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    char val[256];
34435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    uint8_t valid_bda = FALSE;
345bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta    int val_size = 0;
34635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    const uint8_t null_bdaddr[BD_ADDR_LEN] = {0,0,0,0,0,0};
34735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
34835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    /* Get local bdaddr storage path from property */
34935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    if (property_get(PROPERTY_BT_BDADDR_PATH, val, NULL))
35035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    {
35135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        int addr_fd;
35235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
35335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        BTIF_TRACE_DEBUG1("local bdaddr is stored in %s", val);
35435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
35535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        if ((addr_fd = open(val, O_RDONLY)) != -1)
35635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        {
35735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy            memset(val, 0, sizeof(val));
35835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy            read(addr_fd, val, FACTORY_BT_BDADDR_STORAGE_LEN);
35935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy            str2bd(val, local_addr);
36035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy            /* If this is not a reserved/special bda, then use it */
36135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy            if (memcmp(local_addr->address, null_bdaddr, BD_ADDR_LEN) != 0)
36235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy            {
36335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy                valid_bda = TRUE;
36435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy                BTIF_TRACE_DEBUG6("Got Factory BDA %02X:%02X:%02X:%02X:%02X:%02X",
36535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy                    local_addr->address[0], local_addr->address[1], local_addr->address[2],
36635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy                    local_addr->address[3], local_addr->address[4], local_addr->address[5]);
36735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy            }
36835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
36935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy            close(addr_fd);
37035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        }
37135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    }
37235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
373bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta    if(!valid_bda)
374bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta    {
375bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta        val_size = sizeof(val);
376bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta        if(btif_config_get_str("Local", "Adapter", "Address", val, &val_size))
377bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta        {
378bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta            str2bd(val, local_addr);
379ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao            BTIF_TRACE_DEBUG1("local bdaddr from bt_config.xml is  %s", val);
380bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta            return;
381bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta        }
382bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta     }
383bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta
38435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    /* No factory BDADDR found. Look for previously generated random BDA */
38535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    if ((!valid_bda) && \
38635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        (property_get(PERSIST_BDADDR_PROPERTY, val, NULL)))
38735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    {
38835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        str2bd(val, local_addr);
38935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        valid_bda = TRUE;
39035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        BTIF_TRACE_DEBUG6("Got prior random BDA %02X:%02X:%02X:%02X:%02X:%02X",
39135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy            local_addr->address[0], local_addr->address[1], local_addr->address[2],
39235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy            local_addr->address[3], local_addr->address[4], local_addr->address[5]);
39335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    }
39435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
39535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    /* Generate new BDA if necessary */
39635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    if (!valid_bda)
39735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    {
39835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        bdstr_t bdstr;
39935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        /* Seed the random number generator */
40035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        srand((unsigned int) (time(0)));
40135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
40235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        /* No autogen BDA. Generate one now. */
40335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        local_addr->address[0] = 0x22;
40435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        local_addr->address[1] = 0x22;
40535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        local_addr->address[2] = (uint8_t) ((rand() >> 8) & 0xFF);
40635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        local_addr->address[3] = (uint8_t) ((rand() >> 8) & 0xFF);
40735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        local_addr->address[4] = (uint8_t) ((rand() >> 8) & 0xFF);
40835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        local_addr->address[5] = (uint8_t) ((rand() >> 8) & 0xFF);
40935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
41035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        /* Convert to ascii, and store as a persistent property */
41135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        bd2str(local_addr, &bdstr);
41235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
41335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        BTIF_TRACE_DEBUG2("No preset BDA. Generating BDA: %s for prop %s",
41435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy             (char*)bdstr, PERSIST_BDADDR_PROPERTY);
41535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
41635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        if (property_set(PERSIST_BDADDR_PROPERTY, (char*)bdstr) < 0)
41735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy            BTIF_TRACE_ERROR1("Failed to set random BDA in prop %s",PERSIST_BDADDR_PROPERTY);
41835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    }
419ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao
42054cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy    //save the bd address to config file
42154cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy    bdstr_t bdstr;
42254cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy    bd2str(local_addr, &bdstr);
423bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta    val_size = sizeof(val);
424bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta    if (btif_config_get_str("Local", "Adapter", "Address", val, &val_size))
425bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta    {
426bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta        if (strcmp(bdstr, val) ==0)
427bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta        {
428bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta            // BDA is already present in the config file.
429bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta            return;
430bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta        }
431bc08278001ea3bdf9e08c2f754b129db34b09eb6Ganesh Ganapathi Batta    }
43254cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy    btif_config_set_str("Local", "Adapter", "Address", bdstr);
43354cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy    btif_config_save();
43435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy}
43535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
436e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*****************************************************************************
437e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
438e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**   btif core api functions
439e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
440e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*****************************************************************************/
441e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
442e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
443e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
444e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_init_bluetooth
445e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
446e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Creates BTIF task and prepares BT scheduler for startup
447254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren**
448254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          bt_status_t
449e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
450e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
451e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
452a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamybt_status_t btif_init_bluetooth()
453e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
45435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    UINT8 status;
45554cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy    btif_config_init();
456e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bte_main_boot_entry();
457e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
45835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    /* As part of the init, fetch the local BD ADDR */
45935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    memset(&btif_local_bd_addr, 0, sizeof(bt_bdaddr_t));
46035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    btif_fetch_local_bdaddr(&btif_local_bd_addr);
46135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
46235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    /* start btif task */
46335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    status = GKI_create_task(btif_task, BTIF_TASK, BTIF_TASK_STR,
46435207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy                (UINT16 *) ((UINT8 *)btif_task_stack + BTIF_TASK_STACK_SIZE),
46535207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy                sizeof(btif_task_stack));
46635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
46735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    if (status != GKI_SUCCESS)
46835207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        return BT_STATUS_FAIL;
46935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
470e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return BT_STATUS_SUCCESS;
471e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
472e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
473e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
474e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
4755140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Function         btif_associate_evt
476e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
4775140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Description      Event indicating btif_task is up
478e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  Attach btif_task to JVM
479e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
480e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          void
481e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
482e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
483e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
4845140bed9a19aadca962184ebc9ed823d5d7cb745jechaostatic bt_status_t btif_associate_evt(void)
485e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
486e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_DEBUG1("%s: notify ASSOCIATE_JVM", __FUNCTION__);
487254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren    HAL_CBACK(bt_hal_cbacks, thread_evt_cb, ASSOCIATE_JVM);
488e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
489e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return BT_STATUS_SUCCESS;
490e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
491e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
492e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
493e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
494e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
495e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_enable_bluetooth
496e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
497e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Performs chip power on and kickstarts OS scheduler
498254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren**
499254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          bt_status_t
500e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
501e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
502e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
503e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_enable_bluetooth(void)
504e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
50529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    BTIF_TRACE_DEBUG0("BTIF ENABLE BLUETOOTH");
506e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
50729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (btif_core_state != BTIF_CORE_STATE_DISABLED)
508e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
509595bced8e7c280e37a75b9bf9c1f36263434041cMatthew Xie        ALOGD("not disabled\n");
510e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return BT_STATUS_DONE;
511e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
512e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
51329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    btif_core_state = BTIF_CORE_STATE_ENABLING;
514e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
515e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* Create the GKI tasks and run them */
51635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    bte_main_enable(btif_local_bd_addr.address);
51735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
518e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return BT_STATUS_SUCCESS;
519e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
520e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
521e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
522e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
523e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
524e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_enable_bluetooth_evt
525e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
526e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Event indicating bluetooth enable is completed
527e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  Notifies HAL user with updated adapter state
528254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren**
529254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          void
530e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
531e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
532e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
533e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btif_enable_bluetooth_evt(tBTA_STATUS status, BD_ADDR local_bd)
534e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
535e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_bdaddr_t bd_addr;
536e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bdstr_t bdstr;
537e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
538e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bdcpy(bd_addr.address, local_bd);
539e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_DEBUG3("%s: status %d, local bd [%s]", __FUNCTION__, status,
540e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                                     bd2str(&bd_addr, &bdstr));
541ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao
542ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao    if (bdcmp(btif_local_bd_addr.address,local_bd))
543ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao    {
544ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        bdstr_t buf;
545ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        bt_property_t prop;
546ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao
547ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        /**
548ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao         * The Controller's BDADDR does not match to the BTIF's initial BDADDR!
549ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao         * This could be because the factory BDADDR was stored separatley in
550ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao         * the Controller's non-volatile memory rather than in device's file
551ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao         * system.
552ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao         **/
553ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        BTIF_TRACE_WARNING0("***********************************************");
554ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        BTIF_TRACE_WARNING6("BTIF init BDA was %02X:%02X:%02X:%02X:%02X:%02X",
555ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao            btif_local_bd_addr.address[0], btif_local_bd_addr.address[1],
556ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao            btif_local_bd_addr.address[2], btif_local_bd_addr.address[3],
557ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao            btif_local_bd_addr.address[4], btif_local_bd_addr.address[5]);
558ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        BTIF_TRACE_WARNING6("Controller BDA is %02X:%02X:%02X:%02X:%02X:%02X",
559ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao            local_bd[0], local_bd[1], local_bd[2],
560ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao            local_bd[3], local_bd[4], local_bd[5]);
561ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        BTIF_TRACE_WARNING0("***********************************************");
562ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao
563ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        bdcpy(btif_local_bd_addr.address, local_bd);
564ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao
565ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        //save the bd address to config file
566ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        bd2str(&btif_local_bd_addr, &buf);
567ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        btif_config_set_str("Local", "Adapter", "Address", buf);
568ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        btif_config_save();
569ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao
570ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        //fire HAL callback for property change
571ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        memcpy(buf, &btif_local_bd_addr, sizeof(bt_bdaddr_t));
572ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        prop.type = BT_PROPERTY_BDADDR;
573ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        prop.val = (void*)buf;
574ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        prop.len = sizeof(bt_bdaddr_t);
575ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao        HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, BT_STATUS_SUCCESS, 1, &prop);
576ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao    }
577ad66e170ebd53f8f5970844f9b28ec4d56125c13YK Jeffrey Chao
578e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bte_main_postload_cfg();
579e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE)
580e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bte_main_enable_lpm(TRUE);
581e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach#endif
582e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* add passing up bd address as well ? */
583e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
584e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* callback to HAL */
585e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (status == BTA_SUCCESS)
586e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
58729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        /* initialize a2dp service */
5882fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren        btif_av_init();
5892fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren
5902fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren        /* init rfcomm & l2cap api */
591b888218fb9061d8ddf41013dba6d0956b3322fd6zzy        btif_sock_init();
59229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
5937105408a110e1fa7bfa7b82637cd704a2c428f68fredc        /* init pan */
5947105408a110e1fa7bfa7b82637cd704a2c428f68fredc        btif_pan_init();
5950872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren
5962fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren        /* load did configuration */
5975edcdde0b51f3d5153990672f55422bbcabc5cecSreenidhi T        bte_load_did_conf(BTE_DID_CONF_FILE);
5982fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren
599a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huang#ifdef BTIF_DM_OOB_TEST
600a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huang        btif_dm_load_local_oob();
601a858acd87bb1cb8f584b66a50e16b1adcfd6a42fSen-Der Huang#endif
60229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        /* now fully enabled, update state */
60329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        btif_core_state = BTIF_CORE_STATE_ENABLED;
60429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
605254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren        HAL_CBACK(bt_hal_cbacks, adapter_state_changed_cb, BT_STATE_ON);
606e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
607e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    else
608e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
6092fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren        /* cleanup rfcomm & l2cap api */
610b888218fb9061d8ddf41013dba6d0956b3322fd6zzy        btif_sock_cleanup();
6112f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren
6127105408a110e1fa7bfa7b82637cd704a2c428f68fredc        btif_pan_cleanup();
6137105408a110e1fa7bfa7b82637cd704a2c428f68fredc
61429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        /* we failed to enable, reset state */
61529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        btif_core_state = BTIF_CORE_STATE_DISABLED;
6162fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren
617254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren        HAL_CBACK(bt_hal_cbacks, adapter_state_changed_cb, BT_STATE_OFF);
618e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
619e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
620e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
621e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
622e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
623e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_disable_bluetooth
624e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
625e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Inititates shutdown of Bluetooth system.
626e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  Any active links will be dropped and device entering
627e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  non connectable/discoverable mode
628254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren**
629254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          void
630e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
631e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
632e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_disable_bluetooth(void)
633e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
634e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    tBTA_STATUS status;
635e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
63629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (!btif_is_enabled())
637e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
638e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BTIF_TRACE_ERROR0("btif_disable_bluetooth : not yet enabled");
63929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        return BT_STATUS_NOT_READY;
640e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
641e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
64229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    BTIF_TRACE_DEBUG0("BTIF DISABLE BLUETOOTH");
64329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
644cc10fec21ba2bdb9c908509b1667c8c34d0e8c02Ravi Nagarajan    btif_dm_on_disable();
64529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    btif_core_state = BTIF_CORE_STATE_DISABLING;
6462fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren
6472fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren    /* cleanup rfcomm & l2cap api */
648e8070c41e25c6f0d368d7a53c0641524ea4630d2zzy    btif_sock_cleanup();
6492f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren
6507105408a110e1fa7bfa7b82637cd704a2c428f68fredc    btif_pan_cleanup();
6517105408a110e1fa7bfa7b82637cd704a2c428f68fredc
652e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    status = BTA_DisableBluetooth();
653e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
65454cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy    btif_config_flush();
65554cdfabe7c0ed98732d0641ffe8b19ff7284e7d4zzy
656e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (status != BTA_SUCCESS)
657e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
658e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BTIF_TRACE_ERROR1("disable bt failed (%d)", status);
65929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
66029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        /* reset the original state to allow attempting disable again */
66129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        btif_core_state = BTIF_CORE_STATE_ENABLED;
66229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
663e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return BT_STATUS_FAIL;
664e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
665254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren    return BT_STATUS_SUCCESS;
666e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
667e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
668e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
669e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
670e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_disable_bluetooth_evt
671e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
672e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Event notifying BT disable is now complete.
673254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren**                  Terminates main stack tasks and notifies HAL
674254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren**                  user with updated BT state.
675254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren**
676254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          void
677e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
678e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
679e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
680e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btif_disable_bluetooth_evt(void)
681e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
682e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
683e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
6849ab1946281916b06df6cb2e5eb37ad12cd4dce4aYK Jeffrey Chao#if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE)
6859ab1946281916b06df6cb2e5eb37ad12cd4dce4aYK Jeffrey Chao    bte_main_enable_lpm(FALSE);
6869ab1946281916b06df6cb2e5eb37ad12cd4dce4aYK Jeffrey Chao#endif
6879ab1946281916b06df6cb2e5eb37ad12cd4dce4aYK Jeffrey Chao
688e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bte_main_disable();
68929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
69029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    /* update local state */
69129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    btif_core_state = BTIF_CORE_STATE_DISABLED;
692e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
693e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* callback to HAL */
694254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren    HAL_CBACK(bt_hal_cbacks, adapter_state_changed_cb, BT_STATE_OFF);
695e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
69635207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    if (btif_shutdown_pending)
69735207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    {
69829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        BTIF_TRACE_DEBUG1("%s: calling btif_shutdown_bluetooth", __FUNCTION__);
69935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy        btif_shutdown_bluetooth();
70035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    }
701e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
702e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
703e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
704e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
705e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
706e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_shutdown_bluetooth
707e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
708e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Finalizes BT scheduler shutdown and terminates BTIF
709e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  task.
710254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren**
711254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          void
712e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
713e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
714e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
715e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_shutdown_bluetooth(void)
716e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
717e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
718e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
71929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (btif_is_enabled())
720e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
721e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        BTIF_TRACE_WARNING0("shutdown while still enabled, initiate disable");
722e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
723e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* shutdown called prior to disabling, initiate disable */
724e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btif_disable_bluetooth();
725e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        btif_shutdown_pending = 1;
72629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        return BT_STATUS_NOT_READY;
727e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
728e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
72935207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    btif_shutdown_pending = 0;
730e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
73135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    GKI_destroy_task(BTIF_TASK);
732fe1b7a6c392ef7ccc371e3bf580f2e853d0d6c65Ganesh Ganapathi Batta    btif_queue_release();
73335207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    bte_main_shutdown();
73429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
735a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    btif_dut_mode = 0;
736a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy
73729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    BTIF_TRACE_DEBUG1("%s done", __FUNCTION__);
7385140bed9a19aadca962184ebc9ed823d5d7cb745jechao
739e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return BT_STATUS_SUCCESS;
740e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
741e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
7425140bed9a19aadca962184ebc9ed823d5d7cb745jechao
7435140bed9a19aadca962184ebc9ed823d5d7cb745jechao/*******************************************************************************
7445140bed9a19aadca962184ebc9ed823d5d7cb745jechao**
7455140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Function         btif_disassociate_evt
7465140bed9a19aadca962184ebc9ed823d5d7cb745jechao**
7475140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Description      Event indicating btif_task is going down
7485140bed9a19aadca962184ebc9ed823d5d7cb745jechao**                  Detach btif_task to JVM
7495140bed9a19aadca962184ebc9ed823d5d7cb745jechao**
7505140bed9a19aadca962184ebc9ed823d5d7cb745jechao** Returns          void
7515140bed9a19aadca962184ebc9ed823d5d7cb745jechao**
7525140bed9a19aadca962184ebc9ed823d5d7cb745jechao*******************************************************************************/
7535140bed9a19aadca962184ebc9ed823d5d7cb745jechao
7545140bed9a19aadca962184ebc9ed823d5d7cb745jechaostatic bt_status_t btif_disassociate_evt(void)
755e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
756e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_DEBUG1("%s: notify DISASSOCIATE_JVM", __FUNCTION__);
757254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren
758254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren    HAL_CBACK(bt_hal_cbacks, thread_evt_cb, DISASSOCIATE_JVM);
759e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
76035207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    /* shutdown complete, all events notified and we reset HAL callbacks */
76135207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    bt_hal_cbacks = NULL;
76235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy
763e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return BT_STATUS_SUCCESS;
764e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
765e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
766a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/****************************************************************************
767a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
768a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**   BTIF Test Mode APIs
769a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
770a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*****************************************************************************/
771a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/*******************************************************************************
772a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
773a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Function         btif_dut_mode_cback
774a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
775a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Description     Callback invoked on completion of vendor specific test mode command
776a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
777a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Returns          None
778a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
779a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*******************************************************************************/
780a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamystatic void btif_dut_mode_cback( tBTM_VSC_CMPL *p )
781a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy{
782a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    /* For now nothing to be done. */
783a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy}
784e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
785a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/*******************************************************************************
786a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
787a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Function         btif_dut_mode_configure
788a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
789a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Description      Configure Test Mode - 'enable' to 1 puts the device in test mode and 0 exits
790a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**                       test mode
791a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
792a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Returns          BT_STATUS_SUCCESS on success
793a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
794a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*******************************************************************************/
795a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamybt_status_t btif_dut_mode_configure(uint8_t enable)
796a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy{
797a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
798a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy
799a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    if (btif_core_state != BTIF_CORE_STATE_ENABLED) {
800a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy        BTIF_TRACE_ERROR0("btif_dut_mode_configure : Bluetooth not enabled");
801a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy        return BT_STATUS_NOT_READY;
802a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    }
803a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy
804a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    btif_dut_mode = enable;
805a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    if (enable == 1) {
806a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy        BTA_EnableTestMode();
807a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    } else {
808a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy        BTA_DisableTestMode();
809a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    }
810a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    return BT_STATUS_SUCCESS;
811a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy}
812e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
813a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy/*******************************************************************************
814a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
815a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Function         btif_dut_mode_send
816a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
817a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Description     Sends a HCI Vendor specific command to the controller
818a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
819a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy** Returns          BT_STATUS_SUCCESS on success
820a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy**
821a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy*******************************************************************************/
822a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamybt_status_t btif_dut_mode_send(uint16_t opcode, uint8_t *buf, uint8_t len)
823a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy{
824a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    /* TODO: Check that opcode is a vendor command group */
825a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    BTIF_TRACE_DEBUG1("%s", __FUNCTION__);
826a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    if (!btif_is_dut_mode()) {
827a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy         BTIF_TRACE_ERROR0("Bluedroid HAL needs to be init with test_mode set to 1.");
828a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy         return BT_STATUS_FAIL;
829a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    }
830a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    BTM_VendorSpecificCommand(opcode, len, buf, btif_dut_mode_cback);
831a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy    return BT_STATUS_SUCCESS;
832a4eaddaccd236ec5c5add065e1b393072bdb8386Kausik Sinnaswamy}
833e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*****************************************************************************
834e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
835e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**   btif api adapter property functions
836e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
837e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*****************************************************************************/
838e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
839e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic bt_status_t btif_in_get_adapter_properties(void)
840e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
841e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_property_t properties[6];
842e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    uint32_t num_props;
843e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
844e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_bdaddr_t addr;
845e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_bdname_t name;
846e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_scan_mode_t mode;
847e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    uint32_t disc_timeout;
848e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_bdaddr_t bonded_devices[BTM_SEC_MAX_DEVICE_RECORDS];
849e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_uuid_t local_uuids[BT_MAX_NUM_UUIDS];
850e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props = 0;
851e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
852e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* BD_ADDR */
853e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_BDADDR,
854e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               sizeof(addr), &addr);
855e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_get_adapter_property(&properties[num_props]);
856e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props++;
857e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
858e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* BD_NAME */
859e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_BDNAME,
860e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               sizeof(name), &name);
861e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_get_adapter_property(&properties[num_props]);
862e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props++;
863e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
864e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* SCAN_MODE */
865e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_ADAPTER_SCAN_MODE,
866e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               sizeof(mode), &mode);
867e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_get_adapter_property(&properties[num_props]);
868e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props++;
869e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
870e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* DISC_TIMEOUT */
871e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT,
872e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               sizeof(disc_timeout), &disc_timeout);
873e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_get_adapter_property(&properties[num_props]);
874e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props++;
875e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
876e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* BONDED_DEVICES */
877e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_ADAPTER_BONDED_DEVICES,
878e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               sizeof(bonded_devices), bonded_devices);
879e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_get_adapter_property(&properties[num_props]);
880e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props++;
881e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
882e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    /* LOCAL UUIDs */
883e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_STORAGE_FILL_PROPERTY(&properties[num_props], BT_PROPERTY_UUIDS,
884e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               sizeof(local_uuids), local_uuids);
885e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_get_adapter_property(&properties[num_props]);
886e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props++;
887e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
888254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren    HAL_CBACK(bt_hal_cbacks, adapter_properties_cb,
889e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     BT_STATUS_SUCCESS, num_props, properties);
890e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
891e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return BT_STATUS_SUCCESS;
892e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
893e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
894e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic bt_status_t btif_in_get_remote_device_properties(bt_bdaddr_t *bd_addr)
895e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
896e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_property_t remote_properties[8];
897e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    uint32_t num_props = 0;
898e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
899e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_bdname_t name, alias;
900e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    uint32_t cod, devtype;
901e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_uuid_t remote_uuids[BT_MAX_NUM_UUIDS];
902e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
903e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memset(remote_properties, 0, sizeof(remote_properties));
904e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_BDNAME,
905e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               sizeof(name), &name);
906e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_get_remote_device_property(bd_addr,
907e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                            &remote_properties[num_props]);
908e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props++;
909e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
910e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_REMOTE_FRIENDLY_NAME,
911e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               sizeof(alias), &alias);
912e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_get_remote_device_property(bd_addr,
913e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                            &remote_properties[num_props]);
914e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props++;
915e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
916e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_CLASS_OF_DEVICE,
917e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               sizeof(cod), &cod);
918e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_get_remote_device_property(bd_addr,
919e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                            &remote_properties[num_props]);
920e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props++;
921e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
922e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_TYPE_OF_DEVICE,
923e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               sizeof(devtype), &devtype);
924e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_get_remote_device_property(bd_addr,
925e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                            &remote_properties[num_props]);
926e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props++;
927e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
928e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_STORAGE_FILL_PROPERTY(&remote_properties[num_props], BT_PROPERTY_UUIDS,
929e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               sizeof(remote_uuids), remote_uuids);
930e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_get_remote_device_property(bd_addr,
931e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                            &remote_properties[num_props]);
932e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    num_props++;
933e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
934254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren    HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb,
935e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     BT_STATUS_SUCCESS, bd_addr, num_props, remote_properties);
936e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
937e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return BT_STATUS_SUCCESS;
938e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
939e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
940e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
941e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
942e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
943e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         execute_storage_request
944e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
945e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Executes adapter storage request in BTIF context
946e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
947254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          bt_status_t
948e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
949e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
950e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
951e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void execute_storage_request(UINT16 event, char *p_param)
952e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
953e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    uint8_t is_local;
954254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren    int num_entries = 0;
955e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_status_t status = BT_STATUS_SUCCESS;
956254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren
957e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_EVENT1("execute storage request event : %d", event);
958e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
959e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch(event)
960e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
961e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTIF_CORE_STORAGE_ADAPTER_WRITE:
962e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
963e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            btif_storage_req_t *p_req = (btif_storage_req_t*)p_param;
964e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bt_property_t *p_prop = &(p_req->write_req.prop);
965e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            BTIF_TRACE_EVENT3("type: %d, len %d, 0x%x", p_prop->type,
966e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                               p_prop->len, p_prop->val);
967e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
968e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            status = btif_storage_set_adapter_property(p_prop);
969254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren            HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, p_prop);
970e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        } break;
971e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
972e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTIF_CORE_STORAGE_ADAPTER_READ:
973e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
974e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            btif_storage_req_t *p_req = (btif_storage_req_t*)p_param;
975e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            char buf[512];
976e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            bt_property_t prop;
977e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            prop.type = p_req->read_req.type;
978e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            prop.val = (void*)buf;
979e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            prop.len = sizeof(buf);
980e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            status = btif_storage_get_adapter_property(&prop);
981254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren            HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 1, &prop);
982e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        } break;
983254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren
984e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTIF_CORE_STORAGE_ADAPTER_READ_ALL:
985e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
986e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            status = btif_in_get_adapter_properties();
987e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        } break;
988e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
989e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTIF_CORE_STORAGE_NOTIFY_STATUS:
990e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
991254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren            HAL_CBACK(bt_hal_cbacks, adapter_properties_cb, status, 0, NULL);
992e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        } break;
993e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
994e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        default:
995e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            BTIF_TRACE_ERROR2("%s invalid event id (%d)", __FUNCTION__, event);
996e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
997e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
998e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
999e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1000e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void execute_storage_remote_request(UINT16 event, char *p_param)
1001e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1002e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_status_t status = BT_STATUS_FAIL;
1003e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_property_t prop;
1004e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1005e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_EVENT1("execute storage remote request event : %d", event);
1006e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1007e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch (event)
1008e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1009e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTIF_CORE_STORAGE_REMOTE_READ:
1010e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1011e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            char buf[1024];
1012e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            btif_storage_req_t *p_req = (btif_storage_req_t*)p_param;
1013e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            prop.type = p_req->read_req.type;
1014e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            prop.val = (void*) buf;
1015e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            prop.len = sizeof(buf);
1016e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1017e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            status = btif_storage_get_remote_device_property(&(p_req->read_req.bd_addr),
1018e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                                             &prop);
1019254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren            HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb,
1020e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                            status, &(p_req->read_req.bd_addr), 1, &prop);
1021e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }break;
1022e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTIF_CORE_STORAGE_REMOTE_WRITE:
1023e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1024e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach           btif_storage_req_t *p_req = (btif_storage_req_t*)p_param;
1025e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach           status = btif_storage_set_remote_device_property(&(p_req->write_req.bd_addr),
1026e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                                            &(p_req->write_req.prop));
1027e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }break;
1028e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BTIF_CORE_STORAGE_REMOTE_READ_ALL:
1029e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        {
1030e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach           btif_storage_req_t *p_req = (btif_storage_req_t*)p_param;
1031e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach           btif_in_get_remote_device_properties(&p_req->read_req.bd_addr);
1032e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        }break;
1033e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1034e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1035e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1036e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btif_adapter_properties_evt(bt_status_t status, uint32_t num_props,
1037e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                    bt_property_t *p_props)
1038e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1039254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren    HAL_CBACK(bt_hal_cbacks, adapter_properties_cb,
1040e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     status, num_props, p_props);
1041e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1042e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1043e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachvoid btif_remote_properties_evt(bt_status_t status, bt_bdaddr_t *remote_addr,
1044e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                   uint32_t num_props, bt_property_t *p_props)
1045e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1046254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren    HAL_CBACK(bt_hal_cbacks, remote_device_properties_cb,
1047e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                     status, remote_addr, num_props, p_props);
1048e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1049e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1050e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1051e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1052e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_in_storage_request_copy_cb
1053e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1054e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description     Switch context callback function to perform the deep copy for
1055e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                 both the adapter and remote_device property API
1056e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1057e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          None
1058e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1059e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1060e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachstatic void btif_in_storage_request_copy_cb(UINT16 event,
1061e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                                 char *p_new_buf, char *p_old_buf)
1062e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1063e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     btif_storage_req_t *new_req = (btif_storage_req_t*)p_new_buf;
1064e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     btif_storage_req_t *old_req = (btif_storage_req_t*)p_old_buf;
1065e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1066e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     BTIF_TRACE_EVENT1("%s", __FUNCTION__);
1067e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     switch (event)
1068e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     {
1069e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         case BTIF_CORE_STORAGE_REMOTE_WRITE:
1070e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         case BTIF_CORE_STORAGE_ADAPTER_WRITE:
1071e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         {
1072e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             bdcpy(new_req->write_req.bd_addr.address, old_req->write_req.bd_addr.address);
1073e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             /* Copy the member variables one at a time */
1074e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             new_req->write_req.prop.type = old_req->write_req.prop.type;
1075e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             new_req->write_req.prop.len = old_req->write_req.prop.len;
1076e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1077e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             new_req->write_req.prop.val = (UINT8 *)(p_new_buf + sizeof(btif_storage_req_t));
1078e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach             memcpy(new_req->write_req.prop.val, old_req->write_req.prop.val,
1079e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    old_req->write_req.prop.len);
1080e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach         }break;
1081e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach     }
1082e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1083e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1084e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1085e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1086e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_get_adapter_properties
1087e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1088e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Fetch all available properties (local & remote)
1089e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1090254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          bt_status_t
1091e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1092e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1093e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1094e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_get_adapter_properties(void)
1095e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1096e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_EVENT1("%s", __FUNCTION__);
1097e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
109829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (!btif_is_enabled())
109929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        return BT_STATUS_NOT_READY;
1100e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1101e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return btif_transfer_context(execute_storage_request,
1102e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 BTIF_CORE_STORAGE_ADAPTER_READ_ALL,
1103e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 NULL, 0, NULL);
1104e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1105e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1106e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1107e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1108e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_get_adapter_property
1109e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1110e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Fetches property value from local cache
1111e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1112254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          bt_status_t
1113e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1114e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1115e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1116e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_get_adapter_property(bt_property_type_t type)
1117e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1118e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_req_t req;
1119e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1120e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_EVENT2("%s %d", __FUNCTION__, type);
1121e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
112235207a7fe091c5ade3ac3a80acf8366beb6e21daKausik Sinnaswamy    /* Allow get_adapter_property only for BDADDR and BDNAME if BT is disabled */
112329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (!btif_is_enabled() && (type != BT_PROPERTY_BDADDR) && (type != BT_PROPERTY_BDNAME))
112429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        return BT_STATUS_NOT_READY;
1125e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1126e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memset(&(req.read_req.bd_addr), 0, sizeof(bt_bdaddr_t));
1127e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    req.read_req.type = type;
1128e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1129e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return btif_transfer_context(execute_storage_request,
1130e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 BTIF_CORE_STORAGE_ADAPTER_READ,
1131e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                (char*)&req, sizeof(btif_storage_req_t), NULL);
1132e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1133e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1134e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1135e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1136e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_set_adapter_property
1137e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1138254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Description      Updates core stack with property value and stores it in
1139e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  local cache
1140e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1141254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns          bt_status_t
1142e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1143e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1144e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1145e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_set_adapter_property(const bt_property_t *property)
1146e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1147e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_req_t req;
1148e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    bt_status_t status = BT_STATUS_SUCCESS;
1149e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    int storage_req_id = BTIF_CORE_STORAGE_NOTIFY_STATUS; /* default */
1150be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta    char bd_name[BTM_MAX_LOC_BD_NAME_LEN +1];
1151be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta    UINT16  name_len = 0;
1152e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1153e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    BTIF_TRACE_EVENT3("btif_set_adapter_property type: %d, len %d, 0x%x",
1154e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                      property->type, property->len, property->val);
1155e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
115629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (!btif_is_enabled())
115729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        return BT_STATUS_NOT_READY;
1158e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1159e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    switch(property->type)
1160e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1161e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BT_PROPERTY_BDNAME:
1162e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1163be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta                name_len = property->len > BTM_MAX_LOC_BD_NAME_LEN ? BTM_MAX_LOC_BD_NAME_LEN:
1164be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta                                                                     property->len;
1165be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta                memcpy(bd_name,property->val, name_len);
1166be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta                bd_name[name_len] = '\0';
1167e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1168be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta                BTIF_TRACE_EVENT1("set property name : %s", (char *)bd_name);
1169be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta
1170be7063ce21ac1e2f67d489c29a1e979dc3d8f075Ganesh Ganapathi Batta                BTA_DmSetDeviceName((char *)bd_name);
1171254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren
1172e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE;
1173e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1174e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1175254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren
1176e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BT_PROPERTY_ADAPTER_SCAN_MODE:
1177e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            {
1178e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                bt_scan_mode_t mode = *(bt_scan_mode_t*)property->val;
1179e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                tBTA_DM_DISC disc_mode;
1180e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                tBTA_DM_CONN conn_mode;
1181e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1182e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                switch(mode)
1183e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                {
1184e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    case BT_SCAN_MODE_NONE:
1185e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        disc_mode = BTA_DM_NON_DISC;
1186e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        conn_mode = BTA_DM_NON_CONN;
1187e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        break;
1188254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren
1189e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    case BT_SCAN_MODE_CONNECTABLE:
1190e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        disc_mode = BTA_DM_NON_DISC;
1191e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        conn_mode = BTA_DM_CONN;
1192e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        break;
1193254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren
1194e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    case BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE:
1195e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        disc_mode = BTA_DM_GENERAL_DISC;
1196e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        conn_mode = BTA_DM_CONN;
1197e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        break;
1198e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1199e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                    default:
1200e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        BTIF_TRACE_ERROR1("invalid scan mode (0x%x)", mode);
1201e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                        return BT_STATUS_PARM_INVALID;
1202e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                }
1203254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren
1204e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                BTIF_TRACE_EVENT1("set property scan mode : %x", mode);
1205254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren
1206e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                BTA_DmSetVisibility(disc_mode, conn_mode, BTA_DM_IGNORE, BTA_DM_IGNORE);
1207e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1208e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE;
1209e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            }
1210e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1211a379d445a64ce499ff8f32ffa3db49e570da2945Srikanth Uppala        case BT_PROPERTY_ADAPTER_DISCOVERY_TIMEOUT:
1212a379d445a64ce499ff8f32ffa3db49e570da2945Srikanth Uppala            {
12132f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren                /* Nothing to do beside store the value in NV.  Java
12142f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren                   will change the SCAN_MODE property after setting timeout,
12152f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren                   if required */
1216a379d445a64ce499ff8f32ffa3db49e570da2945Srikanth Uppala                storage_req_id = BTIF_CORE_STORAGE_ADAPTER_WRITE;
1217a379d445a64ce499ff8f32ffa3db49e570da2945Srikanth Uppala            }
1218a379d445a64ce499ff8f32ffa3db49e570da2945Srikanth Uppala            break;
1219e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BT_PROPERTY_BDADDR:
1220e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BT_PROPERTY_UUIDS:
1221e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BT_PROPERTY_ADAPTER_BONDED_DEVICES:
1222e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        case BT_PROPERTY_REMOTE_FRIENDLY_NAME:
1223e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            /* no write support through HAL, these properties are only populated from BTA events */
1224e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            status = BT_STATUS_FAIL;
1225e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1226e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        default:
1227254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren            BTIF_TRACE_ERROR1("btif_get_adapter_property : invalid type %d",
1228e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            property->type);
1229254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren            status = BT_STATUS_FAIL;
1230e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach            break;
1231e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1232e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1233e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    if (storage_req_id != BTIF_CORE_STORAGE_NO_ACTION)
1234e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    {
1235e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        int btif_status;
1236e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        /* pass on to storage for updating local database */
1237e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1238e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memset(&(req.write_req.bd_addr), 0, sizeof(bt_bdaddr_t));
1239e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        memcpy(&(req.write_req.prop), property, sizeof(bt_property_t));
1240e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1241e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach        return btif_transfer_context(execute_storage_request,
1242e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                     storage_req_id,
1243e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                     (char*)&req,
1244e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                     sizeof(btif_storage_req_t)+property->len,
1245e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                     btif_in_storage_request_copy_cb);
1246e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    }
1247e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1248e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return status;
1249e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1250e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1251e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1252e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1253e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1254e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_get_remote_device_property
1255e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1256e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Fetches the remote device property from the NVRAM
1257e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1258e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          bt_status_t
1259e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1260e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1261e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_get_remote_device_property(bt_bdaddr_t *remote_addr,
1262e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                                 bt_property_type_t type)
1263e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1264e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_req_t req;
1265e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
126629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (!btif_is_enabled())
126729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        return BT_STATUS_NOT_READY;
1268e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1269e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memcpy(&(req.read_req.bd_addr), remote_addr, sizeof(bt_bdaddr_t));
1270e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    req.read_req.type = type;
1271e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return btif_transfer_context(execute_storage_remote_request,
1272e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 BTIF_CORE_STORAGE_REMOTE_READ,
1273e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 (char*)&req, sizeof(btif_storage_req_t),
1274e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 NULL);
1275e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1276e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1277e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1278e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1279e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_get_remote_device_properties
1280e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1281e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Fetches all the remote device properties from NVRAM
1282e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1283e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          bt_status_t
1284e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1285e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1286e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_get_remote_device_properties(bt_bdaddr_t *remote_addr)
1287e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1288e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_req_t req;
1289254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren
129029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (!btif_is_enabled())
129129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        return BT_STATUS_NOT_READY;
1292e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1293e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memcpy(&(req.read_req.bd_addr), remote_addr, sizeof(bt_bdaddr_t));
1294e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return btif_transfer_context(execute_storage_remote_request,
1295e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 BTIF_CORE_STORAGE_REMOTE_READ_ALL,
1296e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 (char*)&req, sizeof(btif_storage_req_t),
1297e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 NULL);
1298e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1299e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1300e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1301e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1302e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_set_remote_device_property
1303e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1304e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Writes the remote device property to NVRAM.
1305e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  Currently, BT_PROPERTY_REMOTE_FRIENDLY_NAME is the only
1306e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  remote device property that can be set
1307e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1308e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          bt_status_t
1309e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1310e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1311e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbachbt_status_t btif_set_remote_device_property(bt_bdaddr_t *remote_addr,
1312e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                                 const bt_property_t *property)
1313e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
1314e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    btif_storage_req_t req;
1315e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
131629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (!btif_is_enabled())
131729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        return BT_STATUS_NOT_READY;
1318e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1319e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memcpy(&(req.write_req.bd_addr), remote_addr, sizeof(bt_bdaddr_t));
1320e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    memcpy(&(req.write_req.prop), property, sizeof(bt_property_t));
1321e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1322e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return btif_transfer_context(execute_storage_remote_request,
1323e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 BTIF_CORE_STORAGE_REMOTE_WRITE,
1324e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 (char*)&req,
1325e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 sizeof(btif_storage_req_t)+property->len,
1326e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                 btif_in_storage_request_copy_cb);
1327e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1328e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1329e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1330e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach/*******************************************************************************
1331e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1332e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Function         btif_get_remote_service_record
1333e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1334e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Description      Looks up the service matching uuid on the remote device
1335e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**                  and fetches the SCN and service_name if the UUID is found
1336e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1337e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach** Returns          bt_status_t
1338e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach**
1339e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach*******************************************************************************/
1340254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenbt_status_t btif_get_remote_service_record(bt_bdaddr_t *remote_addr,
1341e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach                                               bt_uuid_t *uuid)
1342e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach{
134329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (!btif_is_enabled())
134429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        return BT_STATUS_NOT_READY;
1345e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
1346e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach    return btif_dm_get_remote_service_record(remote_addr, uuid);
1347e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach}
1348e448862a47c08eb23185aaed574b39264f5005fcAndre Eisenbach
134929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
135029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren/*******************************************************************************
135129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren**
135229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Function         btif_get_enabled_services_mask
135329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren**
135429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Description      Fetches currently enabled services
135529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren**
135629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren** Returns          tBTA_SERVICE_MASK
135729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren**
135829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren*******************************************************************************/
135929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
1360b23905722d8a1c714d66aaee2da5712694596426Kausik SinnaswamytBTA_SERVICE_MASK btif_get_enabled_services_mask(void)
1361b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy{
1362b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy    return btif_enabled_services;
1363b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy}
1364b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy
1365b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy/*******************************************************************************
1366b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**
1367b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Function         btif_enable_service
1368b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**
1369b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Description      Enables the service 'service_ID' to the service_mask.
1370b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**                  Upon BT enable, BTIF core shall invoke the BTA APIs to
1371b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**                  enable the profiles
1372b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**
1373b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Returns          bt_status_t
1374b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**
1375b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy*******************************************************************************/
1376b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamybt_status_t btif_enable_service(tBTA_SERVICE_ID service_id)
1377b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy{
137829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    tBTA_SERVICE_ID *p_id = &service_id;
137929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
138029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    /* If BT is enabled, we need to switch to BTIF context and trigger the
138129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren     * enable for that profile
138229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren     *
138329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren     * Otherwise, we just set the flag. On BT_Enable, the DM will trigger
138429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren     * enable for the profiles that have been enabled */
138529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
138629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    btif_enabled_services |= (1 << service_id);
138729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
138829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    BTIF_TRACE_ERROR2("%s: current services:0x%x", __FUNCTION__, btif_enabled_services);
138929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
139029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (btif_is_enabled())
139129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    {
139229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        btif_transfer_context(btif_dm_execute_service_request,
139329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren                              BTIF_DM_ENABLE_SERVICE,
139429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren                              (char*)p_id, sizeof(tBTA_SERVICE_ID), NULL);
139529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    }
139629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
139729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    return BT_STATUS_SUCCESS;
1398b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy}
1399b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy/*******************************************************************************
1400b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**
1401b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Function         btif_disable_service
1402b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**
1403b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Description      Disables the service 'service_ID' to the service_mask.
1404b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**                  Upon BT disable, BTIF core shall invoke the BTA APIs to
1405b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**                  disable the profiles
1406b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**
1407b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy** Returns          bt_status_t
1408b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy**
1409b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy*******************************************************************************/
1410b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamybt_status_t btif_disable_service(tBTA_SERVICE_ID service_id)
1411b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy{
141229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    tBTA_SERVICE_ID *p_id = &service_id;
141329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
141429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    /* If BT is enabled, we need to switch to BTIF context and trigger the
141529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren     * disable for that profile so that the appropriate uuid_property_changed will
141629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren     * be triggerred. Otherwise, we just need to clear the service_id in the mask
141729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren     */
141829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
141929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    btif_enabled_services &=  (tBTA_SERVICE_MASK)(~(1<<service_id));
142029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
142129fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    BTIF_TRACE_ERROR2("%s: Current Services:0x%x", __FUNCTION__, btif_enabled_services);
142229fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
142329fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    if (btif_is_enabled())
142429fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    {
142529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren        btif_transfer_context(btif_dm_execute_service_request,
142629fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren                              BTIF_DM_DISABLE_SERVICE,
142729fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren                              (char*)p_id, sizeof(tBTA_SERVICE_ID), NULL);
142829fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    }
142929fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren
143029fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren    return BT_STATUS_SUCCESS;
1431b23905722d8a1c714d66aaee2da5712694596426Kausik Sinnaswamy}
1432