diff options
| author | Stephen Warren <swarren@nvidia.com> | 2012-10-17 06:44:59 +0000 | 
|---|---|---|
| committer | Tom Rini <trini@ti.com> | 2012-10-25 12:07:47 -0700 | 
| commit | 5e8f98319d8582d6a066610b5f1ec9b1a3f79704 (patch) | |
| tree | 625c16325a8685444c3fddc6959c526ea62bcd63 | |
| parent | a1687b858e5670683199f6923b32aec0ea82ba19 (diff) | |
| download | olio-uboot-2014.01-5e8f98319d8582d6a066610b5f1ec9b1a3f79704.tar.xz olio-uboot-2014.01-5e8f98319d8582d6a066610b5f1ec9b1a3f79704.zip | |
FAT: implement fat_set_blk_dev(), convert cmd_fat.c
This makes the FAT filesystem API more consistent with other block-based
filesystems. If in the future standard multi-filesystem commands such as
"ls" or "load" are implemented, having FAT work the same way as other
filesystems will be necessary.
Convert cmd_fat.c to the new API, so the code looks more like other files
implementing the same commands for other filesystems.
Signed-off-by: Stephen Warren <swarren@nvidia.com>
Reviewed-by: Benoît Thébaudeau <benoit.thebaudeau@advansee.com>
| -rw-r--r-- | common/cmd_fat.c | 8 | ||||
| -rw-r--r-- | fs/fat/fat.c | 66 | ||||
| -rw-r--r-- | include/fat.h | 1 | 
3 files changed, 36 insertions, 39 deletions
| diff --git a/common/cmd_fat.c b/common/cmd_fat.c index 5a5698b05..c38302d44 100644 --- a/common/cmd_fat.c +++ b/common/cmd_fat.c @@ -55,7 +55,7 @@ int do_fat_fsload (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  		return 1;  	dev = dev_desc->dev; -	if (fat_register_device(dev_desc,part)!=0) { +	if (fat_set_blk_dev(dev_desc, &info) != 0) {  		printf("\n** Unable to use %s %d:%d for fatload **\n",  			argv[1], dev, part);  		return 1; @@ -111,7 +111,7 @@ int do_fat_ls (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  		return 1;  	dev = dev_desc->dev; -	if (fat_register_device(dev_desc,part)!=0) { +	if (fat_set_blk_dev(dev_desc, &info) != 0) {  		printf("\n** Unable to use %s %d:%d for fatls **\n",  			argv[1], dev, part);  		return 1; @@ -149,7 +149,7 @@ int do_fat_fsinfo (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])  		return 1;  	dev = dev_desc->dev; -	if (fat_register_device(dev_desc,part)!=0) { +	if (fat_set_blk_dev(dev_desc, &info) != 0) {  		printf("\n** Unable to use %s %d:%d for fatinfo **\n",  			argv[1], dev, part);  		return 1; @@ -185,7 +185,7 @@ static int do_fat_fswrite(cmd_tbl_t *cmdtp, int flag,  	dev = dev_desc->dev; -	if (fat_register_device(dev_desc, part) != 0) { +	if (fat_set_blk_dev(dev_desc, &info) != 0) {  		printf("\n** Unable to use %s %d:%d for fatwrite **\n",  			argv[1], dev, part);  		return 1; diff --git a/fs/fat/fat.c b/fs/fat/fat.c index 31042e535..393c3781e 100644 --- a/fs/fat/fat.c +++ b/fs/fat/fat.c @@ -61,44 +61,12 @@ static int disk_read(__u32 block, __u32 nr_blocks, void *buf)  			cur_part_info.start + block, nr_blocks, buf);  } -int fat_register_device(block_dev_desc_t * dev_desc, int part_no) +int fat_set_blk_dev(block_dev_desc_t *dev_desc, disk_partition_t *info)  {  	ALLOC_CACHE_ALIGN_BUFFER(unsigned char, buffer, dev_desc->blksz); -	/* First close any currently found FAT filesystem */ -	cur_dev = NULL; - -#if (defined(CONFIG_CMD_IDE) || \ -     defined(CONFIG_CMD_SATA) || \ -     defined(CONFIG_CMD_SCSI) || \ -     defined(CONFIG_CMD_USB) || \ -     defined(CONFIG_MMC) || \ -     defined(CONFIG_SYSTEMACE) ) - -	/* Read the partition table, if present */ -	if (!get_partition_info(dev_desc, part_no, &cur_part_info)) -		cur_dev = dev_desc; -#endif - -	/* Otherwise it might be a superfloppy (whole-disk FAT filesystem) */ -	if (!cur_dev) { -		if (part_no != 0) { -			printf("** Partition %d not valid on device %d **\n", -					part_no, dev_desc->dev); -			return -1; -		} - -		cur_dev = dev_desc; -		cur_part_info.start = 0; -		cur_part_info.size = dev_desc->lba; -		cur_part_info.blksz = dev_desc->blksz; -		cur_part_info.name[0] = 0; -		cur_part_info.type[0] = 0; -		cur_part_info.bootable = 0; -#ifdef CONFIG_PARTITION_UUIDS -		cur_part_info.uuid[0] = 0; -#endif -	} +	cur_dev = dev_desc; +	cur_part_info = *info;  	/* Make sure it has a valid FAT header */  	if (disk_read(0, 1, buffer) != 1) { @@ -122,6 +90,34 @@ int fat_register_device(block_dev_desc_t * dev_desc, int part_no)  	return -1;  } +int fat_register_device(block_dev_desc_t *dev_desc, int part_no) +{ +	disk_partition_t info; + +	/* First close any currently found FAT filesystem */ +	cur_dev = NULL; + +	/* Read the partition table, if present */ +	if (get_partition_info(dev_desc, part_no, &info)) { +		if (part_no != 0) { +			printf("** Partition %d not valid on device %d **\n", +					part_no, dev_desc->dev); +			return -1; +		} + +		info.start = 0; +		info.size = dev_desc->lba; +		info.blksz = dev_desc->blksz; +		info.name[0] = 0; +		info.type[0] = 0; +		info.bootable = 0; +#ifdef CONFIG_PARTITION_UUIDS +		info.uuid[0] = 0; +#endif +	} + +	return fat_set_blk_dev(dev_desc, &info); +}  /*   * Get the first occurence of a directory delimiter ('/' or '\') in a string. diff --git a/include/fat.h b/include/fat.h index cc85b0639..706cd7a4b 100644 --- a/include/fat.h +++ b/include/fat.h @@ -212,6 +212,7 @@ long file_fat_read_at(const char *filename, unsigned long pos, void *buffer,  		      unsigned long maxsize);  long file_fat_read(const char *filename, void *buffer, unsigned long maxsize);  const char *file_getfsname(int idx); +int fat_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);  int fat_register_device(block_dev_desc_t *dev_desc, int part_no);  int file_fat_write(const char *filename, void *buffer, unsigned long maxsize); |