Commit 93c813b3ac4b23df891992f93252c59231dec388
Committed by
Marek Vasut
1 parent
2cee0408e5
Exists in
master
and in
50 other branches
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>
Showing 5 changed files with 73 additions and 84 deletions Side-by-side Diff
board/samsung/trats/trats.c
... | ... | @@ -774,64 +774,55 @@ |
774 | 774 | } |
775 | 775 | |
776 | 776 | #ifdef CONFIG_USB_GADGET_MASS_STORAGE |
777 | -static int ums_read_sector(struct ums_device *ums_dev, | |
777 | +static int ums_read_sector(struct ums *ums_dev, | |
778 | 778 | ulong start, lbaint_t blkcnt, void *buf) |
779 | 779 | { |
780 | - if (ums_dev->mmc->block_dev.block_read(ums_dev->dev_num, | |
781 | - start + ums_dev->offset, blkcnt, buf) != blkcnt) | |
782 | - return -1; | |
780 | + block_dev_desc_t *block_dev = &ums_dev->mmc->block_dev; | |
781 | + lbaint_t blkstart = start + ums_dev->offset; | |
782 | + int dev_num = block_dev->dev; | |
783 | 783 | |
784 | - return 0; | |
784 | + return block_dev->block_read(dev_num, blkstart, blkcnt, buf); | |
785 | 785 | } |
786 | 786 | |
787 | -static int ums_write_sector(struct ums_device *ums_dev, | |
787 | +static int ums_write_sector(struct ums *ums_dev, | |
788 | 788 | ulong start, lbaint_t blkcnt, const void *buf) |
789 | 789 | { |
790 | - if (ums_dev->mmc->block_dev.block_write(ums_dev->dev_num, | |
791 | - start + ums_dev->offset, blkcnt, buf) != blkcnt) | |
792 | - return -1; | |
790 | + block_dev_desc_t *block_dev = &ums_dev->mmc->block_dev; | |
791 | + lbaint_t blkstart = start + ums_dev->offset; | |
792 | + int dev_num = block_dev->dev; | |
793 | 793 | |
794 | - return 0; | |
794 | + return block_dev->block_write(dev_num, blkstart, blkcnt, buf); | |
795 | 795 | } |
796 | 796 | |
797 | -static void ums_get_capacity(struct ums_device *ums_dev, | |
798 | - long long int *capacity) | |
797 | +static void ums_get_capacity(struct ums *ums_dev, long long int *capacity) | |
799 | 798 | { |
800 | 799 | long long int tmp_capacity; |
801 | 800 | |
802 | - tmp_capacity = (long long int) ((ums_dev->offset + ums_dev->part_size) | |
803 | - * SECTOR_SIZE); | |
801 | + tmp_capacity = (long long int)((ums_dev->offset + ums_dev->part_size) | |
802 | + * SECTOR_SIZE); | |
804 | 803 | *capacity = ums_dev->mmc->capacity - tmp_capacity; |
805 | 804 | } |
806 | 805 | |
807 | -static struct ums_board_info ums_board = { | |
806 | +static struct ums ums_dev = { | |
808 | 807 | .read_sector = ums_read_sector, |
809 | 808 | .write_sector = ums_write_sector, |
810 | 809 | .get_capacity = ums_get_capacity, |
811 | - .name = "TRATS UMS disk", | |
812 | - .ums_dev = { | |
813 | - .mmc = NULL, | |
814 | - .dev_num = 0, | |
815 | - .offset = 0, | |
816 | - .part_size = 0. | |
817 | - }, | |
810 | + .name = "UMS disk", | |
811 | + .offset = UMS_START_SECTOR, | |
812 | + .part_size = UMS_NUM_SECTORS, | |
818 | 813 | }; |
819 | 814 | |
820 | -struct ums_board_info *board_ums_init(unsigned int dev_num, unsigned int offset, | |
821 | - unsigned int part_size) | |
815 | +struct ums *ums_init(unsigned int dev_num) | |
822 | 816 | { |
823 | - struct mmc *mmc; | |
817 | + struct mmc *mmc = NULL; | |
824 | 818 | |
825 | 819 | mmc = find_mmc_device(dev_num); |
826 | 820 | if (!mmc) |
827 | 821 | return NULL; |
828 | 822 | |
829 | - ums_board.ums_dev.mmc = mmc; | |
830 | - ums_board.ums_dev.dev_num = dev_num; | |
831 | - ums_board.ums_dev.offset = offset; | |
832 | - ums_board.ums_dev.part_size = part_size; | |
823 | + ums_dev.mmc = mmc; | |
833 | 824 | |
834 | - return &ums_board; | |
825 | + return &ums_dev; | |
835 | 826 | } |
836 | 827 | #endif |
common/cmd_usb_mass_storage.c
... | ... | @@ -22,28 +22,26 @@ |
22 | 22 | |
23 | 23 | unsigned int dev_num = (unsigned int)(simple_strtoul(mmc_devstring, |
24 | 24 | NULL, 0)); |
25 | - if (dev_num) { | |
26 | - error("Set eMMC device to 0! - e.g. ums 0"); | |
27 | - goto fail; | |
28 | - } | |
25 | + if (dev_num) | |
26 | + return CMD_RET_USAGE; | |
29 | 27 | |
30 | 28 | unsigned int controller_index = (unsigned int)(simple_strtoul( |
31 | 29 | usb_controller, NULL, 0)); |
32 | 30 | if (board_usb_init(controller_index, USB_INIT_DEVICE)) { |
33 | 31 | error("Couldn't init USB controller."); |
34 | - goto fail; | |
32 | + return CMD_RET_FAILURE; | |
35 | 33 | } |
36 | 34 | |
37 | - struct ums_board_info *ums_info = board_ums_init(dev_num, 0, 0); | |
38 | - if (!ums_info) { | |
39 | - error("MMC: %d -> NOT available", dev_num); | |
40 | - goto fail; | |
35 | + struct ums *ums = ums_init(dev_num); | |
36 | + if (!ums) { | |
37 | + printf("MMC: %u no such device\n", dev_num); | |
38 | + return CMD_RET_FAILURE; | |
41 | 39 | } |
42 | 40 | |
43 | - int rc = fsg_init(ums_info); | |
41 | + int rc = fsg_init(ums); | |
44 | 42 | if (rc) { |
45 | 43 | error("fsg_init failed"); |
46 | - goto fail; | |
44 | + return CMD_RET_FAILURE; | |
47 | 45 | } |
48 | 46 | |
49 | 47 | g_dnl_register("ums"); |
50 | 48 | |
... | ... | @@ -62,14 +60,11 @@ |
62 | 60 | } |
63 | 61 | exit: |
64 | 62 | g_dnl_unregister(); |
65 | - return 0; | |
66 | - | |
67 | -fail: | |
68 | - return -1; | |
63 | + return CMD_RET_SUCCESS; | |
69 | 64 | } |
70 | 65 | |
71 | 66 | U_BOOT_CMD(ums, CONFIG_SYS_MAXARGS, 1, do_usb_mass_storage, |
72 | 67 | "Use the UMS [User Mass Storage]", |
73 | - "<USB_controller> <mmc_dev>" | |
68 | + "ums <USB_controller> <mmc_dev> e.g. ums 0 0" | |
74 | 69 | ); |
drivers/usb/gadget/f_mass_storage.c
... | ... | @@ -441,7 +441,7 @@ |
441 | 441 | |
442 | 442 | /*-------------------------------------------------------------------------*/ |
443 | 443 | |
444 | -struct ums_board_info *ums_info; | |
444 | +struct ums *ums; | |
445 | 445 | struct fsg_common *the_fsg_common; |
446 | 446 | |
447 | 447 | static int fsg_set_halt(struct fsg_dev *fsg, struct usb_ep *ep) |
448 | 448 | |
449 | 449 | |
... | ... | @@ -757,15 +757,15 @@ |
757 | 757 | } |
758 | 758 | |
759 | 759 | /* Perform the read */ |
760 | - nread = 0; | |
761 | - rc = ums_info->read_sector(&(ums_info->ums_dev), | |
762 | - file_offset / SECTOR_SIZE, | |
763 | - amount / SECTOR_SIZE, | |
764 | - (char __user *)bh->buf); | |
765 | - if (rc) | |
760 | + rc = ums->read_sector(ums, | |
761 | + file_offset / SECTOR_SIZE, | |
762 | + amount / SECTOR_SIZE, | |
763 | + (char __user *)bh->buf); | |
764 | + if (!rc) | |
766 | 765 | return -EIO; |
767 | - nread = amount; | |
768 | 766 | |
767 | + nread = rc * SECTOR_SIZE; | |
768 | + | |
769 | 769 | VLDBG(curlun, "file read %u @ %llu -> %d\n", amount, |
770 | 770 | (unsigned long long) file_offset, |
771 | 771 | (int) nread); |
772 | 772 | |
773 | 773 | |
... | ... | @@ -931,13 +931,13 @@ |
931 | 931 | amount = bh->outreq->actual; |
932 | 932 | |
933 | 933 | /* Perform the write */ |
934 | - rc = ums_info->write_sector(&(ums_info->ums_dev), | |
934 | + rc = ums->write_sector(ums, | |
935 | 935 | file_offset / SECTOR_SIZE, |
936 | 936 | amount / SECTOR_SIZE, |
937 | 937 | (char __user *)bh->buf); |
938 | - if (rc) | |
938 | + if (!rc) | |
939 | 939 | return -EIO; |
940 | - nwritten = amount; | |
940 | + nwritten = rc * SECTOR_SIZE; | |
941 | 941 | |
942 | 942 | VLDBG(curlun, "file write %u @ %llu -> %d\n", amount, |
943 | 943 | (unsigned long long) file_offset, |
... | ... | @@ -959,6 +959,8 @@ |
959 | 959 | |
960 | 960 | /* If an error occurred, report it and its position */ |
961 | 961 | if (nwritten < amount) { |
962 | + printf("nwritten:%d amount:%d\n", nwritten, | |
963 | + amount); | |
962 | 964 | curlun->sense_data = SS_WRITE_ERROR; |
963 | 965 | curlun->info_valid = 1; |
964 | 966 | break; |
965 | 967 | |
... | ... | @@ -1045,14 +1047,13 @@ |
1045 | 1047 | } |
1046 | 1048 | |
1047 | 1049 | /* Perform the read */ |
1048 | - nread = 0; | |
1049 | - rc = ums_info->read_sector(&(ums_info->ums_dev), | |
1050 | - file_offset / SECTOR_SIZE, | |
1051 | - amount / SECTOR_SIZE, | |
1052 | - (char __user *)bh->buf); | |
1053 | - if (rc) | |
1050 | + rc = ums->read_sector(ums, | |
1051 | + file_offset / SECTOR_SIZE, | |
1052 | + amount / SECTOR_SIZE, | |
1053 | + (char __user *)bh->buf); | |
1054 | + if (!rc) | |
1054 | 1055 | return -EIO; |
1055 | - nread = amount; | |
1056 | + nread = rc * SECTOR_SIZE; | |
1056 | 1057 | |
1057 | 1058 | VLDBG(curlun, "file read %u @ %llu -> %d\n", amount, |
1058 | 1059 | (unsigned long long) file_offset, |
... | ... | @@ -1100,7 +1101,7 @@ |
1100 | 1101 | buf[4] = 31; /* Additional length */ |
1101 | 1102 | /* No special options */ |
1102 | 1103 | sprintf((char *) (buf + 8), "%-8s%-16s%04x", (char*) vendor_id , |
1103 | - ums_info->name, (u16) 0xffff); | |
1104 | + ums->name, (u16) 0xffff); | |
1104 | 1105 | |
1105 | 1106 | return 36; |
1106 | 1107 | } |
1107 | 1108 | |
... | ... | @@ -2753,9 +2754,9 @@ |
2753 | 2754 | return fsg_bind_config(c->cdev, c, fsg_common); |
2754 | 2755 | } |
2755 | 2756 | |
2756 | -int fsg_init(struct ums_board_info *ums) | |
2757 | +int fsg_init(struct ums *ums_dev) | |
2757 | 2758 | { |
2758 | - ums_info = ums; | |
2759 | + ums = ums_dev; | |
2759 | 2760 | |
2760 | 2761 | return 0; |
2761 | 2762 | } |
drivers/usb/gadget/storage_common.c
... | ... | @@ -275,7 +275,6 @@ |
275 | 275 | #define ETOOSMALL 525 |
276 | 276 | |
277 | 277 | #include <usb_mass_storage.h> |
278 | -extern struct ums_board_info *ums_info; | |
279 | 278 | |
280 | 279 | /*-------------------------------------------------------------------------*/ |
281 | 280 | |
... | ... | @@ -581,7 +580,7 @@ |
581 | 580 | /* R/W if we can, R/O if we must */ |
582 | 581 | ro = curlun->initially_ro; |
583 | 582 | |
584 | - ums_info->get_capacity(&(ums_info->ums_dev), &size); | |
583 | + ums->get_capacity(ums, &size); | |
585 | 584 | if (size < 0) { |
586 | 585 | printf("unable to find file size: %s\n", filename); |
587 | 586 | rc = (int) size; |
include/usb_mass_storage.h
... | ... | @@ -9,32 +9,35 @@ |
9 | 9 | #define __USB_MASS_STORAGE_H__ |
10 | 10 | |
11 | 11 | #define SECTOR_SIZE 0x200 |
12 | - | |
13 | 12 | #include <mmc.h> |
14 | 13 | #include <linux/usb/composite.h> |
15 | 14 | |
16 | -struct ums_device { | |
17 | - struct mmc *mmc; | |
18 | - int dev_num; | |
19 | - int offset; | |
20 | - int part_size; | |
21 | -}; | |
15 | +#ifndef UMS_START_SECTOR | |
16 | +#define UMS_START_SECTOR 0 | |
17 | +#endif | |
22 | 18 | |
23 | -struct ums_board_info { | |
24 | - int (*read_sector)(struct ums_device *ums_dev, | |
19 | +#ifndef UMS_NUM_SECTORS | |
20 | +#define UMS_NUM_SECTORS 0 | |
21 | +#endif | |
22 | + | |
23 | +struct ums { | |
24 | + int (*read_sector)(struct ums *ums_dev, | |
25 | 25 | ulong start, lbaint_t blkcnt, void *buf); |
26 | - int (*write_sector)(struct ums_device *ums_dev, | |
26 | + int (*write_sector)(struct ums *ums_dev, | |
27 | 27 | ulong start, lbaint_t blkcnt, const void *buf); |
28 | - void (*get_capacity)(struct ums_device *ums_dev, | |
28 | + void (*get_capacity)(struct ums *ums_dev, | |
29 | 29 | long long int *capacity); |
30 | 30 | const char *name; |
31 | - struct ums_device ums_dev; | |
31 | + struct mmc *mmc; | |
32 | + int offset; | |
33 | + int part_size; | |
32 | 34 | }; |
33 | 35 | |
34 | -int fsg_init(struct ums_board_info *); | |
36 | +extern struct ums *ums; | |
37 | + | |
38 | +int fsg_init(struct ums *); | |
35 | 39 | void fsg_cleanup(void); |
36 | -struct ums_board_info *board_ums_init(unsigned int, unsigned int, | |
37 | - unsigned int); | |
40 | +struct ums *ums_init(unsigned int); | |
38 | 41 | int fsg_main_thread(void *); |
39 | 42 | |
40 | 43 | #ifdef CONFIG_USB_GADGET_MASS_STORAGE |