15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2003-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * This file contains the action functions for device manager state 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * machine. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bd.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_dm_int.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h> 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr); 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_set_mode(BD_ADDR peer_addr, BOOLEAN timed_out ); 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_timer_cback(void *p_tle); 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_btm_cback(BD_ADDR bd_addr, tBTM_PM_STATUS status, UINT16 value, UINT8 hci_status); 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_park(BD_ADDR peer_addr); 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE *p_peer_dev, UINT8 index); 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_is_sco_active (); 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_hid_check(BOOLEAN bScoActive); 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_set_sniff_policy(tBTA_DM_PEER_DEVICE *p_dev, BOOLEAN bDisable); 45ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE) 47ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (defined BTA_HH_INCLUDED && BTA_HH_INCLUDED == TRUE) 48ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "../hh/bta_hh_int.h" 49ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* BTA_DM_PM_SSR1 will be dedicated for HH SSR setting entry, no other profile can use it */ 50ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define BTA_DM_PM_SSR_HH BTA_DM_PM_SSR1 51ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_ssr(BD_ADDR peer_addr); 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_DM_CONNECTED_SRVCS bta_dm_conn_srvcs; 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_init_pm 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initialises the BT low power manager 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_init_pm(void) 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs)); 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if there are no power manger entries, so not register */ 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_bta_dm_pm_cfg[0].app_id != 0) 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_pm_register((tBTA_SYS_CONN_CBACK*)bta_dm_pm_cback); 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_PmRegister((BTM_PM_REG_SET | BTM_PM_REG_NOTIF), &bta_dm_cb.pm_id, 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_btm_cback); 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_disable_pm 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Disable PM 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_disable_pm(void) 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_pm_register(NULL); 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_PmRegister( BTM_PM_DEREG, &bta_dm_cb.pm_id, NULL); 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Need to stop all active timers. */ 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i=0; i<BTA_DM_NUM_PM_TIMER; i++) 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_dm_cb.pm_timer[i].in_use) 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 108e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("stop dm_pm_timer:%d", i); 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer); 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_cb.pm_timer[i].in_use = FALSE; 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_pm_stop_timer 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description stop a PM timer 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_stop_timer(BD_ADDR peer_addr) 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i=0; i<BTA_DM_NUM_PM_TIMER; i++) 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_dm_cb.pm_timer[i].in_use && !bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr)) 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 134e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("stop dm_pm_timer:%d", i); 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_stop_timer(&bta_dm_cb.pm_timer[i].timer); 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_cb.pm_timer[i].in_use = FALSE; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_pm_cback 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Conn change callback from sys for low power management 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr) 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i,j; 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 policy_setting; 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS btm_status; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_VERSION_INFO vers; 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE) 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int index = BTA_DM_PM_SSR0; 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PEER_DEVICE *p_dev; 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 165e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_dm_pm_cback: st(%d), id(%d), app(%d)", status, id, app_id); 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btm_status = BTM_ReadLocalVersion (&vers); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = bta_dm_find_peer_device(peer_addr); 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 170ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* Disable/Enable sniff policy on the SCO link if sco Up/Down. Will be removed in 2.2*/ 171ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((p_dev) && 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((status == BTA_SYS_SCO_OPEN) || (status == BTA_SYS_SCO_CLOSE)) ) 173ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 174ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if ((btm_status == BTM_SUCCESS) && 175ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (vers.manufacturer == LMP_COMPID_BROADCOM) && 176ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta (vers.hci_version < HCI_PROTO_VERSION_2_0)) 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 178ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta bta_dm_pm_set_sniff_policy(p_dev, (status == BTA_SYS_SCO_OPEN)); 179ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find if there is an power mode entry for the service */ 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i=1; i<=p_bta_dm_pm_cfg[0].app_id; i++) 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((p_bta_dm_pm_cfg[i].id == id) 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_bta_dm_pm_cfg[i].app_id == BTA_ALL_APP_ID ) || (p_bta_dm_pm_cfg[i].app_id == app_id ))) 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no entries are there for the app_id and subystem in p_bta_dm_pm_spec*/ 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(i> p_bta_dm_pm_cfg[0].app_id) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_stop_timer(peer_addr); 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /*p_dev = bta_dm_find_peer_device(peer_addr);*/ 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE) 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set SSR parameters on SYS CONN OPEN */ 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((BTA_SYS_CONN_OPEN == status) && p_dev && (p_dev->info & BTA_DM_DI_USE_SSR)) 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index = p_bta_dm_pm_spec[p_bta_dm_pm_cfg[i].spec_idx].ssr; 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no action for the event */ 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_bta_dm_pm_spec[p_bta_dm_pm_cfg[i].spec_idx].actn_tbl[status][0].power_mode == BTA_DM_PM_NO_ACTION) 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE) 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(BTA_DM_PM_SSR0 == index) /* and do not need to set SSR, return. */ 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(j=0; j<bta_dm_conn_srvcs.count ; j++) 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if an entry already present */ 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((bta_dm_conn_srvcs.conn_srvc[j].id == id) 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (bta_dm_conn_srvcs.conn_srvc[j].app_id == app_id ) 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && !bdcmp(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr)) 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if subsystem has no more preference on the power mode remove 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project the cb */ 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_bta_dm_pm_spec[p_bta_dm_pm_cfg[i].spec_idx].actn_tbl[status][0].power_mode == BTA_DM_PM_NO_PREF) 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(j != bta_dm_conn_srvcs.count) 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_conn_srvcs.count--; 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(; j<bta_dm_conn_srvcs.count ; j++) 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&bta_dm_conn_srvcs.conn_srvc[j], &bta_dm_conn_srvcs.conn_srvc[j+1], sizeof(bta_dm_conn_srvcs.conn_srvc[j])); 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 244e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("bta_dm_act no entry for connected service cbs"); 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if(j == bta_dm_conn_srvcs.count ) 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if we have more connected service that cbs */ 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_dm_conn_srvcs.count == BTA_DM_NUM_CONN_SRVS) 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 253e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("bta_dm_act no more connected service cbs"); 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fill in a new cb */ 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_conn_srvcs.conn_srvc[j].id = id; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_conn_srvcs.conn_srvc[j].app_id = app_id; 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr); 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 262e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("new conn_srvc id:%d, app_id:%d", id, app_id); 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_conn_srvcs.count++; 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_conn_srvcs.conn_srvc[j].state = status; 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no service is added or removed. only updating status. */ 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_conn_srvcs.conn_srvc[j].state = status; 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_dev) 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->pm_mode_attempted = 0; 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->pm_mode_failed = 0; 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE) 280ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if(p_bta_dm_ssr_spec[index].max_lat 281ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (defined BTA_HH_INCLUDED && BTA_HH_INCLUDED == TRUE) 282ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta || index == BTA_DM_PM_SSR_HH 283ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 284ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta ) 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_ssr(peer_addr); 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_set_mode(peer_addr, FALSE); 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* perform the HID link workaround if needed 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1. If SCO up/down event is received OR 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2. If HID connection open is received and SCO is already active. 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** This will handle the case where HID connects when SCO already active 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (btm_status == BTM_SUCCESS) && 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ( ((status == BTA_SYS_SCO_OPEN) || (status == BTA_SYS_SCO_CLOSE)) || 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ((status == BTA_SYS_CONN_OPEN) && (id == BTA_ID_HH) && bta_dm_pm_is_sco_active()) ) ) 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN bScoActive; 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTA_SYS_CONN_OPEN) 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bScoActive = TRUE; 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bScoActive = (status == BTA_SYS_SCO_OPEN); 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_hid_check(bScoActive); 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_pm_set_mode 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Set the power mode for the device 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_set_mode(BD_ADDR peer_addr, BOOLEAN timed_out ) 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PM_ACTTION pm_action = BTA_DM_PM_NO_ACTION; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 timeout = 0; 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i,j; 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PM_ACTTION failed_pm = 0; 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PEER_DEVICE *p_peer_device = NULL; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PM_ACTTION allowed_modes = 0; 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PM_ACTTION pref_modes = 0; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PM_CFG *p_pm_cfg; 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PM_SPEC *p_pm_spec; 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PM_ACTN *p_act0, *p_act1; 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_SRVCS *p_srvcs; 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!bta_dm_cb.device_list.count) 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* see if any attempt to put device in low power mode failed */ 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer_device = bta_dm_find_peer_device(peer_addr); 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if no peer device found return */ 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer_device == NULL) 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project failed_pm = p_peer_device->pm_mode_failed; 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i=0; i<bta_dm_conn_srvcs.count ; i++) 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_srvcs = &bta_dm_conn_srvcs.conn_srvc[i]; 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!bdcmp(p_srvcs->peer_bdaddr, peer_addr)) 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* p_bta_dm_pm_cfg[0].app_id is the number of entries */ 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(j=1; j<=p_bta_dm_pm_cfg[0].app_id; j++) 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((p_bta_dm_pm_cfg[j].id == p_srvcs->id) 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_bta_dm_pm_cfg[j].app_id == BTA_ALL_APP_ID ) || 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_bta_dm_pm_cfg[j].app_id == p_srvcs->app_id))) 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_pm_cfg = &p_bta_dm_pm_cfg[j]; 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_pm_spec = &p_bta_dm_pm_spec[p_pm_cfg->spec_idx]; 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_act0 = &p_pm_spec->actn_tbl[p_srvcs->state][0]; 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_act1 = &p_pm_spec->actn_tbl[p_srvcs->state][1]; 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 371e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_dm_pm_set_mode: srvcsid: %d, state: %d, j: %d", p_srvcs->id, p_srvcs->state, j); 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project allowed_modes |= p_pm_spec->allow_mask; 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* PM actions are in the order of strictness */ 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* first check if the first preference is ok */ 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(failed_pm & p_act0->power_mode)) 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pref_modes |= p_act0->power_mode; 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_act0->power_mode > pm_action) 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pm_action = p_act0->power_mode; 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project timeout = p_act0->timeout; 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if first preference has already failed, try second preference */ 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if(!(failed_pm & p_act1->power_mode)) 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pref_modes |= p_act1->power_mode; 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_act1->power_mode > pm_action) 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pm_action = p_act1->power_mode; 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project timeout = p_act1->timeout; 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(pm_action & (BTA_DM_PM_PARK | BTA_DM_PM_SNIFF)) 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* some service don't like the mode */ 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!(allowed_modes & pm_action)) 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* select the other mode if its allowed and preferred, otherwise 0 which is BTA_DM_PM_NO_ACTION */ 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pm_action = (allowed_modes & (BTA_DM_PM_PARK | BTA_DM_PM_SNIFF) & pref_modes); 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no timeout needed if no action is required */ 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(pm_action == BTA_DM_PM_NO_ACTION) 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project timeout = 0; 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!timed_out && timeout) 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i=0; i<BTA_DM_NUM_PM_TIMER; i++) 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!bta_dm_cb.pm_timer[i].in_use) 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_cb.pm_timer[i].in_use = TRUE; 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr); 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_cb.pm_timer[i].timer.p_cback = bta_dm_pm_timer_cback; 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_start_timer(&bta_dm_cb.pm_timer[i].timer, 0, timeout); 436e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("start dm_pm_timer:%d, %d", i, timeout); 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no more timers */ 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(i==BTA_DM_NUM_PM_TIMER) 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 446e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("bta_dm_act dm_pm_timer no more"); 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(pm_action == BTA_DM_PM_NO_ACTION) 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if(pm_action == BTA_DM_PM_PARK) 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer_device->pm_mode_attempted = BTA_DM_PM_PARK; 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_park(peer_addr); 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if(pm_action & BTA_DM_PM_SNIFF) 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* dont initiate SNIFF, if link_policy has it disabled */ 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer_device->link_policy & HCI_ENABLE_SNIFF_MODE) 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer_device->pm_mode_attempted = BTA_DM_PM_SNIFF; 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_sniff(p_peer_device, (UINT8)(pm_action & 0x0F) ); 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 472e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_dm_pm_set_mode: Link policy disallows SNIFF, ignore request"); 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if(pm_action == BTA_DM_PM_ACTIVE) 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_active(peer_addr); 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_pm_park 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Switch to park mode. 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if park attempted, FALSE otherwise. 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_park(BD_ADDR peer_addr) 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PM_MODE mode = BTM_PM_STS_ACTIVE; 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if not in park mode, switch to park */ 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ReadPowerMode(peer_addr, &mode); 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(mode != BTM_PM_MD_PARK) 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetPowerMode (bta_dm_cb.pm_id, peer_addr, &p_bta_dm_pm_md[BTA_DM_PM_PARK_IDX]); 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_ag_pm_sniff 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Switch to sniff mode. 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if sniff attempted, FALSE otherwise. 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE *p_peer_dev, UINT8 index) 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PM_MODE mode = BTM_PM_STS_ACTIVE; 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PM_PWR_MD pwr_md; 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_STATUS status; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_ReadPowerMode(p_peer_dev->peer_bdaddr, &mode); 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE) 532e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d, info:x%x", mode, index, p_peer_dev->info); 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (mode != BTM_PM_MD_SNIFF || 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadLocalFeatures ()) && 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadRemoteFeatures (p_peer_dev->peer_bdaddr)) && 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project !(p_peer_dev->info & BTA_DM_DI_USE_SSR))) 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 538e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d", mode, index); 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(mode != BTM_PM_MD_SNIFF) 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if the current mode is not sniff, issue the sniff command. 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * If sniff, but SSR is not used in this link, still issue the command */ 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(&pwr_md, &p_bta_dm_pm_md[index], sizeof (tBTM_PM_PWR_MD)); 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer_dev->info & BTA_DM_DI_INT_SNIFF) 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pwr_md.mode |= BTM_PM_MD_FORCE; 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = BTM_SetPowerMode (bta_dm_cb.pm_id, p_peer_dev->peer_bdaddr, &pwr_md); 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == BTM_CMD_STORED|| status == BTM_CMD_STARTED) 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF); 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer_dev->info |= BTA_DM_DI_SET_SNIFF; 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (status == BTM_SUCCESS) 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 557e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_dm_pm_sniff BTM_SetPowerMode() returns BTM_SUCCESS"); 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF); 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else /* error */ 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 562e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_dm_pm_sniff BTM_SetPowerMode() returns ERROR status=%d", status); 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF); 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* else already in sniff and is using SSR, do nothing */ 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_pm_ssr 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description checks and sends SSR parameters 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE) 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_ssr(BD_ADDR peer_addr) 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_SSR_SPEC *p_spec, *p_spec_cur; 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i,j; 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int ssr = BTA_DM_PM_SSR0; 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* go through the connected services */ 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i=0; i<bta_dm_conn_srvcs.count ; i++) 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!bdcmp(bta_dm_conn_srvcs.conn_srvc[i].peer_bdaddr, peer_addr)) 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* p_bta_dm_pm_cfg[0].app_id is the number of entries */ 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(j=1; j<=p_bta_dm_pm_cfg[0].app_id; j++) 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find the associated p_bta_dm_pm_cfg */ 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if((p_bta_dm_pm_cfg[j].id == bta_dm_conn_srvcs.conn_srvc[i].id) 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && ((p_bta_dm_pm_cfg[j].app_id == BTA_ALL_APP_ID ) 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_bta_dm_pm_cfg[j].app_id == bta_dm_conn_srvcs.conn_srvc[i].app_id))) 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 600e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("bta_dm_pm_ssr conn_srvc id:%d, app_id:%d", 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_conn_srvcs.conn_srvc[i].id, bta_dm_conn_srvcs.conn_srvc[i].app_id); 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* find the ssr index with the smallest max latency. */ 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_spec_cur = &p_bta_dm_ssr_spec[p_bta_dm_pm_spec[p_bta_dm_pm_cfg[j].spec_idx].ssr]; 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_spec = &p_bta_dm_ssr_spec[ssr]; 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 610ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (defined BTA_HH_INCLUDED && BTA_HH_INCLUDED == TRUE) 611ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta /* HH has the per connection SSR preference, already read the SSR params from BTA HH */ 612ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (p_bta_dm_pm_spec[p_bta_dm_pm_cfg[j].spec_idx].ssr == BTA_DM_PM_SSR_HH) 613ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta { 614ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta if (bta_hh_read_ssr_param(peer_addr, &p_spec_cur->max_lat, &p_spec_cur->min_rmt_to) == BTA_HH_ERR) 615ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta continue; 616ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta } 617ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_spec_cur->max_lat < p_spec->max_lat || 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (ssr == BTA_DM_PM_SSR0 && p_bta_dm_pm_spec[p_bta_dm_pm_cfg[j].spec_idx].ssr != BTA_DM_PM_SSR0)) 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ssr = p_bta_dm_pm_spec[p_bta_dm_pm_cfg[j].spec_idx].ssr; 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_spec = &p_bta_dm_ssr_spec[ssr]; 628e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("bta_dm_pm_ssr:%d, lat:%d", ssr, p_spec->max_lat); 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_spec->max_lat) 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set the SSR parameters. */ 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetSsrParams (peer_addr, p_spec->max_lat, 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_spec->min_rmt_to, p_spec->min_loc_to); 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_pm_active 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Brings connection to active mode 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_pm_active(BD_ADDR peer_addr) 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTM_PM_PWR_MD pm; 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset( (void*)&pm, 0, sizeof(pm)); 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* switch to active mode */ 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pm.mode = BTM_PM_MD_ACTIVE; 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetPowerMode (bta_dm_cb.pm_id, peer_addr, &pm); 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_pm_btm_cback 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description BTM power manager callback. 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_btm_cback(BD_ADDR bd_addr, tBTM_PM_STATUS status, UINT16 value, UINT8 hci_status) 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PM_BTM_STATUS *p_buf; 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (tBTA_DM_PM_BTM_STATUS *) GKI_getbuf(sizeof(tBTA_DM_PM_BTM_STATUS))) != NULL) 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.event = BTA_DM_PM_BTM_STATUS_EVT; 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->status = status; 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->value = value; 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hci_status = hci_status; 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(p_buf->bd_addr, bd_addr); 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_pm_timer_cback 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Power management timer callback. 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_timer_cback(void *p_tle) 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PM_TIMER *p_buf; 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 i; 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 701e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("dm_pm_timer expires"); 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i=0; i<BTA_DM_NUM_PM_TIMER; i++) 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_dm_cb.pm_timer[i].in_use) 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(&bta_dm_cb.pm_timer[i].timer == (TIMER_LIST_ENT*) p_tle) 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 711e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("dm_pm_timer expires %d", i); 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_cb.pm_timer[i].in_use = FALSE; 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no more timers */ 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(i==BTA_DM_NUM_PM_TIMER) 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_buf = (tBTA_DM_PM_TIMER *) GKI_getbuf(sizeof(tBTA_DM_PM_TIMER))) != NULL) 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.event = BTA_DM_PM_TIMER_EVT; 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(p_buf->bd_addr, bta_dm_cb.pm_timer[i].peer_bdaddr); 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_sys_sendmsg(p_buf); 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_pm_btm_status 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process pm status event from btm 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_pm_btm_status(tBTA_DM_MSG *p_data) 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PEER_DEVICE *p_dev; 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_DEV_INFO info; 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 751e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_dm_pm_btm_status:%d", p_data->pm_status.status); 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = bta_dm_find_peer_device(p_data->pm_status.bd_addr); 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(NULL == p_dev) 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project info = p_dev->info; 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check new mode */ 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_data->pm_status.status) 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PM_STS_ACTIVE: 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if our sniff or park attempt failed 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project we should not try it again*/ 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_data->pm_status.hci_status != 0) 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 765e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_dm_pm_btm_status hci_status=%d", p_data->pm_status.hci_status); 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF); 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_dev->pm_mode_attempted &(BTA_DM_PM_PARK | BTA_DM_PM_SNIFF)) 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->pm_mode_failed 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project |= ((BTA_DM_PM_PARK | BTA_DM_PM_SNIFF) & p_dev->pm_mode_attempted); 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_stop_timer(p_data->pm_status.bd_addr); 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_set_mode(p_data->pm_status.bd_addr, FALSE); 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE) 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_dev->prev_low) 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* need to send the SSR paramaters to controller again */ 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_ssr(p_dev->peer_bdaddr); 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->prev_low = BTM_PM_STS_ACTIVE; 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_stop_timer(p_data->pm_status.bd_addr); 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_set_mode(p_data->pm_status.bd_addr, FALSE); 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE) 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PM_STS_PARK: 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PM_STS_HOLD: 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* save the previous low power mode - for SSR. 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * SSR parameters are sent to controller on "conn open". 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the numbers stay good until park/hold/detach */ 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_dev->info & BTA_DM_DI_USE_SSR) 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->prev_low = p_data->pm_status.status; 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PM_STS_SSR: 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(p_data->pm_status.value) 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->info |= BTA_DM_DI_USE_SSR; 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->info &= ~BTA_DM_DI_USE_SSR; 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PM_STS_SNIFF: 8093a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta if (p_data->pm_status.hci_status == 0) 8103a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta { 8113a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta /* Stop PM timer now if already active for 8123a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta * particular device since link is already 8133a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta * put in sniff mode by remote device, and 8143a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta * PM timer sole purpose is to put the link 8153a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta * in sniff mode from host side. 8163a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta */ 8173a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta bta_dm_pm_stop_timer(p_data->pm_status.bd_addr); 8183a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta } 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->info &= ~(BTA_DM_DI_SET_SNIFF|BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF); 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (info & BTA_DM_DI_SET_SNIFF) 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->info |= BTA_DM_DI_INT_SNIFF; 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->info |= BTA_DM_DI_ACP_SNIFF; 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTM_PM_STS_ERROR: 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->info &= ~BTA_DM_DI_SET_SNIFF; 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_pm_timer 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Process pm timer event from btm 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_pm_timer(tBTA_DM_MSG *p_data) 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 851e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("proc dm_pm_timer expires"); 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_set_mode(p_data->pm_status.bd_addr, TRUE); 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_find_peer_device 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Given an address, find the associated control block. 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns tBTA_DM_PEER_DEVICE 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_DM_PEER_DEVICE * bta_dm_find_peer_device(BD_ADDR peer_addr) 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_DM_PEER_DEVICE *p_dev = NULL; 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int i; 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(i=0; i<bta_dm_cb.device_list.count; i++) 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, peer_addr)) 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev = &bta_dm_cb.device_list.peer_device[i]; 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_dev; 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_is_sco_active 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Loop through connected services for HFP+State=SCO 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BOOLEAN. TRUE if SCO active, else FALSE 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_is_sco_active () 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int j; 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN bScoActive = FALSE; 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(j=0; j<bta_dm_conn_srvcs.count ; j++) 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if an entry already present */ 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (bta_dm_conn_srvcs.conn_srvc[j].id == BTA_ID_AG ) && (bta_dm_conn_srvcs.conn_srvc[j].state == BTA_SYS_SCO_OPEN) ) 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bScoActive = TRUE; 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 907e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_dm_is_sco_active: SCO active: %d", bScoActive); 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return bScoActive; 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_pm_hid_check 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Disables/Enables sniff in link policy based on SCO Up/Down 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_hid_check(BOOLEAN bScoActive) 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int j; 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if HID is active, disable the link policy */ 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for(j=0; j<bta_dm_conn_srvcs.count ; j++) 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if an entry already present */ 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(bta_dm_conn_srvcs.conn_srvc[j].id == BTA_ID_HH ) 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 932e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG ("SCO status change(Active: %d), modify HID link policy. state: %d", 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bScoActive, bta_dm_conn_srvcs.conn_srvc[j].state); 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_set_sniff_policy( bta_dm_find_peer_device(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr), bScoActive); 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we had disabled link policy, seems like the hid device stop retrying SNIFF after a few tries. force sniff if needed */ 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bScoActive) 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_set_mode(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, FALSE); 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function bta_dm_pm_set_sniff_policy 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Disables/Enables sniff in link policy for the give device 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_set_sniff_policy(tBTA_DM_PEER_DEVICE *p_dev, BOOLEAN bDisable) 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 policy_setting; 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!p_dev) 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bDisable) 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy_setting = bta_dm_cb.cur_policy & 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (HCI_ENABLE_MASTER_SLAVE_SWITCH | 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_ENABLE_HOLD_MODE | 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project HCI_ENABLE_PARK_MODE); 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allow sniff after sco is closed */ 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project policy_setting= bta_dm_cb.cur_policy; 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if disabling SNIFF, make sure link is Active */ 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bDisable) 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_dm_pm_active(p_dev->peer_bdaddr); 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update device record and set link policy */ 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_dev->link_policy = policy_setting; 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTM_SetLinkPolicy(p_dev->peer_bdaddr, &policy_setting); 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 983e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji 98481b03192d4284acc7c9903f5b183927797dceca4Prerepa Viswanadham#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE)) 985e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji/******************************************************************************* 986e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji** 987e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji** Function bta_dm_pm_obtain_controller_state 988e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji** 989e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji** Description This function obtains the consolidated controller power state 990e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji** 991e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji** Parameters: 992e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji** 993e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji*******************************************************************************/ 994e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya CallojitBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void) 995e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji{ 996e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji /* Did not use counts as it is not sure, how accurate the count values are in 997e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji ** bta_dm_cb.device_list.count > 0 || bta_dm_cb.device_list.le_count > 0 */ 998e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji 999e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji tBTA_DM_CONTRL_STATE cur_state = BTA_DM_CONTRL_UNKNOWN; 1000e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji cur_state = BTM_PM_ReadControllerState(); 1001e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji 1002e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji APPL_TRACE_DEBUG("bta_dm_pm_obtain_controller_state: %d", cur_state); 1003e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji return cur_state; 1004e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji} 100581b03192d4284acc7c9903f5b183927797dceca4Prerepa Viswanadham#endif 1006