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
26c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov#include <assert.h>
27c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov#include <string.h>
28c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov
29258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h"
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h"
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h"
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_dm_int.h"
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btm_api.h"
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_bta_alarm_queue;
3778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov
385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr);
3976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavanstatic void bta_dm_pm_set_mode(BD_ADDR peer_addr, tBTA_DM_PM_ACTION pm_mode,
4076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                               tBTA_DM_PM_REQ pm_req);
4178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void bta_dm_pm_timer_cback(void *data);
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_btm_cback(BD_ADDR bd_addr, tBTM_PM_STATUS status, UINT16 value, UINT8 hci_status);
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_park(BD_ADDR peer_addr);
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE *p_peer_dev, UINT8 index);
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_is_sco_active ();
46af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishalastatic int bta_dm_get_sco_index();
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_hid_check(BOOLEAN bScoActive);
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_set_sniff_policy(tBTA_DM_PEER_DEVICE *p_dev, BOOLEAN bDisable);
49c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavovstatic void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER *p_timer,
50c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                                          UINT8 timer_idx);
51ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE)
53ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (defined BTA_HH_INCLUDED && BTA_HH_INCLUDED == TRUE)
54ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#include "../hh/bta_hh_int.h"
55ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta/* BTA_DM_PM_SSR1 will be dedicated for HH SSR setting entry, no other profile can use it */
56ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#define BTA_DM_PM_SSR_HH      BTA_DM_PM_SSR1
57ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_ssr(BD_ADDR peer_addr);
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_DM_CONNECTED_SRVCS bta_dm_conn_srvcs;
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_init_pm
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
6876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Description      Initializes the BT low power manager
695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_init_pm(void)
755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&bta_dm_conn_srvcs, 0x00, sizeof(bta_dm_conn_srvcs));
775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if there are no power manger entries, so not register */
795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_bta_dm_pm_cfg[0].app_id != 0)
805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_sys_pm_register((tBTA_SYS_CONN_CBACK*)bta_dm_pm_cback);
825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_PmRegister((BTM_PM_REG_SET | BTM_PM_REG_NOTIF), &bta_dm_cb.pm_id,
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       bta_dm_pm_btm_cback);
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    /* Need to initialize all PM timer service IDs */
8876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++)
8976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    {
9076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++)
9176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            bta_dm_cb.pm_timer[i].srvc_id[j] = BTA_ID_MAX;
9276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    }
935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_disable_pm
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Disable PM
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_disable_pm(void)
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_PmRegister( BTM_PM_DEREG, &bta_dm_cb.pm_id, NULL);
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    /*
11176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan     * Deregister the PM callback from the system handling to prevent
11276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan     * re-enabling the PM timers after this call if the callback is invoked.
11376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan     */
11476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    bta_sys_pm_register((tBTA_SYS_CONN_CBACK*)NULL);
11576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Need to stop all active timers. */
11776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++)
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
119c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov        for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++)
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
121c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov            bta_dm_pm_stop_timer_by_index(&bta_dm_cb.pm_timer[i], j);
122c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov            bta_dm_cb.pm_timer[i].pm_action[j] = BTA_DM_PM_NO_ACTION;
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Function         bta_dm_get_av_count
13076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
13176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Description      Get the number of connected AV
13276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
13376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
13476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Returns          number of av connections
13576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
13676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan*******************************************************************************/
13776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavanUINT8 bta_dm_get_av_count(void)
13876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan{
13976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    UINT8 count = 0;
14076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    for (int i = 0; i < bta_dm_conn_srvcs.count; i++)
14176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    {
14276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        if (bta_dm_conn_srvcs.conn_srvc[i].id == BTA_ID_AV)
14376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            ++count;
14476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    }
14576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    return count;
14676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan}
14776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
14876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan/*******************************************************************************
14976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pm_stop_timer
1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      stop a PM timer
1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_stop_timer(BD_ADDR peer_addr)
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1608372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz    APPL_TRACE_DEBUG("%s: ", __func__);
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    for(int i=0; i<BTA_DM_NUM_PM_TIMER; i++)
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        if (bta_dm_cb.pm_timer[i].in_use && !bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr))
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
16676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++)
16776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            {
168c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                bta_dm_pm_stop_timer_by_index(&bta_dm_cb.pm_timer[i], j);
169c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                /*
170c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * TODO: For now, stopping the timer does not reset
171c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * pm_action[j].
172c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * The reason is because some of the internal logic that
173c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * (re)assigns the pm_action[] values is taking into account
174c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * the older value; e.g., see the pm_action[] assignment in
175c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * function bta_dm_pm_start_timer().
176c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * Such subtlety in the execution logic is error prone, and
177c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * should be eliminiated in the future.
178c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 */
17976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            }
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
18276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    }
18376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan}
18476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
18576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan/*******************************************************************************
18676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
18776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Function         bta_pm_action_to_timer_idx
18876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
18976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Description      convert power mode into timer index for each connected device
19076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
19176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
19276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Returns          index of the power mode delay timer
19376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
19476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan*******************************************************************************/
19576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavanstatic UINT8 bta_pm_action_to_timer_idx(UINT8 pm_action)
19676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan{
19776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    if (pm_action == BTA_DM_PM_SUSPEND)
19876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        return BTA_DM_PM_SUSPEND_TIMER_IDX;
19976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    else if (pm_action == BTA_DM_PM_PARK)
20076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        return BTA_DM_PM_PARK_TIMER_IDX;
20176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    else if ((pm_action & BTA_DM_PM_SNIFF) == BTA_DM_PM_SNIFF)
20276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        return BTA_DM_PM_SNIFF_TIMER_IDX;
20376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
20476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    /* Active, no preference, no action and retry */
20576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    return BTA_DM_PM_MODE_TIMER_MAX;
20676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan}
2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan/*******************************************************************************
20976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
21076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Function         bta_dm_pm_stop_timer_by_mode
21176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
21276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Description      stop a PM timer
21376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
21476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
21576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Returns          void
21676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
21776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan*******************************************************************************/
21876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavanstatic void bta_dm_pm_stop_timer_by_mode(BD_ADDR peer_addr, UINT8 power_mode)
21976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan{
22076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    const UINT8 timer_idx = bta_pm_action_to_timer_idx(power_mode);
22176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    if (timer_idx == BTA_DM_PM_MODE_TIMER_MAX)
22276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        return;
22376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
22476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++)
22576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    {
22676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        if (bta_dm_cb.pm_timer[i].in_use && !bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr))
22776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        {
22876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            if (bta_dm_cb.pm_timer[i].srvc_id[timer_idx] != BTA_ID_MAX)
22976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            {
230c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                bta_dm_pm_stop_timer_by_index(&bta_dm_cb.pm_timer[i], timer_idx);
231c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                /*
232c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * TODO: Intentionally setting pm_action[timer_idx].
233c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * This assignment should be eliminated in the future - see the
234c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * pm_action[] related comment inside function
235c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 * bta_dm_pm_stop_timer().
236c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                 */
23776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                bta_dm_cb.pm_timer[i].pm_action[timer_idx] = power_mode;
23876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            }
23976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            break;
24076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        }
24176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    }
24276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan}
24376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
24476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan/*******************************************************************************
24576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
24676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Function         bta_dm_pm_stop_timer_by_srvc_id
24776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
24876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Description      stop all timer started by the service ID.
24976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
25076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
25176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Returns          index of the power mode delay timer
25276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
25376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan*******************************************************************************/
25476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavanstatic void bta_dm_pm_stop_timer_by_srvc_id(BD_ADDR peer_addr, UINT8 srvc_id)
25576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan{
25676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    for (int i = 0; i < BTA_DM_NUM_PM_TIMER; i++)
25776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    {
25876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        if (bta_dm_cb.pm_timer[i].in_use && !bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr))
25976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        {
26076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            for (int j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++)
26176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            {
26276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                if (bta_dm_cb.pm_timer[i].srvc_id[j] == srvc_id)
26376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                {
264c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                    bta_dm_pm_stop_timer_by_index(&bta_dm_cb.pm_timer[i], j);
26576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    bta_dm_cb.pm_timer[i].pm_action[j] = BTA_DM_PM_NO_ACTION;
26676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    break;
26776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                }
26876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            }
26976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        }
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
27576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Function         bta_dm_pm_start_timer
27676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
27776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Description      start a PM timer
27876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
27976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
28076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan** Returns          void
28176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
28276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan*******************************************************************************/
28376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavanstatic void bta_dm_pm_start_timer(tBTA_PM_TIMER *p_timer, UINT8 timer_idx,
28478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                  period_ms_t timeout_ms, UINT8 srvc_id,
28578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                  UINT8 pm_action)
28676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan{
28776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    p_timer->in_use = TRUE;
28876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
28976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    if (p_timer->srvc_id[timer_idx] == BTA_ID_MAX)
29076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        p_timer->active++;
29176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
29276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    if (p_timer->pm_action[timer_idx] < pm_action)
29376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        p_timer->pm_action[timer_idx] = pm_action;
29476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
29576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    p_timer->srvc_id[timer_idx] = srvc_id;
29676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
29778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_set_on_queue(p_timer->timer[timer_idx], timeout_ms,
29878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       bta_dm_pm_timer_cback, p_timer->timer[timer_idx],
29978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                       btu_bta_alarm_queue);
30076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan}
30176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
302c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov/*******************************************************************************
303c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov**
304c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov** Function         bta_dm_pm_stop_timer_by_index
305c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov**
306c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov** Description      stop a PM timer
307c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov**
308c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov**
309c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov** Returns          void
310c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov**
311c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov*******************************************************************************/
312c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavovstatic void bta_dm_pm_stop_timer_by_index(tBTA_PM_TIMER *p_timer,
313c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                                          UINT8 timer_idx)
314c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov{
315c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov    if ((p_timer == NULL) || (timer_idx >= BTA_DM_PM_MODE_TIMER_MAX))
316c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov        return;
317c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov
318c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov    if (p_timer->srvc_id[timer_idx] == BTA_ID_MAX)
319c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov        return;                 /* The timer was not scheduled */
320c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov
321c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov    assert(p_timer->in_use && (p_timer->active > 0));
322c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov
32378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_cancel(p_timer->timer[timer_idx]);
324c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov    p_timer->srvc_id[timer_idx] = BTA_ID_MAX;
325c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov    /* NOTE: pm_action[timer_idx] intentionally not reset */
326c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov
327c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov    p_timer->active--;
328c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov    if (p_timer->active == 0)
329c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov        p_timer->in_use = FALSE;
330c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov}
331c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov
33276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan/*******************************************************************************
33376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan**
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pm_cback
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Conn change callback from sys for low power management
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8 app_id, BD_ADDR peer_addr)
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 i,j;
3469900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB    UINT8 *p = NULL;
34776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    tBTA_DM_PEER_DEVICE *p_dev;
348cbd669b9c3bb3375cb794d385c7f7984eaa3dedaMatadeen Mishra    tBTA_DM_PM_REQ  pm_req = BTA_DM_PM_NEW_REQ;
34976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE)
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int               index = BTA_DM_PM_SSR0;
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
354e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_dm_pm_cback: st(%d), id(%d), app(%d)", status, id, app_id);
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev = bta_dm_find_peer_device(peer_addr);
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* find if there is an power mode entry for the service */
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(i=1; i<=p_bta_dm_pm_cfg[0].app_id; i++)
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if((p_bta_dm_pm_cfg[i].id == id)
3635738f83aeb59361a0a2eda2460113f6dc919427The 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 )))
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
36876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    /* if no entries are there for the app_id and subsystem in p_bta_dm_pm_spec*/
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(i> p_bta_dm_pm_cfg[0].app_id)
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
37276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    bta_dm_pm_stop_timer_by_srvc_id(peer_addr, id);
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*p_dev = bta_dm_find_peer_device(peer_addr);*/
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE)
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* set SSR parameters on SYS CONN OPEN */
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if((BTA_SYS_CONN_OPEN == status) && p_dev && (p_dev->info & BTA_DM_DI_USE_SSR))
3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        index = p_bta_dm_pm_spec[p_bta_dm_pm_cfg[i].spec_idx].ssr;
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if no action for the event */
3845738f83aeb59361a0a2eda2460113f6dc919427The 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)
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE)
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(BTA_DM_PM_SSR0 == index) /* and do not need to set SSR, return. */
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(j=0; j<bta_dm_conn_srvcs.count ; j++)
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if an entry already present */
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if((bta_dm_conn_srvcs.conn_srvc[j].id == id)
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && (bta_dm_conn_srvcs.conn_srvc[j].app_id == app_id )
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            && !bdcmp(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr))
39876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        {
39976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            bta_dm_conn_srvcs.conn_srvc[j].new_request = TRUE;
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
40176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        }
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if subsystem has no more preference on the power mode remove
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project       the cb */
4075738f83aeb59361a0a2eda2460113f6dc919427The 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)
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(j != bta_dm_conn_srvcs.count)
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bta_dm_conn_srvcs.count--;
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for(; j<bta_dm_conn_srvcs.count ; j++)
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4165738f83aeb59361a0a2eda2460113f6dc919427The 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]));
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
422e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_WARNING("bta_dm_act no entry for connected service cbs");
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if(j == bta_dm_conn_srvcs.count )
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if we have more connected service that cbs */
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(bta_dm_conn_srvcs.count == BTA_DM_NUM_CONN_SRVS)
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
431e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_WARNING("bta_dm_act no more connected service cbs");
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* fill in a new cb */
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_conn_srvcs.conn_srvc[j].id = id;
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_conn_srvcs.conn_srvc[j].app_id = app_id;
43876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        bta_dm_conn_srvcs.conn_srvc[j].new_request = TRUE;
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bdcpy(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, peer_addr);
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
441e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_WARNING("new conn_srvc id:%d, app_id:%d", id, app_id);
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_conn_srvcs.count++;
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_conn_srvcs.conn_srvc[j].state = status;
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* no service is added or removed. only updating status. */
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_conn_srvcs.conn_srvc[j].state = status;
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
452c1c26aae2708cb74d2aa3e70b5168e0172731c49Mallikarjuna GB    /* stop timer */
453c1c26aae2708cb74d2aa3e70b5168e0172731c49Mallikarjuna GB    bta_dm_pm_stop_timer(peer_addr);
454cbd669b9c3bb3375cb794d385c7f7984eaa3dedaMatadeen Mishra    if (bta_dm_conn_srvcs.count > 0) {
455cbd669b9c3bb3375cb794d385c7f7984eaa3dedaMatadeen Mishra        pm_req = BTA_DM_PM_RESTART;
456cbd669b9c3bb3375cb794d385c7f7984eaa3dedaMatadeen Mishra        APPL_TRACE_DEBUG("%s bta_dm_pm_stop_timer for current service, restart other "
457cbd669b9c3bb3375cb794d385c7f7984eaa3dedaMatadeen Mishra           "service timers: count = %d", __func__, bta_dm_conn_srvcs.count);
458cbd669b9c3bb3375cb794d385c7f7984eaa3dedaMatadeen Mishra    }
459c1c26aae2708cb74d2aa3e70b5168e0172731c49Mallikarjuna GB
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(p_dev)
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->pm_mode_attempted = 0;
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_dev->pm_mode_failed = 0;
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE)
467ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta    if(p_bta_dm_ssr_spec[index].max_lat
468ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (defined BTA_HH_INCLUDED && BTA_HH_INCLUDED == TRUE)
469ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta       || index == BTA_DM_PM_SSR_HH
470ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
471ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta       )
4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_pm_ssr(peer_addr);
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4759900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB    else
4769900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB    {
4779900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB        if( ((NULL != (p = BTM_ReadLocalFeatures ())) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
4789900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB            ((NULL != (p = BTM_ReadRemoteFeatures (peer_addr))) && HCI_SNIFF_SUB_RATE_SUPPORTED(p)) &&
4799900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB            (index == BTA_DM_PM_SSR0))
4809900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB        {
4819900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB            if (status == BTA_SYS_SCO_OPEN)
4829900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB            {
4839900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB                APPL_TRACE_DEBUG("%s: SCO inactive, reset SSR to zero", __func__);
4849900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB                BTM_SetSsrParams (peer_addr, 0,0,0 );
4859900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB            }
4869900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB            else if (status == BTA_SYS_SCO_CLOSE)
4879900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB            {
4889900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB                APPL_TRACE_DEBUG("%s: SCO active, back to old SSR", __func__);
4899900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB                bta_dm_pm_ssr(peer_addr);
4909900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB            }
4919900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB        }
4929900b49968297aa15872a9b7ef3a258ecf48cf1bMallikarjuna GB    }
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
495cbd669b9c3bb3375cb794d385c7f7984eaa3dedaMatadeen Mishra    bta_dm_pm_set_mode(peer_addr, BTA_DM_PM_NO_ACTION, pm_req);
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* perform the HID link workaround if needed
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** 1. If SCO up/down event is received OR
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    ** 2. If HID connection open is received and SCO is already active.
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    **     This will handle the case where HID connects when SCO already active
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    */
502cc0ca141ad1e81826b71c0bacdb2e8ab186f9155Zach Johnson    if ( BTM_IsDeviceUp() &&
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         ( ((status == BTA_SYS_SCO_OPEN) || (status == BTA_SYS_SCO_CLOSE)) ||
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           ((status == BTA_SYS_CONN_OPEN) && (id == BTA_ID_HH) && bta_dm_pm_is_sco_active()) ) )
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BOOLEAN bScoActive;
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == BTA_SYS_CONN_OPEN)
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bScoActive = TRUE;
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bScoActive = (status == BTA_SYS_SCO_OPEN);
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_pm_hid_check(bScoActive);
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pm_set_mode
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Set the power mode for the device
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
52876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan
52976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavanstatic void bta_dm_pm_set_mode(BD_ADDR peer_addr, tBTA_DM_PM_ACTION pm_request,
53076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                               tBTA_DM_PM_REQ pm_req )
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
53376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    tBTA_DM_PM_ACTION   pm_action = BTA_DM_PM_NO_ACTION;
53478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    period_ms_t         timeout_ms = 0;
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8               i,j;
53676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    tBTA_DM_PM_ACTION   failed_pm = 0;
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_PEER_DEVICE *p_peer_device = NULL;
53876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    tBTA_DM_PM_ACTION    allowed_modes = 0;
53976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    tBTA_DM_PM_ACTION    pref_modes = 0;
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_PM_CFG      *p_pm_cfg;
5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_PM_SPEC     *p_pm_spec;
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_PM_ACTN     *p_act0, *p_act1;
54376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    tBTA_DM_SRVCS       *p_srvcs = NULL;
54476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    BOOLEAN timer_started = FALSE;
54576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    UINT8   timer_idx, available_timer = BTA_DM_PM_MODE_TIMER_MAX;
54678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    period_ms_t  remaining_ms = 0;
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(!bta_dm_cb.device_list.count)
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* see if any attempt to put device in low power mode failed */
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_peer_device = bta_dm_find_peer_device(peer_addr);
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if no peer device found return */
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_peer_device == NULL)
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    failed_pm = p_peer_device->pm_mode_failed;
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(i=0; i<bta_dm_conn_srvcs.count ; i++)
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_srvcs = &bta_dm_conn_srvcs.conn_srvc[i];
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!bdcmp(p_srvcs->peer_bdaddr, peer_addr))
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* p_bta_dm_pm_cfg[0].app_id is the number of entries */
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for(j=1; j<=p_bta_dm_pm_cfg[0].app_id; j++)
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if((p_bta_dm_pm_cfg[j].id == p_srvcs->id)
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    && ((p_bta_dm_pm_cfg[j].app_id == BTA_ALL_APP_ID ) ||
5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (p_bta_dm_pm_cfg[j].app_id == p_srvcs->app_id)))
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_pm_cfg = &p_bta_dm_pm_cfg[j];
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_pm_spec = &p_bta_dm_pm_spec[p_pm_cfg->spec_idx];
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_act0 = &p_pm_spec->actn_tbl[p_srvcs->state][0];
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_act1 = &p_pm_spec->actn_tbl[p_srvcs->state][1];
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
580e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("bta_dm_pm_set_mode: srvcsid: %d, state: %d, j: %d", p_srvcs->id, p_srvcs->state, j);
5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            allowed_modes |= p_pm_spec->allow_mask;
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* PM actions are in the order of strictness */
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* first check if the first preference is ok */
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(!(failed_pm & p_act0->power_mode))
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                pref_modes |= p_act0->power_mode;
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                if(p_act0->power_mode >= pm_action)
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pm_action = p_act0->power_mode;
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
59476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    if (pm_req != BTA_DM_PM_NEW_REQ || p_srvcs->new_request)
59576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    {
59676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                        p_srvcs->new_request = FALSE;
59778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                        timeout_ms =  p_act0->timeout;
59876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    }
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if first preference has already failed, try second preference */
6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if(!(failed_pm & p_act1->power_mode))
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                pref_modes |= p_act1->power_mode;
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(p_act1->power_mode > pm_action)
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pm_action = p_act1->power_mode;
60978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                    timeout_ms =  p_act1->timeout;
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(pm_action & (BTA_DM_PM_PARK | BTA_DM_PM_SNIFF))
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* some service don't like the mode */
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!(allowed_modes & pm_action))
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* select the other mode if its allowed and preferred, otherwise 0 which is BTA_DM_PM_NO_ACTION */
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pm_action =  (allowed_modes & (BTA_DM_PM_PARK | BTA_DM_PM_SNIFF) & pref_modes);
6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* no timeout needed if no action is required */
6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(pm_action == BTA_DM_PM_NO_ACTION)
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
62778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                timeout_ms = 0;
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
63276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    /* if need to start a timer */
63378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    if ((pm_req != BTA_DM_PM_EXECUTE) && (timeout_ms > 0))
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
63578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov        for (i=0; i<BTA_DM_NUM_PM_TIMER; i++)
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
63778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov            if (bta_dm_cb.pm_timer[i].in_use && bdcmp(bta_dm_cb.pm_timer[i].peer_bdaddr, peer_addr) == 0)
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
63976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                if ((timer_idx = bta_pm_action_to_timer_idx(pm_action)) != BTA_DM_PM_MODE_TIMER_MAX)
64076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                {
64178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                    remaining_ms = alarm_get_remaining_ms(bta_dm_cb.pm_timer[i].timer[timer_idx]);
64278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                    if (remaining_ms < timeout_ms)
64376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    {
644c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                        /* Cancel and restart the timer */
645c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                        /*
646c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                         * TODO: The value of pm_action[timer_idx] is
647c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                         * conditionally updated between the two function
648c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                         * calls below when the timer is restarted.
649c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                         * This logic is error-prone and should be eliminated
650c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                         * in the future.
651c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                         */
652c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                        bta_dm_pm_stop_timer_by_index(&bta_dm_cb.pm_timer[i],
653c6137426081fc55d8c94cd0e6b55cd0d0a52f12dPavlin Radoslavov                                                      timer_idx);
65478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                        bta_dm_pm_start_timer(&bta_dm_cb.pm_timer[i],
65578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                              timer_idx, timeout_ms,
65678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                              p_srvcs->id, pm_action);
65776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    }
65876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    timer_started = TRUE;
65976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                }
66076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                break;
66176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            }
66276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            else if (!bta_dm_cb.pm_timer[i].in_use)
66376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            {
66478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                APPL_TRACE_DEBUG("%s dm_pm_timer:%d, %d ms", __func__, i,
66578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                 timeout_ms);
66676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                if (available_timer == BTA_DM_PM_MODE_TIMER_MAX)
66776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    available_timer = i;
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
67076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        /* new power mode for a new active connection */
67176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        if (!timer_started)
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
67376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            if( available_timer != BTA_DM_PM_MODE_TIMER_MAX)
67476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            {
67576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                bdcpy(bta_dm_cb.pm_timer[available_timer].peer_bdaddr, peer_addr);
67676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                if ((timer_idx = bta_pm_action_to_timer_idx(pm_action)) != BTA_DM_PM_MODE_TIMER_MAX)
67776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                {
67878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                    bta_dm_pm_start_timer(&bta_dm_cb.pm_timer[available_timer],
67978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                          timer_idx, timeout_ms,
68078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                                          p_srvcs->id, pm_action);
68176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    timer_started = TRUE;
68276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                }
68376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            }
68476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            /* no more timers */
68576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            else
68676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            {
68776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                APPL_TRACE_WARNING("bta_dm_act dm_pm_timer no more");
68876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            }
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
69076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        return;
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
69276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    /* if pending power mode timer expires, and currecnt link is in a
69376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan       lower power mode than current profile requirement, igonre it */
69476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    if (pm_req == BTA_DM_PM_EXECUTE && pm_request < pm_action)
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
69676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        APPL_TRACE_ERROR("Ignore the power mode request: %d", pm_request)
69776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        return;
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
69976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    if(pm_action == BTA_DM_PM_PARK)
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_peer_device->pm_mode_attempted = BTA_DM_PM_PARK;
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_pm_park(peer_addr);
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if(pm_action & BTA_DM_PM_SNIFF)
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* dont initiate SNIFF, if link_policy has it disabled */
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_peer_device->link_policy & HCI_ENABLE_SNIFF_MODE)
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7098372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz            p_peer_device->pm_mode_attempted = BTA_DM_PM_SNIFF;
7108372aa5fa535ee4f09c09981b6125b54ace31fe2Kim Schulz            bta_dm_pm_sniff(p_peer_device, (UINT8)(pm_action & 0x0F) );
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
714e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("bta_dm_pm_set_mode: Link policy disallows SNIFF, ignore request");
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else if(pm_action == BTA_DM_PM_ACTIVE)
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_pm_active(peer_addr);
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_pm_park
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Switch to park mode.
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if park attempted, FALSE otherwise.
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_park(BD_ADDR peer_addr)
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PM_MODE    mode = BTM_PM_STS_ACTIVE;
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if not in park mode, switch to park */
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_ReadPowerMode(peer_addr, &mode);
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(mode != BTM_PM_MD_PARK)
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetPowerMode (bta_dm_cb.pm_id, peer_addr, &p_bta_dm_pm_md[BTA_DM_PM_PARK_IDX]);
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_ag_pm_sniff
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Switch to sniff mode.
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          TRUE if sniff attempted, FALSE otherwise.
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_sniff(tBTA_DM_PEER_DEVICE *p_peer_dev, UINT8 index)
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PM_MODE    mode = BTM_PM_STS_ACTIVE;
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PM_PWR_MD  pwr_md;
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_STATUS     status;
76376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan#if (BTM_SSR_INCLUDED == TRUE)
76476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    UINT8 *p_rem_feat = NULL;
76576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan#endif
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_ReadPowerMode(p_peer_dev->peer_bdaddr, &mode);
76876356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    p_rem_feat = BTM_ReadRemoteFeatures (p_peer_dev->peer_bdaddr);
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE)
770e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d, info:x%x", mode, index, p_peer_dev->info);
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (mode != BTM_PM_MD_SNIFF ||
77276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        (HCI_SNIFF_SUB_RATE_SUPPORTED(BTM_ReadLocalFeatures ()) && p_rem_feat &&
77376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan         HCI_SNIFF_SUB_RATE_SUPPORTED(p_rem_feat) &&
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         !(p_peer_dev->info & BTA_DM_DI_USE_SSR)))
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
776e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_dm_pm_sniff cur:%d, idx:%d", mode, index);
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(mode != BTM_PM_MD_SNIFF)
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
780b399701373c8829e5d0f85041e7f7542418d7773Mallikarjuna GB#if (BTM_SSR_INCLUDED == TRUE)
781b399701373c8829e5d0f85041e7f7542418d7773Mallikarjuna GB        /* Dont initiate Sniff if controller has alreay accepted
782b399701373c8829e5d0f85041e7f7542418d7773Mallikarjuna GB         * remote sniff params. This avoid sniff loop issue with
783b399701373c8829e5d0f85041e7f7542418d7773Mallikarjuna GB         * some agrresive headsets who use sniff latencies more than
784b399701373c8829e5d0f85041e7f7542418d7773Mallikarjuna GB         * DUT supported range of Sniff intervals.*/
785b399701373c8829e5d0f85041e7f7542418d7773Mallikarjuna GB        if ((mode == BTM_PM_MD_SNIFF) && (p_peer_dev->info & BTA_DM_DI_ACP_SNIFF))
786b399701373c8829e5d0f85041e7f7542418d7773Mallikarjuna GB        {
787b399701373c8829e5d0f85041e7f7542418d7773Mallikarjuna GB            APPL_TRACE_DEBUG("%s: already in remote initiate sniff", __func__);
788b399701373c8829e5d0f85041e7f7542418d7773Mallikarjuna GB            return TRUE;
789b399701373c8829e5d0f85041e7f7542418d7773Mallikarjuna GB        }
790b399701373c8829e5d0f85041e7f7542418d7773Mallikarjuna GB#endif
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* if the current mode is not sniff, issue the sniff command.
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         * If sniff, but SSR is not used in this link, still issue the command */
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy(&pwr_md, &p_bta_dm_pm_md[index], sizeof (tBTM_PM_PWR_MD));
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_peer_dev->info & BTA_DM_DI_INT_SNIFF)
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pwr_md.mode |= BTM_PM_MD_FORCE;
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        status = BTM_SetPowerMode (bta_dm_cb.pm_id, p_peer_dev->peer_bdaddr, &pwr_md);
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (status == BTM_CMD_STORED|| status == BTM_CMD_STARTED)
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF);
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_peer_dev->info |= BTA_DM_DI_SET_SNIFF;
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (status == BTM_SUCCESS)
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
806e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("bta_dm_pm_sniff BTM_SetPowerMode() returns BTM_SUCCESS");
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF);
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else /* error */
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
811e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("bta_dm_pm_sniff BTM_SetPowerMode() returns ERROR status=%d", status);
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_peer_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF);
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pm_ssr
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      checks and sends SSR parameters
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE)
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_ssr(BD_ADDR peer_addr)
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_SSR_SPEC *p_spec, *p_spec_cur;
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8   i,j;
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int     ssr = BTA_DM_PM_SSR0;
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* go through the connected services */
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(i=0; i<bta_dm_conn_srvcs.count ; i++)
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!bdcmp(bta_dm_conn_srvcs.conn_srvc[i].peer_bdaddr, peer_addr))
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* p_bta_dm_pm_cfg[0].app_id is the number of entries */
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            for(j=1; j<=p_bta_dm_pm_cfg[0].app_id; j++)
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* find the associated p_bta_dm_pm_cfg */
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if((p_bta_dm_pm_cfg[j].id == bta_dm_conn_srvcs.conn_srvc[i].id)
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    && ((p_bta_dm_pm_cfg[j].app_id == BTA_ALL_APP_ID )
8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    || (p_bta_dm_pm_cfg[j].app_id == bta_dm_conn_srvcs.conn_srvc[i].app_id)))
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
847e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                    APPL_TRACE_WARNING("bta_dm_pm_ssr conn_srvc id:%d, app_id:%d",
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        bta_dm_conn_srvcs.conn_srvc[i].id, bta_dm_conn_srvcs.conn_srvc[i].app_id);
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    break;
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* find the ssr index with the smallest max latency. */
8545738f83aeb59361a0a2eda2460113f6dc919427The 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];
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_spec = &p_bta_dm_ssr_spec[ssr];
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
857ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#if (defined BTA_HH_INCLUDED && BTA_HH_INCLUDED == TRUE)
858ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            /* HH has the per connection SSR preference, already read the SSR params from BTA HH */
859ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            if (p_bta_dm_pm_spec[p_bta_dm_pm_cfg[j].spec_idx].ssr == BTA_DM_PM_SSR_HH)
860ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            {
861ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                if (bta_hh_read_ssr_param(peer_addr, &p_spec_cur->max_lat, &p_spec_cur->min_rmt_to) == BTA_HH_ERR)
862ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta                    continue;
863ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta            }
864ead3cde4bac0c3e32cd31f149093f004eef8ceebGanesh Ganapathi Batta#endif
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_spec_cur->max_lat < p_spec->max_lat ||
8665738f83aeb59361a0a2eda2460113f6dc919427The 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))
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                ssr = p_bta_dm_pm_spec[p_bta_dm_pm_cfg[j].spec_idx].ssr;
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_spec = &p_bta_dm_ssr_spec[ssr];
875af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala    APPL_TRACE_WARNING("%s ssr:%d, lat:%d", __func__, ssr, p_spec->max_lat);
876af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala
877af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala    if (p_spec->max_lat)
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
879af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala        /* Avoid SSR reset on device which has SCO connected */
880af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala        if (bta_dm_pm_is_sco_active())
881af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala        {
882af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala            int idx = bta_dm_get_sco_index();
883af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala            if (idx != -1)
884af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala            {
885af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala                if (bdcmp(bta_dm_conn_srvcs.conn_srvc[idx].peer_bdaddr, peer_addr) == 0)
886af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala                {
887af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala                    APPL_TRACE_WARNING("%s SCO is active on device, ignore SSR", __func__);
888af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala                    return;
889af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala                }
890af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala            }
891af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala        }
892af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala
8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* set the SSR parameters. */
8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        BTM_SetSsrParams (peer_addr, p_spec->max_lat,
8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_spec->min_rmt_to, p_spec->min_loc_to);
8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pm_active
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Brings connection to active mode
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_pm_active(BD_ADDR peer_addr)
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTM_PM_PWR_MD  pm;
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset( (void*)&pm, 0, sizeof(pm));
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* switch to active mode */
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    pm.mode = BTM_PM_MD_ACTIVE;
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetPowerMode (bta_dm_cb.pm_id, peer_addr, &pm);
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pm_btm_cback
9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      BTM power manager callback.
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_btm_cback(BD_ADDR bd_addr, tBTM_PM_STATUS status, UINT16 value, UINT8 hci_status)
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
9355fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    tBTA_DM_PM_BTM_STATUS *p_buf =
9365fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        (tBTA_DM_PM_BTM_STATUS *)osi_malloc(sizeof(tBTA_DM_PM_BTM_STATUS));
9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9385fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_buf->hdr.event = BTA_DM_PM_BTM_STATUS_EVT;
9395fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_buf->status = status;
9405fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_buf->value = value;
9415fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_buf->hci_status = hci_status;
9425fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    bdcpy(p_buf->bd_addr, bd_addr);
9435fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov
9445fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    bta_sys_sendmsg(p_buf);
9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pm_timer_cback
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Power management timer callback.
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
95778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void bta_dm_pm_timer_cback(void *data)
9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
95976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    UINT8 i, j;
96078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov    alarm_t *alarm = (alarm_t *)data;
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
96276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    for (i=0; i<BTA_DM_NUM_PM_TIMER; i++)
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
96476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        APPL_TRACE_DEBUG("dm_pm_timer[%d] in use? %d", i, bta_dm_cb.pm_timer[i].in_use);
96576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan        if (bta_dm_cb.pm_timer[i].in_use)
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
96776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            for (j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++)
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
96978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov                if (bta_dm_cb.pm_timer[i].timer[j] == alarm)
97076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                {
97176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    bta_dm_cb.pm_timer[i].active --;
97276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    bta_dm_cb.pm_timer[i].srvc_id[j] = BTA_ID_MAX;
97376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    APPL_TRACE_DEBUG("dm_pm_timer[%d] expires, timer_idx=%d", i, j);
97476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    break;
97576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                }
97676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            }
97776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            if (bta_dm_cb.pm_timer[i].active == 0)
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_cb.pm_timer[i].in_use = FALSE;
97976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            if (j < BTA_DM_PM_MODE_TIMER_MAX)
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* no more timers */
98576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    if (i==BTA_DM_NUM_PM_TIMER)
9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9885fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    tBTA_DM_PM_TIMER *p_buf =
9895fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov        (tBTA_DM_PM_TIMER *)osi_malloc(sizeof(tBTA_DM_PM_TIMER));
9905fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_buf->hdr.event = BTA_DM_PM_TIMER_EVT;
9915fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    p_buf->pm_request = bta_dm_cb.pm_timer[i].pm_action[j];
9925fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    bdcpy(p_buf->bd_addr, bta_dm_cb.pm_timer[i].peer_bdaddr);
9935fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov
9945fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov    bta_sys_sendmsg(p_buf);
9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pm_btm_status
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process pm status event from btm
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_pm_btm_status(tBTA_DM_MSG *p_data)
10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
100976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    APPL_TRACE_DEBUG("%s status: %d", __func__, p_data->pm_status.status);
10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
101176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    tBTA_DM_PEER_DEVICE *p_dev = bta_dm_find_peer_device(p_data->pm_status.bd_addr);
101276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    if (NULL == p_dev)
10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
101576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    tBTA_DM_DEV_INFO info = p_dev->info;
10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check new mode */
10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_data->pm_status.status)
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PM_STS_ACTIVE:
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* if our sniff or park attempt failed
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            we should not try it again*/
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_data->pm_status.hci_status != 0)
10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
102476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                APPL_TRACE_ERROR("%s hci_status=%d", __func__, p_data->pm_status.hci_status);
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev->info &= ~(BTA_DM_DI_INT_SNIFF|BTA_DM_DI_ACP_SNIFF|BTA_DM_DI_SET_SNIFF);
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(p_dev->pm_mode_attempted &(BTA_DM_PM_PARK | BTA_DM_PM_SNIFF))
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    p_dev->pm_mode_failed
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                        |= ((BTA_DM_PM_PARK | BTA_DM_PM_SNIFF) & p_dev->pm_mode_attempted);
103176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    bta_dm_pm_stop_timer_by_mode(p_data->pm_status.bd_addr, p_dev->pm_mode_attempted);
103276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    bta_dm_pm_set_mode(p_data->pm_status.bd_addr, BTA_DM_PM_NO_ACTION, BTA_DM_PM_RESTART);
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE)
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(p_dev->prev_low)
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                {
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /* need to send the SSR paramaters to controller again */
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    bta_dm_pm_ssr(p_dev->peer_bdaddr);
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                }
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev->prev_low = BTM_PM_STS_ACTIVE;
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
104576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                /* link to active mode, need to restart the timer for next low power mode if needed */
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bta_dm_pm_stop_timer(p_data->pm_status.bd_addr);
104776356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                bta_dm_pm_set_mode(p_data->pm_status.bd_addr, BTA_DM_PM_NO_ACTION, BTA_DM_PM_RESTART);
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTM_SSR_INCLUDED == TRUE)
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PM_STS_PARK:
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PM_STS_HOLD:
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* save the previous low power mode - for SSR.
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * SSR parameters are sent to controller on "conn open".
10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             * the numbers stay good until park/hold/detach */
10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(p_dev->info & BTA_DM_DI_USE_SSR)
10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev->prev_low = p_data->pm_status.status;
10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PM_STS_SSR:
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if(p_data->pm_status.value)
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev->info |= BTA_DM_DI_USE_SSR;
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_dev->info &= ~BTA_DM_DI_USE_SSR;
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PM_STS_SNIFF:
10693a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta            if (p_data->pm_status.hci_status == 0)
10703a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta            {
10713a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta                /* Stop PM timer now if already active for
10723a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta                 * particular device since link is already
10733a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta                 * put in sniff mode by remote device, and
10743a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta                 * PM timer sole purpose is to put the link
10753a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta                 * in sniff mode from host side.
10763a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta                 */
10773a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta                bta_dm_pm_stop_timer(p_data->pm_status.bd_addr);
10783a02468a2cca323a61d4b461d0b37cfcc70fa3d5Hemant Gupta            }
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
108076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            {
108176356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                p_dev->info &= ~(BTA_DM_DI_SET_SNIFF | BTA_DM_DI_INT_SNIFF | BTA_DM_DI_ACP_SNIFF);
108276356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                if (info & BTA_DM_DI_SET_SNIFF)
108376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    p_dev->info |= BTA_DM_DI_INT_SNIFF;
108476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                else
108576356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                    p_dev->info |= BTA_DM_DI_ACP_SNIFF;
108676356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan            }
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTM_PM_STS_ERROR:
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev->info &= ~BTA_DM_DI_SET_SNIFF;
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pm_timer
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Process pm timer event from btm
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          void
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_dm_pm_timer(tBTA_DM_MSG *p_data)
11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
111376356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    APPL_TRACE_EVENT("%s", __func__);
111476356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    bta_dm_pm_set_mode(p_data->pm_timer.bd_addr, p_data->pm_timer.pm_request, BTA_DM_PM_EXECUTE);
11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_find_peer_device
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Given an address, find the associated control block.
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          tBTA_DM_PEER_DEVICE
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjecttBTA_DM_PEER_DEVICE * bta_dm_find_peer_device(BD_ADDR peer_addr)
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTA_DM_PEER_DEVICE *p_dev = NULL;
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
113076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan    for (int i=0; i<bta_dm_cb.device_list.count; i++)
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(!bdcmp( bta_dm_cb.device_list.peer_device[i].peer_bdaddr, peer_addr))
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            p_dev = &bta_dm_cb.device_list.peer_device[i];
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return p_dev;
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_is_sco_active
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Loop through connected services for HFP+State=SCO
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          BOOLEAN. TRUE if SCO active, else FALSE
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_dm_pm_is_sco_active ()
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int j;
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN bScoActive = FALSE;
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(j=0; j<bta_dm_conn_srvcs.count ; j++)
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if an entry already present */
11595738f83aeb59361a0a2eda2460113f6dc919427The 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) )
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            bScoActive = TRUE;
11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1166e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bta_dm_is_sco_active: SCO active: %d", bScoActive);
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return bScoActive;
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
1173af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala** Function        bta_dm_get_sco_index
1174af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala**
1175af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala** Description     Loop through connected services for HFP+State=SCO
1176af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala**
1177af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala** Returns         index at which SCO is connected, in absence of SCO return -1
1178af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala**
1179af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala*******************************************************************************/
1180af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishalastatic int bta_dm_get_sco_index()
1181af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala{
1182af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala    for(int j = 0; j < bta_dm_conn_srvcs.count; j++)
1183af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala    {
1184af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala        /* check for SCO connected index */
1185af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala        if ( (bta_dm_conn_srvcs.conn_srvc[j].id == BTA_ID_AG ) &&
1186af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala             (bta_dm_conn_srvcs.conn_srvc[j].state == BTA_SYS_SCO_OPEN) )
1187af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala        {
1188af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala            return j;
1189af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala        }
1190af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala    }
1191af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala    return -1;
1192af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala}
1193af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala
1194af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala/*******************************************************************************
1195af3e647479dcf27e17516b6cd2b853c453a1a01cSatish Kodishala**
11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pm_hid_check
11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Disables/Enables sniff in link policy based on SCO Up/Down
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_hid_check(BOOLEAN bScoActive)
12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int j;
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if HID is active, disable the link policy */
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    for(j=0; j<bta_dm_conn_srvcs.count ; j++)
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* check if an entry already present */
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(bta_dm_conn_srvcs.conn_srvc[j].id == BTA_ID_HH )
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1213e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG ("SCO status change(Active: %d), modify HID link policy. state: %d",
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bScoActive, bta_dm_conn_srvcs.conn_srvc[j].state);
12155738f83aeb59361a0a2eda2460113f6dc919427The 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);
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12175738f83aeb59361a0a2eda2460113f6dc919427The 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 */
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (!bScoActive)
121976356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                bta_dm_pm_set_mode(bta_dm_conn_srvcs.conn_srvc[j].peer_bdaddr, BTA_DM_PM_NO_ACTION,
122076356aee883af67898ddc1aa3b628195f396d42aVenkatRaghavan VijayaRaghavan                                   BTA_DM_PM_RESTART);
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function         bta_dm_pm_set_sniff_policy
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description      Disables/Enables sniff in link policy for the give device
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns          None
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_dm_pm_set_sniff_policy(tBTA_DM_PEER_DEVICE *p_dev, BOOLEAN bDisable)
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 policy_setting;
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (!p_dev)
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bDisable)
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        policy_setting = bta_dm_cb.cur_policy &
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (HCI_ENABLE_MASTER_SLAVE_SWITCH |
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             HCI_ENABLE_HOLD_MODE  |
12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project             HCI_ENABLE_PARK_MODE);
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /*  allow sniff after sco is closed */
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project         policy_setting= bta_dm_cb.cur_policy;
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* if disabling SNIFF, make sure link is Active */
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bDisable)
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        bta_dm_pm_active(p_dev->peer_bdaddr);
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update device record and set link policy */
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_dev->link_policy = policy_setting;
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTM_SetLinkPolicy(p_dev->peer_bdaddr, &policy_setting);
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1265e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji
126681b03192d4284acc7c9903f5b183927797dceca4Prerepa Viswanadham#if ((defined BLE_INCLUDED) && (BLE_INCLUDED == TRUE))
1267e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji/*******************************************************************************
1268e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji**
1269e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji** Function         bta_dm_pm_obtain_controller_state
1270e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji**
1271e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji** Description      This function obtains the consolidated controller power state
1272e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji**
1273e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji** Parameters:
1274e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji**
1275e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji*******************************************************************************/
1276e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya CallojitBTA_DM_CONTRL_STATE bta_dm_pm_obtain_controller_state(void)
1277e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji{
1278e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji    /*   Did not use counts as it is not sure, how accurate the count values are in
1279e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji     **  bta_dm_cb.device_list.count > 0 || bta_dm_cb.device_list.le_count > 0 */
1280e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji
1281e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji    tBTA_DM_CONTRL_STATE cur_state = BTA_DM_CONTRL_UNKNOWN;
1282e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji    cur_state = BTM_PM_ReadControllerState();
1283e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji
1284e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji    APPL_TRACE_DEBUG("bta_dm_pm_obtain_controller_state: %d", cur_state);
1285e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji    return cur_state;
1286e5ba8841cd39e17c05aeb4ab65b5b761d41577daSatya Calloji}
128781b03192d4284acc7c9903f5b183927797dceca4Prerepa Viswanadham#endif
1288