diff options
| author | Przemyslaw Marczak <p.marczak@samsung.com> | 2013-10-23 14:30:42 +0200 | 
|---|---|---|
| committer | Marek Vasut <marex@denx.de> | 2013-11-08 20:46:19 +0100 | 
| commit | 93c813b3ac4b23df891992f93252c59231dec388 (patch) | |
| tree | 09845f95edb591abcf64f35ffcb57019e6cf25e1 | |
| parent | 2cee0408e5c6f5dbdfa89fb40168ba2ead3f61a6 (diff) | |
| download | olio-uboot-2014.01-93c813b3ac4b23df891992f93252c59231dec388.tar.xz olio-uboot-2014.01-93c813b3ac4b23df891992f93252c59231dec388.zip | |
usb: ums: code refactoring to improve reusability on other boards.
This patch introduces some cleanups to ums code. Changes:
ums common:
- introduce UMS_START_SECTOR and UMS_NUM_SECTORS as defined in
  usb_mass_storage.h both default values as 0 if board config
  doesn't define them
common cleanup changes:
- change name of struct "ums_board_info" to "ums"
- "ums_device" fields are moved to struct ums and "dev_num" is removed
- change function name: board_ums_init to ums_init
- remove "extern" prefixes from usb_mass_storage.h
cmd_usb_mass_storage:
- change error() to printf() if need to print info message
- change return values to command_ret_t type at ums command code
- add command usage string
Changes v2:
ums common:
- always returns number of read/write sectors
- coding style clean-up
ums gadget:
- calculate amount of read/write from device returned value.
Signed-off-by: Przemyslaw Marczak <p.marczak@samsung.com>
Cc: Marek Vasut <marek.vasut@gmail.com>
| -rw-r--r-- | board/samsung/trats/trats.c | 51 | ||||
| -rw-r--r-- | common/cmd_usb_mass_storage.c | 27 | ||||
| -rw-r--r-- | drivers/usb/gadget/f_mass_storage.c | 43 | ||||
| -rw-r--r-- | drivers/usb/gadget/storage_common.c | 3 | ||||
| -rw-r--r-- | include/usb_mass_storage.h | 33 | 
5 files changed, 73 insertions, 84 deletions
| diff --git a/board/samsung/trats/trats.c b/board/samsung/trats/trats.c index d31d511e3..7d91d8887 100644 --- a/board/samsung/trats/trats.c +++ b/board/samsung/trats/trats.c @@ -774,63 +774,54 @@ void init_panel_info(vidinfo_t *vid)  }  #ifdef CONFIG_USB_GADGET_MASS_STORAGE -static int ums_read_sector(struct ums_device *ums_dev, +static int ums_read_sector(struct ums *ums_dev,  			   ulong start, lbaint_t blkcnt, void *buf)  { -	if (ums_dev->mmc->block_dev.block_read(ums_dev->dev_num, -			start + ums_dev->offset, blkcnt, buf) != blkcnt) -		return -1; +	block_dev_desc_t *block_dev = &ums_dev->mmc->block_dev; +	lbaint_t blkstart = start + ums_dev->offset; +	int dev_num = block_dev->dev; -	return 0; +	return block_dev->block_read(dev_num, blkstart, blkcnt, buf);  } -static int ums_write_sector(struct ums_device *ums_dev, +static int ums_write_sector(struct ums *ums_dev,  			    ulong start, lbaint_t blkcnt, const void *buf)  { -	if (ums_dev->mmc->block_dev.block_write(ums_dev->dev_num, -			start + ums_dev->offset, blkcnt, buf) != blkcnt) -		return -1; +	block_dev_desc_t *block_dev = &ums_dev->mmc->block_dev; +	lbaint_t blkstart = start + ums_dev->offset; +	int dev_num = block_dev->dev; -	return 0; +	return block_dev->block_write(dev_num, blkstart, blkcnt, buf);  } -static void ums_get_capacity(struct ums_device *ums_dev, -			     long long int *capacity) +static void ums_get_capacity(struct ums *ums_dev, long long int *capacity)  {  	long long int tmp_capacity; -	tmp_capacity = (long long int) ((ums_dev->offset + ums_dev->part_size) -					* SECTOR_SIZE); +	tmp_capacity = (long long int)((ums_dev->offset + ums_dev->part_size) +				       * SECTOR_SIZE);  	*capacity = ums_dev->mmc->capacity - tmp_capacity;  } -static struct ums_board_info ums_board = { +static struct ums ums_dev = {  	.read_sector = ums_read_sector,  	.write_sector = ums_write_sector,  	.get_capacity = ums_get_capacity, -	.name = "TRATS UMS disk", -	.ums_dev = { -		.mmc = NULL, -		.dev_num = 0, -		.offset = 0, -		.part_size = 0. -	}, +	.name = "UMS disk", +	.offset = UMS_START_SECTOR, +	.part_size = UMS_NUM_SECTORS,  }; -struct ums_board_info *board_ums_init(unsigned int dev_num, unsigned int offset, -				      unsigned int part_size) +struct ums *ums_init(unsigned int dev_num)  { -	struct mmc *mmc; +	struct mmc *mmc = NULL;  	mmc = find_mmc_device(dev_num);  	if (!mmc)  		return NULL; -	ums_board.ums_dev.mmc = mmc; -	ums_board.ums_dev.dev_num = dev_num; -	ums_board.ums_dev.offset = offset; -	ums_board.ums_dev.part_size = part_size; +	ums_dev.mmc = mmc; -	return &ums_board; +	return &ums_dev;  }  #endif diff --git a/common/cmd_usb_mass_storage.c b/common/cmd_usb_mass_storage.c index f583cafa3..f6ceba7e8 100644 --- a/common/cmd_usb_mass_storage.c +++ b/common/cmd_usb_mass_storage.c @@ -22,28 +22,26 @@ int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,  	unsigned int dev_num = (unsigned int)(simple_strtoul(mmc_devstring,  				NULL, 0)); -	if (dev_num) { -		error("Set eMMC device to 0! - e.g. ums 0"); -		goto fail; -	} +	if (dev_num) +		return CMD_RET_USAGE;  	unsigned int controller_index = (unsigned int)(simple_strtoul(  					usb_controller,	NULL, 0));  	if (board_usb_init(controller_index, USB_INIT_DEVICE)) {  		error("Couldn't init USB controller."); -		goto fail; +		return CMD_RET_FAILURE;  	} -	struct ums_board_info *ums_info = board_ums_init(dev_num, 0, 0); -	if (!ums_info) { -		error("MMC: %d -> NOT available", dev_num); -		goto fail; +	struct ums *ums = ums_init(dev_num); +	if (!ums) { +		printf("MMC: %u no such device\n", dev_num); +		return CMD_RET_FAILURE;  	} -	int rc = fsg_init(ums_info); +	int rc = fsg_init(ums);  	if (rc) {  		error("fsg_init failed"); -		goto fail; +		return CMD_RET_FAILURE;  	}  	g_dnl_register("ums"); @@ -62,13 +60,10 @@ int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,  	}  exit:  	g_dnl_unregister(); -	return 0; - -fail: -	return -1; +	return CMD_RET_SUCCESS;  }  U_BOOT_CMD(ums, CONFIG_SYS_MAXARGS, 1, do_usb_mass_storage,  	"Use the UMS [User Mass Storage]", -	"<USB_controller> <mmc_dev>" +	"ums <USB_controller> <mmc_dev>  e.g. ums 0 0"  ); diff --git a/drivers/usb/gadget/f_mass_storage.c b/drivers/usb/gadget/f_mass_storage.c index 6ecdea3e1..be6b418d4 100644 --- a/drivers/usb/gadget/f_mass_storage.c +++ b/drivers/usb/gadget/f_mass_storage.c @@ -441,7 +441,7 @@ static void set_bulk_out_req_length(struct fsg_common *common,  /*-------------------------------------------------------------------------*/ -struct ums_board_info			*ums_info; +struct ums *ums;  struct fsg_common *the_fsg_common;  static int fsg_set_halt(struct fsg_dev *fsg, struct usb_ep *ep) @@ -757,14 +757,14 @@ static int do_read(struct fsg_common *common)  		}  		/* Perform the read */ -		nread = 0; -		rc = ums_info->read_sector(&(ums_info->ums_dev), -					   file_offset / SECTOR_SIZE, -					   amount / SECTOR_SIZE, -					   (char __user *)bh->buf); -		if (rc) +		rc = ums->read_sector(ums, +				      file_offset / SECTOR_SIZE, +				      amount / SECTOR_SIZE, +				      (char __user *)bh->buf); +		if (!rc)  			return -EIO; -		nread = amount; + +		nread = rc * SECTOR_SIZE;  		VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,  				(unsigned long long) file_offset, @@ -931,13 +931,13 @@ static int do_write(struct fsg_common *common)  			amount = bh->outreq->actual;  			/* Perform the write */ -			rc = ums_info->write_sector(&(ums_info->ums_dev), +			rc = ums->write_sector(ums,  					       file_offset / SECTOR_SIZE,  					       amount / SECTOR_SIZE,  					       (char __user *)bh->buf); -			if (rc) +			if (!rc)  				return -EIO; -			nwritten = amount; +			nwritten = rc * SECTOR_SIZE;  			VLDBG(curlun, "file write %u @ %llu -> %d\n", amount,  					(unsigned long long) file_offset, @@ -959,6 +959,8 @@ static int do_write(struct fsg_common *common)  			/* If an error occurred, report it and its position */  			if (nwritten < amount) { +				printf("nwritten:%d amount:%d\n", nwritten, +				       amount);  				curlun->sense_data = SS_WRITE_ERROR;  				curlun->info_valid = 1;  				break; @@ -1045,14 +1047,13 @@ static int do_verify(struct fsg_common *common)  		}  		/* Perform the read */ -		nread = 0; -		rc = ums_info->read_sector(&(ums_info->ums_dev), -					   file_offset / SECTOR_SIZE, -					   amount / SECTOR_SIZE, -					   (char __user *)bh->buf); -		if (rc) +		rc = ums->read_sector(ums, +				      file_offset / SECTOR_SIZE, +				      amount / SECTOR_SIZE, +				      (char __user *)bh->buf); +		if (!rc)  			return -EIO; -		nread = amount; +		nread = rc * SECTOR_SIZE;  		VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,  				(unsigned long long) file_offset, @@ -1100,7 +1101,7 @@ static int do_inquiry(struct fsg_common *common, struct fsg_buffhd *bh)  	buf[4] = 31;		/* Additional length */  				/* No special options */  	sprintf((char *) (buf + 8), "%-8s%-16s%04x", (char*) vendor_id , -			ums_info->name, (u16) 0xffff); +			ums->name, (u16) 0xffff);  	return 36;  } @@ -2753,9 +2754,9 @@ int fsg_add(struct usb_configuration *c)  	return fsg_bind_config(c->cdev, c, fsg_common);  } -int fsg_init(struct ums_board_info *ums) +int fsg_init(struct ums *ums_dev)  { -	ums_info = ums; +	ums = ums_dev;  	return 0;  } diff --git a/drivers/usb/gadget/storage_common.c b/drivers/usb/gadget/storage_common.c index 866e7c7b8..c2c5424f5 100644 --- a/drivers/usb/gadget/storage_common.c +++ b/drivers/usb/gadget/storage_common.c @@ -275,7 +275,6 @@ struct rw_semaphore { int i; };  #define ETOOSMALL	525  #include <usb_mass_storage.h> -extern struct ums_board_info		*ums_info;  /*-------------------------------------------------------------------------*/ @@ -581,7 +580,7 @@ static int fsg_lun_open(struct fsg_lun *curlun, const char *filename)  	/* R/W if we can, R/O if we must */  	ro = curlun->initially_ro; -	ums_info->get_capacity(&(ums_info->ums_dev), &size); +	ums->get_capacity(ums, &size);  	if (size < 0) {  		printf("unable to find file size: %s\n", filename);  		rc = (int) size; diff --git a/include/usb_mass_storage.h b/include/usb_mass_storage.h index 13f535ce2..674ca70c5 100644 --- a/include/usb_mass_storage.h +++ b/include/usb_mass_storage.h @@ -9,32 +9,35 @@  #define __USB_MASS_STORAGE_H__  #define SECTOR_SIZE		0x200 -  #include <mmc.h>  #include <linux/usb/composite.h> -struct ums_device { -	struct mmc *mmc; -	int dev_num; -	int offset; -	int part_size; -}; +#ifndef UMS_START_SECTOR +#define UMS_START_SECTOR	0 +#endif -struct ums_board_info { -	int (*read_sector)(struct ums_device *ums_dev, +#ifndef UMS_NUM_SECTORS +#define UMS_NUM_SECTORS		0 +#endif + +struct ums { +	int (*read_sector)(struct ums *ums_dev,  			   ulong start, lbaint_t blkcnt, void *buf); -	int (*write_sector)(struct ums_device *ums_dev, +	int (*write_sector)(struct ums *ums_dev,  			    ulong start, lbaint_t blkcnt, const void *buf); -	void (*get_capacity)(struct ums_device *ums_dev, +	void (*get_capacity)(struct ums *ums_dev,  			     long long int *capacity);  	const char *name; -	struct ums_device ums_dev; +	struct mmc *mmc; +	int offset; +	int part_size;  }; -int fsg_init(struct ums_board_info *); +extern struct ums *ums; + +int fsg_init(struct ums *);  void fsg_cleanup(void); -struct ums_board_info *board_ums_init(unsigned int, unsigned int, -				      unsigned int); +struct ums *ums_init(unsigned int);  int fsg_main_thread(void *);  #ifdef CONFIG_USB_GADGET_MASS_STORAGE |