Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 772d999c authored by Zach Johnson's avatar Zach Johnson Committed by Gerrit Code Review
Browse files

Merge changes Id5c2d642,I288816ab,If435eb75,I5c0c796d,I5c1b442a

* changes:
  Clean up bta_dm_pm_set_sniff_policy
  Rename set/clear policy, since it's just about role switch
  Remove bta_sys_clear_policy -> direct call
  Remove bta_sys_set_policy -> direct call
  HCI_ENABLE_SNIFF_MODE is never removed
parents e2929da4 d15f49e1
Loading
Loading
Loading
Loading
+6 −20
Original line number Diff line number Diff line
@@ -1855,7 +1855,6 @@ void bta_av_conn_failed(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
 *
 ******************************************************************************/
void bta_av_do_start(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
  uint8_t clear_policy = 0;
  uint8_t cur_role;

  LOG_INFO("%s: peer %s sco_occupied:%s role:0x%x started:%s wait:0x%x",
@@ -1872,11 +1871,9 @@ void bta_av_do_start(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
   * It would not hurt us, if the peer device wants us to be master */
  if ((BTM_GetRole(p_scb->PeerAddress(), &cur_role) == BTM_SUCCESS) &&
      (cur_role == HCI_ROLE_MASTER)) {
    clear_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
    BTA_dm_block_role_switch_for(p_scb->PeerAddress());
  }

  bta_sys_clear_policy(BTA_ID_AV, clear_policy, p_scb->PeerAddress());

  if (p_scb->started) {
    p_scb->role |= BTA_AV_ROLE_START_INT;
    if (p_scb->wait != 0) {
@@ -1936,7 +1933,6 @@ void bta_av_str_stopped(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
  uint8_t start = p_scb->started;
  bool sus_evt = true;
  BT_HDR* p_buf;
  uint8_t set_policy = HCI_ENABLE_SNIFF_MODE;

  APPL_TRACE_ERROR(
      "%s: peer %s bta_handle:0x%x audio_open_cnt:%d, p_data %p start:%d",
@@ -1946,9 +1942,8 @@ void bta_av_str_stopped(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
  bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->PeerAddress());
  if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 ||
      bta_av_cb.audio_open_cnt == 1) {
    set_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
    BTA_dm_unblock_role_switch_for(p_scb->PeerAddress());
  }
  bta_sys_set_policy(BTA_ID_AV, set_policy, p_scb->PeerAddress());

  if (p_scb->co_started) {
    if (p_scb->offload_started) {
@@ -2245,7 +2240,6 @@ void bta_av_start_ok(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
  uint16_t flush_to;
  uint8_t new_role = p_scb->role;
  BT_HDR hdr;
  uint8_t clear_policy = 0;
  uint8_t cur_role;
  uint8_t local_tsep = p_scb->seps[p_scb->sep_idx].tsep;

@@ -2382,10 +2376,8 @@ void bta_av_start_ok(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
       * master */
      if ((BTM_GetRole(p_scb->PeerAddress(), &cur_role) == BTM_SUCCESS) &&
          (cur_role == HCI_ROLE_MASTER)) {
        clear_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
        BTA_dm_block_role_switch_for(p_scb->PeerAddress());
      }

      bta_sys_clear_policy(BTA_ID_AV, clear_policy, p_scb->PeerAddress());
    }

    p_scb->role = new_role;
@@ -2436,8 +2428,6 @@ void bta_av_start_ok(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
 *
 ******************************************************************************/
void bta_av_start_failed(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
  uint8_t set_policy = (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_MASTER_SLAVE_SWITCH);

  APPL_TRACE_ERROR(
      "%s: peer %s bta_handle:0x%x audio_open_cnt:%d started:%s co_started:%d",
      __func__, p_scb->PeerAddress().ToString().c_str(), p_scb->hndl,
@@ -2449,7 +2439,7 @@ void bta_av_start_failed(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
    notify_start_failed(p_scb);
  }

  bta_sys_set_policy(BTA_ID_AV, set_policy, p_scb->PeerAddress());
  BTA_dm_unblock_role_switch_for(p_scb->PeerAddress());
  p_scb->sco_suspend = false;
}

@@ -2465,7 +2455,6 @@ void bta_av_start_failed(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
void bta_av_str_closed(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
  tBTA_AV data;
  tBTA_AV_EVT event;
  uint8_t set_policy = HCI_ENABLE_SNIFF_MODE;

  APPL_TRACE_WARNING(
      "%s: peer %s bta_handle:0x%x open_status:%d chnl:%d co_started:%d",
@@ -2474,9 +2463,8 @@ void bta_av_str_closed(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {

  if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 ||
      bta_av_cb.audio_open_cnt == 1) {
    set_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
    BTA_dm_unblock_role_switch_for(p_scb->PeerAddress());
  }
  bta_sys_set_policy(BTA_ID_AV, set_policy, p_scb->PeerAddress());
  if (bta_av_cb.audio_open_cnt <= 1) {
    /* last connection - restore the allow switch flag */
    L2CA_SetDesireRole(L2CAP_ROLE_ALLOW_SWITCH);
@@ -2547,7 +2535,6 @@ void bta_av_clr_cong(tBTA_AV_SCB* p_scb, UNUSED_ATTR tBTA_AV_DATA* p_data) {
void bta_av_suspend_cfm(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
  tBTA_AV_SUSPEND suspend_rsp;
  uint8_t err_code = p_data->str_msg.msg.hdr.err_code;
  uint8_t set_policy = HCI_ENABLE_SNIFF_MODE;

  APPL_TRACE_DEBUG("%s: peer %s bta_handle:0x%x audio_open_cnt:%d err_code:%d",
                   __func__, p_scb->PeerAddress().ToString().c_str(),
@@ -2588,9 +2575,8 @@ void bta_av_suspend_cfm(tBTA_AV_SCB* p_scb, tBTA_AV_DATA* p_data) {
  bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->PeerAddress());
  if ((bta_av_cb.features & BTA_AV_FEAT_MASTER) == 0 ||
      bta_av_cb.audio_open_cnt == 1) {
    set_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
    BTA_dm_unblock_role_switch_for(p_scb->PeerAddress());
  }
  bta_sys_set_policy(BTA_ID_AV, set_policy, p_scb->PeerAddress());

  /* in case that we received suspend_ind, we may need to call co_stop here */
  if (p_scb->co_started) {
+4 −15
Original line number Diff line number Diff line
@@ -915,15 +915,13 @@ void bta_av_restore_switch(void) {
  tBTA_AV_CB* p_cb = &bta_av_cb;
  int i;
  uint8_t mask;
  uint8_t set_policy = (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_MASTER_SLAVE_SWITCH);

  APPL_TRACE_DEBUG("%s: reg_audio: 0x%x", __func__, bta_av_cb.reg_audio);
  for (i = 0; i < BTA_AV_NUM_STRS; i++) {
    mask = BTA_AV_HNDL_TO_MSK(i);
    if (p_cb->conn_audio == mask) {
      if (p_cb->p_scb[i]) {
        bta_sys_set_policy(BTA_ID_AV, set_policy,
                           p_cb->p_scb[i]->PeerAddress());
        BTA_dm_unblock_role_switch_for(p_cb->p_scb[i]->PeerAddress());
      }
      break;
    }
@@ -946,7 +944,6 @@ static void bta_av_sys_rs_cback(UNUSED_ATTR tBTA_SYS_CONN_STATUS status,
  tBTA_AV_SCB* p_scb = NULL;
  uint8_t cur_role;
  uint8_t peer_idx = 0;
  uint8_t set_policy = (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_MASTER_SLAVE_SWITCH);

  APPL_TRACE_DEBUG(
      "%s: peer %s new_role:%d hci_status:0x%x bta_av_cb.rs_idx:%d", __func__,
@@ -963,12 +960,6 @@ static void bta_av_sys_rs_cback(UNUSED_ATTR tBTA_SYS_CONN_STATUS status,
      APPL_TRACE_DEBUG(
          "%s: peer %s found: new_role:%d, hci_status:0x%x bta_handle:0x%x",
          __func__, peer_addr.ToString().c_str(), id, app_id, p_scb->hndl);
      /*
      if ((id != HCI_ROLE_MASTER) && (app_id != HCI_SUCCESS))
      {
          bta_sys_set_policy(BTA_ID_AV, set_policy, p_scb->PeerAddress());
      }
      */
      p_buf->hdr.event = BTA_AV_ROLE_CHANGE_EVT;
      p_buf->hdr.layer_specific = p_scb->hndl;
      p_buf->new_role = id;
@@ -983,7 +974,7 @@ static void bta_av_sys_rs_cback(UNUSED_ATTR tBTA_SYS_CONN_STATUS status,
  if ((HCI_SUCCESS != app_id) &&
      (BTM_GetRole(peer_addr, &cur_role) == BTM_SUCCESS) &&
      (cur_role == HCI_ROLE_SLAVE)) {
    bta_sys_set_policy(BTA_ID_AV, set_policy, peer_addr);
    BTA_dm_unblock_role_switch_for(peer_addr);
  }

  /* if BTA_AvOpen() was called for other device, which caused the role switch
@@ -1109,8 +1100,7 @@ bool bta_av_switch_if_needed(tBTA_AV_SCB* p_scb) {
       */
      if (HCI_ROLE_MASTER != role) {
        if (bta_av_cb.features & BTA_AV_FEAT_MASTER)
          bta_sys_clear_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH,
                               p_scbi->PeerAddress());
          BTA_dm_block_role_switch_for(p_scbi->PeerAddress());
        if (BTM_CMD_STARTED !=
            BTM_SwitchRole(p_scbi->PeerAddress(), HCI_ROLE_MASTER, NULL)) {
          /* can not switch role on SCBI
@@ -1154,8 +1144,7 @@ bool bta_av_link_role_ok(tBTA_AV_SCB* p_scb, uint8_t bits) {
        (A2DP_BitsSet(bta_av_cb.conn_audio) > bits ||
         (bta_av_cb.features & BTA_AV_FEAT_MASTER))) {
      if (bta_av_cb.features & BTA_AV_FEAT_MASTER)
        bta_sys_clear_policy(BTA_ID_AV, HCI_ENABLE_MASTER_SLAVE_SWITCH,
                             p_scb->PeerAddress());
        BTA_dm_block_role_switch_for(p_scb->PeerAddress());

      tBTM_STATUS status =
          BTM_SwitchRole(p_scb->PeerAddress(), HCI_ROLE_MASTER, NULL);
+6 −12
Original line number Diff line number Diff line
@@ -827,28 +827,22 @@ void bta_dm_pin_reply(std::unique_ptr<tBTA_DM_API_PIN_REPLY> msg) {
  }
}

void BTA_dm_set_policy(uint8_t policy, const RawAddress& peer_addr) {
void BTA_dm_unblock_role_switch_for(const RawAddress& peer_addr) {
  auto p_dev = bta_dm_find_peer_device(peer_addr);
  if (!p_dev) {
    return;
  }
  p_dev->link_policy |= policy;
  p_dev->link_policy |= HCI_ENABLE_MASTER_SLAVE_SWITCH;
  BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));
}

void BTA_dm_clear_policy(uint8_t policy, const RawAddress& peer_addr) {
void BTA_dm_block_role_switch_for(const RawAddress& peer_addr) {
  auto p_dev = bta_dm_find_peer_device(peer_addr);
  if (!p_dev) {
    return;
  }
  /* clear the policy from the default link policy */
  p_dev->link_policy &= (~policy);
  p_dev->link_policy &= (~HCI_ENABLE_MASTER_SLAVE_SWITCH);
  BTM_SetLinkPolicy(p_dev->peer_bdaddr, &(p_dev->link_policy));

  if (policy & (HCI_ENABLE_SNIFF_MODE | HCI_ENABLE_PARK_MODE)) {
    /* if clearing sniff/park, wake the link */
    bta_dm_pm_active(p_dev->peer_bdaddr);
  }
}

void BTA_dm_unblock_role_switch() {
@@ -2548,7 +2542,7 @@ static void handle_role_change(const RawAddress& bd_addr, uint8_t new_role,
    }

    if (need_policy_change) {
      BTA_dm_clear_policy(HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
      BTA_dm_block_role_switch_for(p_dev->peer_bdaddr);
    }
  } else {
    /* there's AV no activity on this link and role switch happened
@@ -2777,7 +2771,7 @@ static bool bta_dm_check_av(uint16_t event) {
          switching = true;
        }
        /* else either already master or can not switch for some reasons */
        BTA_dm_clear_policy(HCI_ENABLE_MASTER_SLAVE_SWITCH, p_dev->peer_bdaddr);
        BTA_dm_block_role_switch_for(p_dev->peer_bdaddr);
        break;
      }
    }
+4 −14
Original line number Diff line number Diff line
@@ -1096,26 +1096,16 @@ static void bta_dm_pm_hid_check(bool bScoActive) {
 ******************************************************************************/
static void bta_dm_pm_set_sniff_policy(tBTA_DM_PEER_DEVICE* p_dev,
                                       bool bDisable) {
  uint16_t policy_setting;

  if (!p_dev) return;

  if (bDisable) {
    policy_setting =
        bta_dm_cb.cur_policy & (HCI_ENABLE_MASTER_SLAVE_SWITCH |
                                HCI_ENABLE_HOLD_MODE | HCI_ENABLE_PARK_MODE);

    p_dev->link_policy &= ~HCI_ENABLE_SNIFF_MODE;
    bta_dm_pm_active(p_dev->peer_bdaddr);
  } else {
    /*  allow sniff after sco is closed */
    policy_setting = bta_dm_cb.cur_policy;
    p_dev->link_policy |= HCI_ENABLE_SNIFF_MODE;
  }

  /* if disabling SNIFF, make sure link is Active */
  if (bDisable) bta_dm_pm_active(p_dev->peer_bdaddr);

  /* update device record and set link policy */
  p_dev->link_policy = policy_setting;
  BTM_SetLinkPolicy(p_dev->peer_bdaddr, &policy_setting);
  BTM_SetLinkPolicy(p_dev->peer_bdaddr, &p_dev->link_policy);
}

/*******************************************************************************
+2 −5
Original line number Diff line number Diff line
@@ -241,11 +241,8 @@ extern void bta_sys_remove_uuid(uint16_t uuid16);
#define bta_sys_remove_uuid(ut)
#endif

extern void bta_sys_set_policy(uint8_t id, uint8_t policy,
                               const RawAddress& peer_addr);
extern void bta_sys_clear_policy(uint8_t id, uint8_t policy,
                                 const RawAddress& peer_addr);

void BTA_dm_unblock_role_switch_for(const RawAddress& peer_addr);
void BTA_dm_block_role_switch_for(const RawAddress& peer_addr);
void BTA_dm_unblock_role_switch();
void BTA_dm_block_role_switch();

Loading