diff options
-rw-r--r-- | firmware/lib/vboot_api_kernel.c | 17 | ||||
-rw-r--r-- | tests/vboot_api_kernel2_tests.c | 16 |
2 files changed, 31 insertions, 2 deletions
diff --git a/firmware/lib/vboot_api_kernel.c b/firmware/lib/vboot_api_kernel.c index 5c498eea..4cf2a946 100644 --- a/firmware/lib/vboot_api_kernel.c +++ b/firmware/lib/vboot_api_kernel.c @@ -392,8 +392,9 @@ VbError_t VbBootDeveloper(VbCommonParams *cparams, LoadKernelParams *p) } /* Delay in recovery mode */ -#define REC_DISK_DELAY 1000 /* Check disks every 1s */ -#define REC_KEY_DELAY 20 /* Check keys every 20ms */ +#define REC_DISK_DELAY 1000 /* Check disks every 1s */ +#define REC_KEY_DELAY 20 /* Check keys every 20ms */ +#define REC_MEDIA_INIT_DELAY 500 /* Check removable media every 500ms */ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p) { @@ -416,7 +417,19 @@ VbError_t VbBootRecovery(VbCommonParams *cparams, LoadKernelParams *p) VBDEBUG(("VbBootRecovery() forcing device removal\n")); + /* If no media is detected initially, delay and make one extra + * attempt, in case devices appear later than expected. */ + if (VBERROR_SUCCESS != VbExDiskGetInfo(&disk_info, &disk_count, + VB_DISK_FLAG_REMOVABLE)) + disk_count = 0; + + VbExDiskFreeInfo(disk_info, NULL); + if (0 == disk_count) + VbExSleepMs(REC_MEDIA_INIT_DELAY); + while (1) { + disk_info = NULL; + disk_count = 0; if (VBERROR_SUCCESS != VbExDiskGetInfo(&disk_info, &disk_count, VB_DISK_FLAG_REMOVABLE)) diff --git a/tests/vboot_api_kernel2_tests.c b/tests/vboot_api_kernel2_tests.c index 1cb2d835..21ea3063 100644 --- a/tests/vboot_api_kernel2_tests.c +++ b/tests/vboot_api_kernel2_tests.c @@ -419,6 +419,7 @@ static void VbBootRecTest(void) shutdown_request_calls_left = 100; mock_num_disks[0] = 1; mock_num_disks[1] = 1; + mock_num_disks[2] = 1; vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE; TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED, "Remove"); @@ -455,6 +456,21 @@ static void VbBootRecTest(void) TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_INSERT, " insert screen"); + /* Removal if no disk initially found, but found on second attempt */ + ResetMocks(); + shutdown_request_calls_left = 100; + mock_num_disks[0] = 0; + mock_num_disks[1] = 1; + vbtlk_retval = VBERROR_NO_DISK_FOUND - VB_DISK_FLAG_REMOVABLE; + TEST_EQ(VbBootRecovery(&cparams, &lkp), VBERROR_SHUTDOWN_REQUESTED, + "Remove"); + TEST_EQ(screens_displayed[0], VB_SCREEN_RECOVERY_REMOVE, + " remove screen"); + TEST_EQ(screens_displayed[1], VB_SCREEN_BLANK, + " blank screen"); + TEST_EQ(screens_displayed[2], VB_SCREEN_RECOVERY_INSERT, + " insert screen"); + /* Bad disk count doesn't require removal */ ResetMocks(); mock_num_disks[0] = -1; |