]> git.sur5r.net Git - u-boot/commitdiff
usb: ums: code refactoring to improve reusability on other boards.
authorPrzemyslaw Marczak <p.marczak@samsung.com>
Wed, 23 Oct 2013 12:30:42 +0000 (14:30 +0200)
committerMarek Vasut <marex@denx.de>
Fri, 8 Nov 2013 19:46:19 +0000 (20:46 +0100)
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>
board/samsung/trats/trats.c
common/cmd_usb_mass_storage.c
drivers/usb/gadget/f_mass_storage.c
drivers/usb/gadget/storage_common.c
include/usb_mass_storage.h

index d31d511e399adbcbc0f30430a43191b09957871d..7d91d88879bb111fcc124278f88f256f17fe5bbe 100644 (file)
@@ -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
index f583cafa35abfe9828a3c8a861907e3b5707153a..f6ceba7e85aee0c90e9a26800f8ed7a63f29816f 100644 (file)
@@ -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"
 );
index 6ecdea3e14c22e3443f01ea4bcf7cd086711d7a1..be6b418d4e82fffe03e8041912e03100cb848335 100644 (file)
@@ -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;
 }
index 866e7c7b8a439986263f8a3a016407dfd1dbf2a2..c2c5424f515698721af7e1cb2507f40d33c438b2 100644 (file)
@@ -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;
index 13f535ce2e424d9be41744147098db404d6944cd..674ca70c59a09c03270e39dbae65f79d9638df77 100644 (file)
@@ -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