summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--firmware/lib/vboot_api_kernel.c17
-rw-r--r--tests/vboot_api_kernel2_tests.c16
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;