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>
This commit is contained in:
Przemyslaw Marczak 2013-10-23 14:30:42 +02:00 committed by Marek Vasut
parent 2cee0408e5
commit 93c813b3ac
5 changed files with 74 additions and 85 deletions

View File

@ -774,28 +774,27 @@ void init_panel_info(vidinfo_t *vid)
} }
#ifdef CONFIG_USB_GADGET_MASS_STORAGE #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) ulong start, lbaint_t blkcnt, void *buf)
{ {
if (ums_dev->mmc->block_dev.block_read(ums_dev->dev_num, block_dev_desc_t *block_dev = &ums_dev->mmc->block_dev;
start + ums_dev->offset, blkcnt, buf) != blkcnt) lbaint_t blkstart = start + ums_dev->offset;
return -1; 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) ulong start, lbaint_t blkcnt, const void *buf)
{ {
if (ums_dev->mmc->block_dev.block_write(ums_dev->dev_num, block_dev_desc_t *block_dev = &ums_dev->mmc->block_dev;
start + ums_dev->offset, blkcnt, buf) != blkcnt) lbaint_t blkstart = start + ums_dev->offset;
return -1; 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, static void ums_get_capacity(struct ums *ums_dev, long long int *capacity)
long long int *capacity)
{ {
long long int tmp_capacity; long long int tmp_capacity;
@ -804,33 +803,25 @@ static void ums_get_capacity(struct ums_device *ums_dev,
*capacity = ums_dev->mmc->capacity - tmp_capacity; *capacity = ums_dev->mmc->capacity - tmp_capacity;
} }
static struct ums_board_info ums_board = { static struct ums ums_dev = {
.read_sector = ums_read_sector, .read_sector = ums_read_sector,
.write_sector = ums_write_sector, .write_sector = ums_write_sector,
.get_capacity = ums_get_capacity, .get_capacity = ums_get_capacity,
.name = "TRATS UMS disk", .name = "UMS disk",
.ums_dev = { .offset = UMS_START_SECTOR,
.mmc = NULL, .part_size = UMS_NUM_SECTORS,
.dev_num = 0,
.offset = 0,
.part_size = 0.
},
}; };
struct ums_board_info *board_ums_init(unsigned int dev_num, unsigned int offset, struct ums *ums_init(unsigned int dev_num)
unsigned int part_size)
{ {
struct mmc *mmc; struct mmc *mmc = NULL;
mmc = find_mmc_device(dev_num); mmc = find_mmc_device(dev_num);
if (!mmc) if (!mmc)
return NULL; return NULL;
ums_board.ums_dev.mmc = mmc; 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;
return &ums_board; return &ums_dev;
} }
#endif #endif

View 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, unsigned int dev_num = (unsigned int)(simple_strtoul(mmc_devstring,
NULL, 0)); NULL, 0));
if (dev_num) { if (dev_num)
error("Set eMMC device to 0! - e.g. ums 0"); return CMD_RET_USAGE;
goto fail;
}
unsigned int controller_index = (unsigned int)(simple_strtoul( unsigned int controller_index = (unsigned int)(simple_strtoul(
usb_controller, NULL, 0)); usb_controller, NULL, 0));
if (board_usb_init(controller_index, USB_INIT_DEVICE)) { if (board_usb_init(controller_index, USB_INIT_DEVICE)) {
error("Couldn't init USB controller."); 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); struct ums *ums = ums_init(dev_num);
if (!ums_info) { if (!ums) {
error("MMC: %d -> NOT available", dev_num); printf("MMC: %u no such device\n", dev_num);
goto fail; return CMD_RET_FAILURE;
} }
int rc = fsg_init(ums_info); int rc = fsg_init(ums);
if (rc) { if (rc) {
error("fsg_init failed"); error("fsg_init failed");
goto fail; return CMD_RET_FAILURE;
} }
g_dnl_register("ums"); g_dnl_register("ums");
@ -62,13 +60,10 @@ int do_usb_mass_storage(cmd_tbl_t *cmdtp, int flag,
} }
exit: exit:
g_dnl_unregister(); g_dnl_unregister();
return 0; return CMD_RET_SUCCESS;
fail:
return -1;
} }
U_BOOT_CMD(ums, CONFIG_SYS_MAXARGS, 1, do_usb_mass_storage, U_BOOT_CMD(ums, CONFIG_SYS_MAXARGS, 1, do_usb_mass_storage,
"Use the UMS [User Mass Storage]", "Use the UMS [User Mass Storage]",
"<USB_controller> <mmc_dev>" "ums <USB_controller> <mmc_dev> e.g. ums 0 0"
); );

