From e04350d2991ed628587e94b5b6d89c24f439e172 Mon Sep 17 00:00:00 2001 From: Steve Rae Date: Mon, 26 May 2014 11:52:23 -0700 Subject: disk: part_efi: clarify lbaint_t usage - update the comments regarding lbaint_t usage - cleanup casting of values related to the lbaint_t type - cleanup of a type that requires a u64 Tested on little endian ARMv7 and ARMv8 configurations Signed-off-by: Steve Rae --- disk/part_dos.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'disk/part_dos.c') diff --git a/disk/part_dos.c b/disk/part_dos.c index 05c3933c322..b0c3af57208 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -199,8 +199,9 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part (part_num == which_part) && (is_extended(pt->sys_ind) == 0)) { info->blksz = 512; - info->start = ext_part_sector + le32_to_int (pt->start4); - info->size = le32_to_int (pt->size4); + info->start = (lbaint_t)(ext_part_sector + + le32_to_int(pt->start4)); + info->size = (lbaint_t)le32_to_int(pt->size4); switch(dev_desc->if_type) { case IF_TYPE_IDE: case IF_TYPE_SATA: -- cgit v1.2.3 From 4a36be9bdb42157401618681c9ac28e3824c120e Mon Sep 17 00:00:00 2001 From: Darwin Dingel Date: Fri, 6 Jun 2014 15:48:26 +1200 Subject: disk: part_dos.c: Add a PBR check when MBR checking fails Bug: SDCard with a messed up partition but still has a FAT signature intact is readable in Linux but unreadable in uboot with 'fatls'. Fix: When partition info checking fails, there is no checking for a FAT signature (DOS_PBR) which will fail 'fatls'. FAT signature checking is done when no valid partition is found in partition table. If FAT signature is found, the disk will be read as PBR and continue processing. Signed-off-by: Darwin Dingel --- disk/part_dos.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'disk/part_dos.c') diff --git a/disk/part_dos.c b/disk/part_dos.c index b0c3af57208..cf1a36ebb82 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -21,6 +21,8 @@ #ifdef HAVE_BLOCK_DEVICE +#define DOS_PART_DEFAULT_SECTOR 512 + /* Convert char[4] in little endian format to the host format integer */ static inline int le32_to_int(unsigned char *le32) @@ -168,6 +170,7 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz); dos_partition_t *pt; int i; + int dos_type; if (dev_desc->block_read (dev_desc->dev, ext_part_sector, 1, (ulong *) buffer) != 1) { printf ("** Can't read partition table on %d:%d **\n", @@ -198,7 +201,7 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part (pt->sys_ind != 0) && (part_num == which_part) && (is_extended(pt->sys_ind) == 0)) { - info->blksz = 512; + info->blksz = DOS_PART_DEFAULT_SECTOR; info->start = (lbaint_t)(ext_part_sector + le32_to_int(pt->start4)); info->size = (lbaint_t)le32_to_int(pt->size4); @@ -253,6 +256,22 @@ static int get_partition_info_extended (block_dev_desc_t *dev_desc, int ext_part part_num, which_part, info, disksig); } } + + /* Check for DOS PBR if no partition is found */ + dos_type = test_block_type(buffer); + + if (dos_type == DOS_PBR) { + info->start = 0; + info->size = dev_desc->lba; + info->blksz = DOS_PART_DEFAULT_SECTOR; + info->bootable = 0; + sprintf ((char *)info->type, "U-Boot"); +#ifdef CONFIG_PARTITION_UUIDS + info->uuid[0] = 0; +#endif + return 0; + } + return -1; } -- cgit v1.2.3