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

Commit 0acd6e4f authored by Srinu Jella's avatar Srinu Jella Committed by Andre Eisenbach
Browse files

Separated initialize and re-initialize of DM control block

Use Case: Turning ON Bluetooth failed after network reset

Steps:
1. Turn ON Bluetooth
2. Go to settings->backup and restore->network reset.
3. Do reset to reset BT, WIFI, data.
4. Go back to Bluetooth settings menu and try to turn ON Bluetooth.

Failure: Bluetooth is not turning ON after network reset

Root Cause: In case BTA_SYS_HW_OFF_EVT event, alarm_new is getting called.
Which is causing issue in Next Turn ON of Bluetooth if PID is same.

Fix: Separated initialize and re-initialize of DM control block

Test: code compilation.

Change-Id: I09abfb22c67f04626564a7791e4b61ec3a523cc1
parent 04e5a2e7
Loading
Loading
Loading
Loading
+32 −12
Original line number Diff line number Diff line
@@ -298,13 +298,35 @@ void bta_dm_enable(tBTA_DM_MSG *p_data)
**
** Function         bta_dm_init_cb
**
** Description      Initializes or re-initializes the bta_dm_cb control block
** Description      Initializes the bta_dm_cb control block
**
**
** Returns          void
**
*******************************************************************************/
void bta_dm_init_cb(void)
{
    memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
    bta_dm_cb.disable_timer = alarm_new("bta_dm.disable_timer");
    bta_dm_cb.switch_delay_timer = alarm_new("bta_dm.switch_delay_timer");
    for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) {
        for (size_t j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) {
            bta_dm_cb.pm_timer[i].timer[j] = alarm_new("bta_dm.pm_timer");
        }
    }
}

/*******************************************************************************
**
** Function         bta_dm_deinit_cb
**
** Description      De-initializes the bta_dm_cb control block
**
**
** Returns          void
**
*******************************************************************************/
void bta_dm_deinit_cb(void)
{
    /*
     * TODO: Should alarm_free() the bta_dm_cb timers during graceful
@@ -318,13 +340,6 @@ void bta_dm_init_cb(void)
      }
    }
    memset(&bta_dm_cb, 0, sizeof(bta_dm_cb));
    bta_dm_cb.disable_timer = alarm_new("bta_dm.disable_timer");
    bta_dm_cb.switch_delay_timer = alarm_new("bta_dm.switch_delay_timer");
    for (size_t i = 0; i < BTA_DM_NUM_PM_TIMER; i++) {
        for (size_t j = 0; j < BTA_DM_PM_MODE_TIMER_MAX; j++) {
            bta_dm_cb.pm_timer[i].timer[j] = alarm_new("bta_dm.pm_timer");
        }
    }
}

/*******************************************************************************
@@ -362,7 +377,12 @@ static void bta_dm_sys_hw_cback( tBTA_SYS_HW_EVT status )
            bta_dm_cb.p_sec_cback(BTA_DM_DISABLE_EVT, NULL);

        /* reinitialize the control block */
        bta_dm_init_cb();
        bta_dm_deinit_cb();

        /* hw is ready, go on with BTA DM initialization */
        alarm_free(bta_dm_search_cb.search_timer);
        alarm_free(bta_dm_search_cb.gatt_close_timer);
        memset(&bta_dm_search_cb, 0, sizeof(bta_dm_search_cb));

        /* unregister from SYS */
        bta_sys_hw_unregister( BTA_SYS_HW_BLUETOOTH );
+0 −2
Original line number Diff line number Diff line
@@ -67,8 +67,6 @@ tBTA_STATUS BTA_EnableBluetooth(tBTA_DM_SEC_CBACK *p_cback)
    if (bta_dm_cb.disabling)
        return BTA_FAILURE;

    bta_dm_init_cb();

    bta_sys_register(BTA_ID_DM, &bta_dm_reg );
    bta_sys_register(BTA_ID_DM_SEARCH, &bta_dm_search_reg );