View 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; struct fsg_common *the_fsg_common;
static int fsg_set_halt(struct fsg_dev *fsg, struct usb_ep *ep) 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 */ /* Perform the read */
nread = 0; rc = ums->read_sector(ums,
rc = ums_info->read_sector(&(ums_info->ums_dev),
file_offset / SECTOR_SIZE, file_offset / SECTOR_SIZE,
amount / SECTOR_SIZE, amount / SECTOR_SIZE,
(char __user *)bh->buf); (char __user *)bh->buf);
if (rc) if (!rc)
return -EIO; return -EIO;
nread = amount;
nread = rc * SECTOR_SIZE;
VLDBG(curlun, "file read %u @ %llu -> %d\n", amount, VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
(unsigned long long) file_offset, (unsigned long long) file_offset,
@ -931,13 +931,13 @@ static int do_write(struct fsg_common *common)
amount = bh->outreq->actual; amount = bh->outreq->actual;
/* Perform the write */ /* Perform the write */
rc = ums_info->write_sector(&(ums_info->ums_dev), rc = ums->write_sector(ums,
file_offset / SECTOR_SIZE, file_offset / SECTOR_SIZE,
amount / SECTOR_SIZE, amount / SECTOR_SIZE,
(char __user *)bh->buf); (char __user *)bh->buf);
if (rc) if (!rc)
return -EIO; return -EIO;
nwritten = amount; nwritten = rc * SECTOR_SIZE;
VLDBG(curlun, "file write %u @ %llu -> %d\n", amount, VLDBG(curlun, "file write %u @ %llu -> %d\n", amount,
(unsigned long long) file_offset, (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 an error occurred, report it and its position */
if (nwritten < amount) { if (nwritten < amount) {
printf("nwritten:%d amount:%d\n", nwritten,
amount);
curlun->sense_data = SS_WRITE_ERROR; curlun->sense_data = SS_WRITE_ERROR;
curlun->info_valid = 1; curlun->info_valid = 1;
break; break;
@ -1045,14 +1047,13 @@ static int do_verify(struct fsg_common *common)
} }
/* Perform the read */ /* Perform the read */
nread = 0; rc = ums->read_sector(ums,
rc = ums_info->read_sector(&(ums_info->ums_dev),
file_offset / SECTOR_SIZE, file_offset / SECTOR_SIZE,
amount / SECTOR_SIZE, amount / SECTOR_SIZE,
(char __user *)bh->buf); (char __user *)bh->buf);
if (rc) if (!rc)
return -EIO; return -EIO;
nread = amount; nread = rc * SECTOR_SIZE;
VLDBG(curlun, "file read %u @ %llu -> %d\n", amount, VLDBG(curlun, "file read %u @ %llu -> %d\n", amount,
(unsigned long long) file_offset, (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 */ buf[4] = 31; /* Additional length */
/* No special options */ /* No special options */
sprintf((char *) (buf + 8), "%-8s%-16s%04x", (char*) vendor_id , sprintf((char *) (buf + 8), "%-8s%-16s%04x", (char*) vendor_id ,
ums_info->name, (u16) 0xffff); ums->name, (u16) 0xffff);
return 36; return 36;
} }
@ -2753,9 +2754,9 @@ int fsg_add(struct usb_configuration *c)
return fsg_bind_config(c->cdev, c, fsg_common); 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; return 0;
} }

View File

@ -275,7 +275,6 @@ struct rw_semaphore { int i; };
#define ETOOSMALL 525 #define ETOOSMALL 525
#include <usb_mass_storage.h> #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 */ /* R/W if we can, R/O if we must */
ro = curlun->initially_ro; ro = curlun->initially_ro;
ums_info->get_capacity(&(ums_info->ums_dev), &size); ums->get_capacity(ums, &size);
if (size < 0) { if (size < 0) {
printf("unable to find file size: %s\n", filename); printf("unable to find file size: %s\n", filename);
rc = (int) size; rc = (int) size;

View File

@ -9,32 +9,35 @@
#define __USB_MASS_STORAGE_H__ #define __USB_MASS_STORAGE_H__
#define SECTOR_SIZE 0x200 #define SECTOR_SIZE 0x200
#include <mmc.h> #include <mmc.h>
#include <linux/usb/composite.h> #include <linux/usb/composite.h>
struct ums_device { #ifndef UMS_START_SECTOR
#define UMS_START_SECTOR 0
#endif
#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 *ums_dev,
ulong start, lbaint_t blkcnt, const void *buf);
void (*get_capacity)(struct ums *ums_dev,
long long int *capacity);
const char *name;
struct mmc *mmc; struct mmc *mmc;
int dev_num;
int offset; int offset;
int part_size; int part_size;
}; };
struct ums_board_info { extern struct ums *ums;
int (*read_sector)(struct ums_device *ums_dev,
ulong start, lbaint_t blkcnt, void *buf);
int (*write_sector)(struct ums_device *ums_dev,
ulong start, lbaint_t blkcnt, const void *buf);
void (*get_capacity)(struct ums_device *ums_dev,
long long int *capacity);
const char *name;
struct ums_device ums_dev;
};
int fsg_init(struct ums_board_info *); int fsg_init(struct ums *);
void fsg_cleanup(void); void fsg_cleanup(void);
struct ums_board_info *board_ums_init(unsigned int, unsigned int, struct ums *ums_init(unsigned int);
unsigned int);
int fsg_main_thread(void *); int fsg_main_thread(void *);
#ifdef CONFIG_USB_GADGET_MASS_STORAGE #ifdef CONFIG_USB_GADGET_MASS_STORAGE