diff --git i/components/ble/ble_services/ble_dfu/ble_dfu_bonded.c w/components/ble/ble_services/ble_dfu/ble_dfu_bonded.c index d4c0a194..eca51948 100644 --- i/components/ble/ble_services/ble_dfu/ble_dfu_bonded.c +++ w/components/ble/ble_services/ble_dfu/ble_dfu_bonded.c @@ -51,6 +51,7 @@ #include "peer_id.h" #include "nrf_sdh_soc.h" #include "nrf_strerror.h" +#include "app_util_platform.h" #if (NRF_DFU_BLE_BUTTONLESS_SUPPORTS_BONDS) @@ -204,24 +205,33 @@ uint32_t ble_dfu_buttonless_backend_init(ble_dfu_buttonless_t * p_dfu) uint32_t ble_dfu_buttonless_async_svci_init(void) { - uint32_t ret; + uint32_t ret = NRF_SUCCESS; + uint32_t svc_ret; + + CRITICAL_REGION_ENTER(); // Set the vector table base address to the bootloader. - ret = nrf_dfu_svci_vector_table_set(); + svc_ret = nrf_dfu_svci_vector_table_set(); NRF_LOG_DEBUG("nrf_dfu_svci_vector_table_set() -> %s", - (ret == NRF_SUCCESS) ? "success" : nrf_strerror_get(ret)); - VERIFY_SUCCESS(ret); + (ret == NRF_SUCCESS) ? "success" : nrf_strerror_get(svc_ret)); + if (svc_ret == NRF_SUCCESS) { + // Initialize the asynchronous SuperVisor interface to set peer data in Secure DFU bootloader. + ret = nrf_dfu_set_peer_data_init(); + NRF_LOG_DEBUG("nrf_dfu_set_peer_data_init() -> %s", + (ret == NRF_SUCCESS) ? "success" : nrf_strerror_get(ret)); + + // Set the vector table base address back to main application. + svc_ret = nrf_dfu_svci_vector_table_unset(); + NRF_LOG_DEBUG("nrf_dfu_svci_vector_table_unset() -> %s", + (svc_ret == NRF_SUCCESS) ? "success" : nrf_strerror_get(svc_ret)); + } - // Initialize the asynchronous SuperVisor interface to set peer data in Secure DFU bootloader. - ret = nrf_dfu_set_peer_data_init(); - NRF_LOG_DEBUG("nrf_dfu_set_peer_data_init() -> %s", - (ret == NRF_SUCCESS) ? "success" : nrf_strerror_get(ret)); - VERIFY_SUCCESS(ret); + CRITICAL_REGION_EXIT(); - // Set the vector table base address back to main application. - ret = nrf_dfu_svci_vector_table_unset(); - NRF_LOG_DEBUG("nrf_dfu_svci_vector_table_unset() -> %s", - (ret == NRF_SUCCESS) ? "success" : nrf_strerror_get(ret)); + if (ret == NRF_SUCCESS) { + // May be multiple errors, return first error encountered. + ret = svc_ret; + } return ret; } diff --git i/components/ble/ble_services/ble_dfu/ble_dfu_unbonded.c w/components/ble/ble_services/ble_dfu/ble_dfu_unbonded.c index 1326e663..18540070 100644 --- i/components/ble/ble_services/ble_dfu/ble_dfu_unbonded.c +++ w/components/ble/ble_services/ble_dfu/ble_dfu_unbonded.c @@ -143,15 +143,25 @@ uint32_t ble_dfu_buttonless_backend_init(ble_dfu_buttonless_t * p_dfu) uint32_t ble_dfu_buttonless_async_svci_init(void) { - uint32_t ret_val; + uint32_t ret_val = NRF_SUCCESS; + uint32_t svc_ret; - ret_val = nrf_dfu_svci_vector_table_set(); - VERIFY_SUCCESS(ret_val); + CRITICAL_REGION_ENTER(); - ret_val = nrf_dfu_set_adv_name_init(); - VERIFY_SUCCESS(ret_val); + svc_ret = nrf_dfu_svci_vector_table_set(); + if (svc_ret == NRF_SUCCESS) { - ret_val = nrf_dfu_svci_vector_table_unset(); + ret_val = nrf_dfu_set_adv_name_init(); + + svc_ret = nrf_dfu_svci_vector_table_unset(); + } + + CRITICAL_REGION_EXIT(); + + if (ret_val == NRF_SUCCESS) { + // May be multiple errors, return first error encountered. + ret_val = svc_ret; + } return ret_val; }