[U-Boot] [PATCH 2/4] usb: ums: code refactoring to improve reusability at other boards.

Przemyslaw Marczak p.marczak at samsung.com
Wed Oct 16 15:21:12 CEST 2013


This patch introduces some cleanups to ums code. Changes:

ums common:
- introduce UMS_START_BLOCK and UMS_PART_SIZE as defined in usb_mass_storage.h
  both default values as 0 if board config do not 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

Signed-off-by: Przemyslaw Marczak <p.marczak at samsung.com>
Cc: Marek Vasut <marek.vasut at gmail.com>
---
 board/samsung/common/ums.c          |   37 ++++++++++++++++++-----------------
 common/cmd_usb_mass_storage.c       |   27 +++++++++++--------------
 drivers/usb/gadget/f_mass_storage.c |   26 ++++++++++++------------
 drivers/usb/gadget/storage_common.c |    3 +--
 include/usb_mass_storage.h          |   33 +++++++++++++++++--------------
 5 files changed, 62 insertions(+), 64 deletions(-)

diff --git a/board/samsung/common/ums.c b/board/samsung/common/ums.c
index 506f4b5..1f28590 100644
--- a/board/samsung/common/ums.c
+++ b/board/samsung/common/ums.c
@@ -9,30 +9,33 @@
 #include <usb_mass_storage.h>
 #include <part.h>
 
-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)
+	int dev_num = ums_dev->mmc->block_dev.dev;
+
+	if (ums_dev->mmc->block_dev.block_read(dev_num,
+					       start + ums_dev->offset,
+					       blkcnt, buf) != blkcnt)
 		return -1;
 
 	return 0;
 }
 
-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)
+	int dev_num = ums_dev->mmc->block_dev.dev;
+
+	if (ums_dev->mmc->block_dev.block_write(dev_num,
+						start + ums_dev->offset,
+						blkcnt, buf) != blkcnt)
 		return -1;
 
 	return 0;
 }
 
-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;
 
@@ -41,15 +44,16 @@ static void ums_get_capacity(struct ums_device *ums_dev,
 	*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 = "UMS disk",
+	.offset = UMS_START_BLOCK,
+	.part_size = UMS_PART_SIZE,
 };
 
-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 = NULL;
 
@@ -57,10 +61,7 @@ struct ums_board_info *board_ums_init(unsigned int dev_num, unsigned int offset,
 	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;
 }
diff --git a/common/cmd_usb_mass_storage.c b/common/cmd_usb_mass_storage.c
index f583caf..f6ceba7 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 b34068a..9560deb 100644
--- a/drivers/usb/gadget/f_mass_storage.c
+++ b/drivers/usb/gadget/f_mass_storage.c
@@ -444,7 +444,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)
@@ -761,10 +761,10 @@ 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);
+		rc = ums->read_sector(ums,
+				      file_offset / SECTOR_SIZE,
+				      amount / SECTOR_SIZE,
+				      (char __user *)bh->buf);
 		if (rc)
 			return -EIO;
 		nread = amount;
@@ -934,7 +934,7 @@ 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);
@@ -1049,10 +1049,10 @@ 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);
+		rc = ums->read_sector(ums,
+				      file_offset / SECTOR_SIZE,
+				      amount / SECTOR_SIZE,
+				      (char __user *)bh->buf);
 		if (rc)
 			return -EIO;
 		nread = amount;
@@ -1103,7 +1103,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;
 }
@@ -2758,9 +2758,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 866e7c7..c2c5424 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 13f535c..292e471 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_BLOCK
+#define UMS_START_BLOCK		0
+#endif
 
-struct ums_board_info {
-	int (*read_sector)(struct ums_device *ums_dev,
+#ifndef UMS_PART_SIZE
+#define UMS_PART_SIZE		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
-- 
1.7.9.5



More information about the U-Boot mailing list