summaryrefslogtreecommitdiff
path: root/firmware/2lib/2misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/2lib/2misc.c')
-rw-r--r--firmware/2lib/2misc.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/firmware/2lib/2misc.c b/firmware/2lib/2misc.c
index 30d6011c..de4b4241 100644
--- a/firmware/2lib/2misc.c
+++ b/firmware/2lib/2misc.c
@@ -144,7 +144,8 @@ void vb2_check_recovery(struct vb2_context *ctx)
if (ctx->flags & VB2_CONTEXT_FORCE_RECOVERY_MODE) {
VB2_DEBUG("Recovery was requested manually\n");
- if (subcode && !sd->recovery_reason)
+ if (subcode && !sd->recovery_reason &&
+ subcode != VB2_RECOVERY_TRAIN_AND_REBOOT)
/*
* Recovery was requested at 'broken' screen.
* Promote subcode to reason.
@@ -416,16 +417,20 @@ int vb2_allow_recovery(struct vb2_context *ctx)
void vb2_clear_recovery(struct vb2_context *ctx)
{
struct vb2_shared_data *sd = vb2_get_sd(ctx);
+ uint32_t reason = vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST);
+ uint32_t subcode = vb2_nv_get(ctx, VB2_NV_RECOVERY_SUBCODE);
- VB2_DEBUG("Clearing recovery request: %#x / %#x\n",
- vb2_nv_get(ctx, VB2_NV_RECOVERY_REQUEST),
- vb2_nv_get(ctx, VB2_NV_RECOVERY_SUBCODE));
+ if (reason || subcode)
+ VB2_DEBUG("Clearing recovery request: %#x / %#x\n",
+ reason, subcode);
- /* Clear recovery request for both cases. */
+ /* Clear recovery request for both manual and non-manual. */
vb2_nv_set(ctx, VB2_NV_RECOVERY_REQUEST, VB2_RECOVERY_NOT_REQUESTED);
- vb2_nv_set(ctx, VB2_NV_RECOVERY_SUBCODE, VB2_RECOVERY_NOT_REQUESTED);
+ vb2_nv_set(ctx, VB2_NV_RECOVERY_SUBCODE, 0);
- if (!vb2_allow_recovery(ctx)) {
+ /* But stow recovery reason as subcode for non-manual recovery. */
+ if ((ctx->flags & VB2_CONTEXT_RECOVERY_MODE) &&
+ !vb2_allow_recovery(ctx)) {
VB2_DEBUG("Stow recovery reason as subcode (%#x)\n",
sd->recovery_reason);
vb2_nv_set(ctx, VB2_NV_RECOVERY_SUBCODE, sd->recovery_reason);