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