platform: msm_shared: Do not reset success bit for alternate slot

When the current slot becomes unbootable, it switches to alternate slot
and during the switch, all the partition attributes are reset. This can
lead to issues of making both slots unbootable when other sequences impacting
device bootup are initiated.

So, reset the attributes only when the slot is switched through fastboot
command and retain the SUCCESS bit when slot switch happens due to
unbootable current slot

Change-Id: If9a5eb5284035bdfce09b2114cebedd65100f896
diff --git a/platform/msm_shared/ab_partition_parser.c b/platform/msm_shared/ab_partition_parser.c
index 7cee1a8..53a671c 100644
--- a/platform/msm_shared/ab_partition_parser.c
+++ b/platform/msm_shared/ab_partition_parser.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017-2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -236,7 +236,7 @@
 /*
 	Function: Switch active partitions.
 */
-void partition_switch_slots(int old_slot, int new_slot)
+void partition_switch_slots(int old_slot, int new_slot, boolean reset_success_bit)
 {
 #ifdef AB_DEBUG
 	dprintf(INFO, "Switching slots %s to %s\n",
@@ -255,9 +255,15 @@
 						((PART_ATT_PRIORITY_VAL |
 						PART_ATT_ACTIVE_VAL |
 						PART_ATT_MAX_RETRY_COUNT_VAL));
+
 	partition_entries[new_slot_index].attribute_flag &=
-						(~PART_ATT_SUCCESSFUL_VAL
-						& ~PART_ATT_UNBOOTABLE_VAL);
+						(~PART_ATT_UNBOOTABLE_VAL);
+	if (reset_success_bit &&
+		(partition_entries[new_slot_index].attribute_flag &
+						PART_ATT_SUCCESSFUL_VAL)) {
+		partition_entries[new_slot_index].attribute_flag &=
+						(~PART_ATT_SUCCESSFUL_VAL);
+	}
 
 	if (!attributes_updated)
 		attributes_updated = true;
@@ -395,7 +401,7 @@
 		next_slot = next_active_bootable_slot(partition_entries);
 		if (next_slot != INVALID)
 		{
-			partition_switch_slots(boot_slot, next_slot);
+			partition_switch_slots(boot_slot, next_slot, false);
 			reboot_device(0);
 		}
 		else
diff --git a/platform/msm_shared/include/ab_partition_parser.h b/platform/msm_shared/include/ab_partition_parser.h
index 607a412..2001b7f 100644
--- a/platform/msm_shared/include/ab_partition_parser.h
+++ b/platform/msm_shared/include/ab_partition_parser.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2017, 2019, The Linux Foundation. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are met:
@@ -69,7 +69,7 @@
 void partition_mark_active_slot();	/* Marking slot active */
 void partition_reset_attributes();	/* Resetting slot attr. */
 void partition_fill_slot_meta();	/* Fill slot meta infomation */
-void partition_switch_slots();		/* Switching slots */
+void partition_switch_slots(int old_slot, int new_slot, boolean reset_success_bit); /* Switching slots */
 void partition_deactivate_slot(int slot); /* Mark slot unbootable and reset other attributes*/
 void partition_activate_slot(int slot);	 /* Mark slot bootable and set other attributes*/
 int partition_find_boot_slot();		/* Find bootable partition */