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