From 66c2d73cfc901aa35e0331b2fd710b250151f966 Mon Sep 17 00:00:00 2001 From: Wolfgang Denk Date: Mon, 19 Jul 2010 11:36:57 +0200 Subject: FAT32: fix support for superfloppy-format (PBR) "Superfloppy" format (in U-Boot called PBR) did not work for FAT32 as the file system type string is at a different location. Add support for FAT32. Signed-off-by: Wolfgang Denk --- disk/part_dos.c | 4 +++- disk/part_dos.h | 3 ++- fs/fat/fat.c | 7 +++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/disk/part_dos.c b/disk/part_dos.c index 887b75ec8..2de1bb83b 100644 --- a/disk/part_dos.c +++ b/disk/part_dos.c @@ -77,8 +77,10 @@ static int test_block_type(unsigned char *buffer) (buffer[DOS_PART_MAGIC_OFFSET + 1] != 0xaa) ) { return (-1); } /* no DOS Signature at all */ - if(strncmp((char *)&buffer[DOS_PBR_FSTYPE_OFFSET],"FAT",3)==0) + if (strncmp((char *)&buffer[DOS_PBR_FSTYPE_OFFSET],"FAT",3)==0 || + strncmp((char *)&buffer[DOS_PBR32_FSTYPE_OFFSET],"FAT32",5)==0) { return DOS_PBR; /* is PBR */ + } return DOS_MBR; /* Is MBR */ } diff --git a/disk/part_dos.h b/disk/part_dos.h index ac93f20b3..195a32cb3 100644 --- a/disk/part_dos.h +++ b/disk/part_dos.h @@ -28,13 +28,14 @@ #ifdef CONFIG_ISO_PARTITION /* Make the buffers bigger if ISO partition support is enabled -- CD-ROMS have 2048 byte blocks */ -#define DEFAULT_SECTOR_SIZE 2048 +#define DEFAULT_SECTOR_SIZE 2048 #else #define DEFAULT_SECTOR_SIZE 512 #endif #define DOS_PART_TBL_OFFSET 0x1be #define DOS_PART_MAGIC_OFFSET 0x1fe #define DOS_PBR_FSTYPE_OFFSET 0x36 +#define DOS_PBR32_FSTYPE_OFFSET 0x52 #define DOS_PBR_MEDIA_TYPE_OFFSET 0x15 #define DOS_MBR 0 #define DOS_PBR 1 diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 6b3a2742e..5b9ec2a4a 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -50,6 +50,7 @@ static int cur_part = 1; #define DOS_PART_TBL_OFFSET 0x1be #define DOS_PART_MAGIC_OFFSET 0x1fe #define DOS_FS_TYPE_OFFSET 0x36 +#define DOS_FS32_TYPE_OFFSET 0x52 int disk_read (__u32 startblock, __u32 getsize, __u8 * bufptr) { @@ -94,7 +95,8 @@ fat_register_device(block_dev_desc_t *dev_desc, int part_no) if (!get_partition_info (dev_desc, part_no, &info)) { part_offset = info.start; cur_part = part_no; - } else if (!strncmp((char *)&buffer[DOS_FS_TYPE_OFFSET], "FAT", 3)) { + } else if (strncmp((char *)&buffer[DOS_FS_TYPE_OFFSET], "FAT", 3)==0 || + strncmp((char *)&buffer[DOS_FS32_TYPE_OFFSET],"FAT32",5)==0) { /* ok, we assume we are on a PBR only */ cur_part = 1; part_offset = 0; @@ -105,7 +107,8 @@ fat_register_device(block_dev_desc_t *dev_desc, int part_no) } #else - if (!strncmp((char *)&buffer[DOS_FS_TYPE_OFFSET],"FAT",3)) { + if ((strncmp((char *)&buffer[DOS_FS_TYPE_OFFSET], "FAT", 3) == 0) || + (strncmp((char *)&buffer[DOS_FS32_TYPE_OFFSET], "FAT32", 5) == 0)) { /* ok, we assume we are on a PBR only */ cur_part = 1; part_offset = 0; -- cgit v1.2.3