summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/lib/ec_sync_all.c19
-rw-r--r--tests/ec_sync_tests.c5
2 files changed, 15 insertions, 9 deletions
diff --git a/firmware/lib/ec_sync_all.c b/firmware/lib/ec_sync_all.c
index 6c3fe74f..f981a52d 100644
--- a/firmware/lib/ec_sync_all.c
+++ b/firmware/lib/ec_sync_all.c
@@ -44,7 +44,7 @@ VbError_t ec_sync_all(struct vb2_context *ctx)
struct vb2_shared_data *sd = vb2_get_sd(ctx);
VbSharedDataHeader *shared = sd->vbsd;
VbAuxFwUpdateSeverity_t fw_update;
- VbError_t rv;
+ VbError_t rv, update_aux_fw_rv;
rv = ec_sync_check_aux_fw(ctx, &fw_update);
if (rv)
@@ -92,14 +92,19 @@ VbError_t ec_sync_all(struct vb2_context *ctx)
* Aux FW update may request RO reboot to force EC cold reset so also
* unload the option ROM if needed to prevent a second reboot.
*/
- rv = ec_sync_update_aux_fw(ctx);
- if (rv) {
- ec_sync_unload_oprom(ctx, shared, need_wait_screen);
- return rv;
- }
+ update_aux_fw_rv = ec_sync_update_aux_fw(ctx);
- /* Reboot to unload VGA Option ROM if needed */
+ /* Reboot to unload VGA Option ROM for both slow EC & AUX FW updates */
rv = ec_sync_unload_oprom(ctx, shared, need_wait_screen);
+ /* Something went wrong during AUX FW update */
+ if (update_aux_fw_rv)
+ return update_aux_fw_rv;
+ /*
+ * AUX FW Update is applied successfully. Request EC reboot to RO,
+ * so that the chips that had FW update gets reset to a clean state.
+ */
+ if (fw_update > VB_AUX_FW_NO_UPDATE)
+ return VBERROR_EC_REBOOT_TO_RO_REQUIRED;
if (rv)
return rv;
diff --git a/tests/ec_sync_tests.c b/tests/ec_sync_tests.c
index a971b961..1cec7f24 100644
--- a/tests/ec_sync_tests.c
+++ b/tests/ec_sync_tests.c
@@ -427,7 +427,7 @@ static void VbSoftwareSyncTest(void)
ResetMocks();
ec_aux_fw_mock_severity = VB_AUX_FW_FAST_UPDATE;
- test_ssync(VBERROR_SUCCESS, 0,
+ test_ssync(VBERROR_EC_REBOOT_TO_RO_REQUIRED, 0,
"Fast auxiliary FW update needed");
TEST_EQ(screens_count, 0,
" wait screen skipped");
@@ -436,7 +436,7 @@ static void VbSoftwareSyncTest(void)
ResetMocks();
ec_aux_fw_mock_severity = VB_AUX_FW_SLOW_UPDATE;
- test_ssync(VBERROR_SUCCESS, 0,
+ test_ssync(VBERROR_EC_REBOOT_TO_RO_REQUIRED, 0,
"Slow auxiliary FW update needed");
TEST_EQ(ec_aux_fw_update_req, 1, " aux fw update requested");
TEST_EQ(ec_aux_fw_protected, 1, " aux fw protected");
@@ -444,6 +444,7 @@ static void VbSoftwareSyncTest(void)
" wait screen forced");
ResetMocks();
+ ec_aux_fw_mock_severity = VB_AUX_FW_FAST_UPDATE;
ec_aux_fw_retval = VBERROR_UNKNOWN;
test_ssync(VBERROR_UNKNOWN, VB2_RECOVERY_AUX_FW_UPDATE,
"Error updating AUX firmware");