Merge "partition_parser: Update logic to access backup GPT header"
diff --git a/platform/msm_shared/partition_parser.c b/platform/msm_shared/partition_parser.c
index 0b1bf46..9651e6f 100644
--- a/platform/msm_shared/partition_parser.c
+++ b/platform/msm_shared/partition_parser.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
 
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions are
@@ -199,6 +199,7 @@
 	unsigned int header_size;
 	unsigned long long first_usable_lba;
 	unsigned long long backup_header_lba;
+	unsigned long long card_size_sec;
 	unsigned int max_partition_count = 0;
 	unsigned int partition_entry_size;
 	unsigned char data[BLOCK_SIZE];
@@ -207,15 +208,16 @@
 	unsigned int n = 0;	/* Counter for UTF-16 -> 8 conversion */
 	unsigned char UTF16_name[MAX_GPT_NAME_SIZE];
 	/* LBA of first partition -- 1 Block after Protected MBR + 1 for PT */
-	unsigned long long partition_0 = 2;
+	unsigned long long partition_0;
 	partition_count = 0;
 
 	/* Print out the GPT first */
 	ret = mmc_boot_read_from_card(mmc_host, mmc_card,
 				      PROTECTIVE_MBR_SIZE,
 				      BLOCK_SIZE, (unsigned int *)data);
-	if (ret)
+	if (ret){
 		dprintf(CRITICAL, "GPT: Could not read primary gpt from mmc\n");
+	}
 
 	ret = partition_parse_gpt_header(data, &first_usable_lba,
 					 &partition_entry_size, &header_size,
@@ -224,8 +226,12 @@
 		dprintf(INFO, "GPT: (WARNING) Primary signature invalid\n");
 
 		/* Check the backup gpt */
-		backup_header_lba =
-		    GET_LLWORD_FROM_BYTE(&data[BACKUP_HEADER_OFFSET]);
+
+		/* Get size of MMC */
+		card_size_sec = (mmc_card->capacity) / BLOCK_SIZE;
+		ASSERT (card_size_sec > 0);
+
+		backup_header_lba = card_size_sec - 1;
 		ret =
 		    mmc_boot_read_from_card(mmc_host, mmc_card,
 					    (backup_header_lba * BLOCK_SIZE),
@@ -246,9 +252,8 @@
 				"GPT: Primary and backup signatures invalid\n");
 			return ret;
 		}
-		partition_0 = backup_header_lba - (max_partition_count / 4);
 	}
-
+	partition_0 = GET_LLWORD_FROM_BYTE(&data[PARTITION_ENTRIES_OFFSET]);
 	/* Read GPT Entries */
 	for (i = 0; i < (max_partition_count / 4); i++) {
 		ASSERT(partition_count < NUM_PARTITIONS);