Skip to contentSkip to conversation

usb: ums - expose selected partition/s v2

PATCH New John Tobias 2 participants 3 messages Apr 11, 2016 – Apr 13, 2016

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 usb: ums - expose selected partition/s v2

By applying this patch, it will give us some flexibility to expose a selected partition/s.

e.g:
1. To expose several partitions
ums 0 mmc 0:1,0:6

2. To expose the all partitions
ums 0 mmc 0:0

3. To expose multiple partititions on several devices ums 0 mmc 0:1,1:6

---
 cmd/usb_mass_storage.c | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)
cmd/usb_mass_storage.c +22 -10
index 14eed98..0b49e87 100644
@@ -50,14 +50,16 @@ static void ums_fini(void)
 
 #define UMS_NAME_LEN 16
 
-static int ums_init(const char *devtype, const char *devnums)
+static int ums_init(const char *devtype, const char *devnums_part_str)
 {
-	char *s, *t, *devnum, *name;
+	char *s, *t, *devnum_part_str, *name;
 	struct blk_desc *block_dev;
+	disk_partition_t info;
+	int partnum;
 	int ret;
 	struct ums *ums_new;
 
-	s = strdup(devnums);
+	s = strdup(devnums_part_str);
 	if (!s)
 		return -1;
 
@@ -65,12 +67,14 @@ static int ums_init(const char *devtype, const char *devnums)
 	ums_count = 0;
 
 	for (;;) {
-		devnum = strsep(&t, ",");
-		if (!devnum)
+		devnum_part_str = strsep(&t, ",");
+		if (!devnum_part_str)
 			break;
 
-		ret = blk_get_device_by_str(devtype, devnum, &block_dev);
-		if (ret < 0)
+		partnum = blk_get_device_part_str(devtype, devnum_part_str,
+                &block_dev, &info, 1);
+
+		if (partnum < 0)
 			goto cleanup;
 
 		/* f_mass_storage.c assumes SECTOR_SIZE sectors */
@@ -86,10 +90,18 @@ static int ums_init(const char *devtype, const char *devnums)
 		}
 		ums = ums_new;
 
+		/* if partnum = 0, expose the whole device */
+		if (partnum == 0) {
+			ums[ums_count].start_sector = 0;
+			ums[ums_count].num_sectors = block_dev->lba;
+		} else {
+			ums[ums_count].start_sector = info.start;
+			ums[ums_count].num_sectors = info.size;
+		}
+
 		ums[ums_count].read_sector = ums_read_sector;
 		ums[ums_count].write_sector = ums_write_sector;
-		ums[ums_count].start_sector = 0;
-		ums[ums_count].num_sectors = block_dev->lba;
+
 		name = malloc(UMS_NAME_LEN);
 		if (!name) {
 			ret = -1;
@@ -230,6 +242,6 @@ cleanup_ums_init:
 
 U_BOOT_CMD(ums, 4, 1, do_usb_mass_storage,
 	"Use the UMS [USB Mass Storage]",
-	"<USB_controller> [<devtype>] <devnum>  e.g. ums 0 mmc 0\n"
+	"<USB_controller> [<devtype>] <dev:part>  e.g. ums 0 mmc 0:0\n"
 	"    devtype defaults to mmc"
 );
Signature · 1 line
2.8.1
#1 lore raw

PATCH 1/1 usb: ums - expose selected partition/s v2

Hi John,

Quoted 9 lines

By applying this patch, it will give us some flexibility to expose a selected partition/s.

e.g:
1. To expose several partitions
ums 0 mmc 0:1,0:6

2. To expose the all partitions
ums 0 mmc 0:0

During testing, I've found one issue with this code:

Traditionally the ums command was invoked as:

'ums 0 0'

or

'ums 0 mmc 0'

which exposed all SD|eMMC partitions.

Now, when I run 'ums 0 mmc 0' I can only see the first partition.

Could you add some code to preserve the legacy behavior?

I mean all partitions should be exposed when one types:

'ums 0 0' or 'ums 0 mmc 0' or 'ums 0 mmc 0.0'

Quoted 83 lines

3. To expose multiple partititions on several devices ums 0 mmc 0:1,1:6

---
 cmd/usb_mass_storage.c | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)
cmd/usb_mass_storage.c +11 -7
index 14eed98..0b49e87 100644
@@ -50,14 +50,16 @@ static void ums_fini(void)
 
 #define UMS_NAME_LEN 16
 
-static int ums_init(const char *devtype, const char *devnums)
+static int ums_init(const char *devtype, const char
 *devnums_part_str) {
-	char *s, *t, *devnum, *name;
+	char *s, *t, *devnum_part_str, *name;
 	struct blk_desc *block_dev;
+	disk_partition_t info;
+	int partnum;
 	int ret;
 	struct ums *ums_new;
 
-	s = strdup(devnums);
+	s = strdup(devnums_part_str);
 	if (!s)
 		return -1;
 
@@ -65,12 +67,14 @@ static int ums_init(const char *devtype, const
 char *devnums) ums_count = 0;
 
 	for (;;) {
-		devnum = strsep(&t, ",");
-		if (!devnum)
+		devnum_part_str = strsep(&t, ",");
+		if (!devnum_part_str)
 			break;
 
-		ret = blk_get_device_by_str(devtype, devnum,
 &block_dev);
-		if (ret < 0)
+		partnum = blk_get_device_part_str(devtype,
 devnum_part_str,
+                &block_dev, &info, 1);
+
+		if (partnum < 0)
 			goto cleanup;
cmd/usb_mass_storage.c +11 -3
 		/* f_mass_storage.c assumes SECTOR_SIZE sectors */
@@ -86,10 +90,18 @@ static int ums_init(const char *devtype, const
 char *devnums) }
 		ums = ums_new;
 
+		/* if partnum = 0, expose the whole device */
+		if (partnum == 0) {
+			ums[ums_count].start_sector = 0;
+			ums[ums_count].num_sectors = block_dev->lba;
+		} else {
+			ums[ums_count].start_sector = info.start;
+			ums[ums_count].num_sectors = info.size;
+		}
+
 		ums[ums_count].read_sector = ums_read_sector;
 		ums[ums_count].write_sector = ums_write_sector;
-		ums[ums_count].start_sector = 0;
-		ums[ums_count].num_sectors = block_dev->lba;
+
 		name = malloc(UMS_NAME_LEN);
 		if (!name) {
 			ret = -1;
@@ -230,6 +242,6 @@ cleanup_ums_init:
 
 U_BOOT_CMD(ums, 4, 1, do_usb_mass_storage,
 	"Use the UMS [USB Mass Storage]",
-	"<USB_controller> [<devtype>] <devnum>  e.g. ums 0 mmc 0\n"
+	"<USB_controller> [<devtype>] <dev:part>  e.g. ums 0 mmc

0:0\n" " devtype defaults to mmc"
);

Signature · 5 lines
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group
#2 lore raw

PATCH 1/1 usb: ums - expose selected partition/s v2

Hi Lukas,

Sure. I will fix it.

Regards,

John

Quoted 126 lines · Lukasz Majewski

Hi John,

Quoted 9 lines

By applying this patch, it will give us some flexibility to expose a selected partition/s.

e.g:
1. To expose several partitions
ums 0 mmc 0:1,0:6

2. To expose the all partitions
ums 0 mmc 0:0

During testing, I've found one issue with this code:

Traditionally the ums command was invoked as:

'ums 0 0'

or

'ums 0 mmc 0'

which exposed all SD|eMMC partitions.

Now, when I run 'ums 0 mmc 0' I can only see the first partition.

Could you add some code to preserve the legacy behavior?

I mean all partitions should be exposed when one types:

'ums 0 0' or 'ums 0 mmc 0' or 'ums 0 mmc 0.0'

Quoted 81 lines

3. To expose multiple partititions on several devices ums 0 mmc 0:1,1:6

---
 cmd/usb_mass_storage.c | 32 ++++++++++++++++++++++----------
 1 file changed, 22 insertions(+), 10 deletions(-)
cmd/usb_mass_storage.c +11 -7
index 14eed98..0b49e87 100644
@@ -50,14 +50,16 @@ static void ums_fini(void)
 
 #define UMS_NAME_LEN 16
 
-static int ums_init(const char *devtype, const char *devnums)
+static int ums_init(const char *devtype, const char
 *devnums_part_str) {
-     char *s, *t, *devnum, *name;
+     char *s, *t, *devnum_part_str, *name;
      struct blk_desc *block_dev;
+     disk_partition_t info;
+     int partnum;
      int ret;
      struct ums *ums_new;
 
-     s = strdup(devnums);
+     s = strdup(devnums_part_str);
      if (!s)
              return -1;
 
@@ -65,12 +67,14 @@ static int ums_init(const char *devtype, const
 char *devnums) ums_count = 0;
 
      for (;;) {
-             devnum = strsep(&t, ",");
-             if (!devnum)
+             devnum_part_str = strsep(&t, ",");
+             if (!devnum_part_str)
                      break;
 
-             ret = blk_get_device_by_str(devtype, devnum,
 &block_dev);
-             if (ret < 0)
+             partnum = blk_get_device_part_str(devtype,
 devnum_part_str,
+                &block_dev, &info, 1);
+
+             if (partnum < 0)
                      goto cleanup;
              /* f_mass_storage.c assumes SECTOR_SIZE sectors */
cmd/usb_mass_storage.c +11 -3
@@ -86,10 +90,18 @@ static int ums_init(const char *devtype, const
 char *devnums) }
              ums = ums_new;
 
+             /* if partnum = 0, expose the whole device */
+             if (partnum == 0) {
+                     ums[ums_count].start_sector = 0;
+                     ums[ums_count].num_sectors = block_dev->lba;
+             } else {
+                     ums[ums_count].start_sector = info.start;
+                     ums[ums_count].num_sectors = info.size;
+             }
+
              ums[ums_count].read_sector = ums_read_sector;
              ums[ums_count].write_sector = ums_write_sector;
-             ums[ums_count].start_sector = 0;
-             ums[ums_count].num_sectors = block_dev->lba;
+
              name = malloc(UMS_NAME_LEN);
              if (!name) {
                      ret = -1;
@@ -230,6 +242,6 @@ cleanup_ums_init:
 
 U_BOOT_CMD(ums, 4, 1, do_usb_mass_storage,
      "Use the UMS [USB Mass Storage]",
-     "<USB_controller> [<devtype>] <devnum>  e.g. ums 0 mmc 0\n"
+     "<USB_controller> [<devtype>] <dev:part>  e.g. ums 0 mmc
Quoted 2 lines

0:0\n" " devtype defaults to mmc"
);

--
Best regards,

Lukasz Majewski

Samsung R&D Institute Poland (SRPOL) | Linux Platform Group