vold: Add support for /dev/block/mmcblk1
Signed-off-by: Ethan.Du <a7233c@motorola.com>
Signed-off-by: San Mehat <san@google.com>
diff --git a/vold/blkdev.c b/vold/blkdev.c
index e10eafc..22d000e 100644
--- a/vold/blkdev.c
+++ b/vold/blkdev.c
@@ -32,6 +32,7 @@
#include "vold.h"
#include "blkdev.h"
#include "diskmbr.h"
+#include "media.h"
#define DEBUG_BLKDEV 0
@@ -132,7 +133,12 @@
}
} else if (blk->type == blkdev_partition) {
struct dos_partition part;
- int part_no = blk->minor -1;
+ int part_no;
+
+ if (blk->media->media_type == media_mmc)
+ part_no = blk->minor % MMC_PARTS_PER_CARD -1;
+ else
+ part_no = blk->minor -1;
if (part_no < 4) {
dos_partition_dec(block + DOSPARTOFF + part_no * sizeof(struct dos_partition), &part);
diff --git a/vold/media.h b/vold/media.h
index 567ce04..6fd8b84 100644
--- a/vold/media.h
+++ b/vold/media.h
@@ -28,6 +28,12 @@
media_devmapper,
} media_type_t;
+/*
+ * max 8 partitions per card
+ */
+#define MMC_PARTS_PER_CARD (1<<3)
+#define ALIGN_MMC_MINOR(min) (min / MMC_PARTS_PER_CARD * MMC_PARTS_PER_CARD)
+
typedef struct media {
char *devpath;
char *name;
diff --git a/vold/uevent.c b/vold/uevent.c
index dffe817..dc15d80 100644
--- a/vold/uevent.c
+++ b/vold/uevent.c
@@ -325,7 +325,10 @@
* If there isn't a disk already its because *we*
* are the disk
*/
- disk = blkdev_lookup_by_devno(maj, 0);
+ if (media->media_type == media_mmc)
+ disk = blkdev_lookup_by_devno(maj, ALIGN_MMC_MINOR(min));
+ else
+ disk = blkdev_lookup_by_devno(maj, 0);
if (!(blkdev = blkdev_create(disk,
event->path,
diff --git a/vold/volmgr.c b/vold/volmgr.c
index 61d0c4f..deb680e 100644
--- a/vold/volmgr.c
+++ b/vold/volmgr.c
@@ -536,9 +536,16 @@
* Since we only support creating 1 partition (right now),
* we can just lookup the target by devno
*/
- blkdev_t *part = blkdev_lookup_by_devno(dev->major, 1);
+ blkdev_t *part;
+ if (vol->media_type == media_mmc)
+ part = blkdev_lookup_by_devno(dev->major, ALIGN_MMC_MINOR(dev->minor) + 1);
+ else
+ part = blkdev_lookup_by_devno(dev->major, 1);
if (!part) {
- part = blkdev_lookup_by_devno(dev->major, 0);
+ if (vol->media_type == media_mmc)
+ part = blkdev_lookup_by_devno(dev->major, ALIGN_MMC_MINOR(dev->minor));
+ else
+ part = blkdev_lookup_by_devno(dev->major, 0);
if (!part) {
LOGE("Unable to find device to format");
return -ENODEV;
@@ -573,9 +580,14 @@
rc = -ENODEV;
int i;
for (i = 0; i < dev->nr_parts; i++) {
- blkdev_t *part = blkdev_lookup_by_devno(dev->major, (i+1));
+ blkdev_t *part;
+ if (vol->media_type == media_mmc)
+ part = blkdev_lookup_by_devno(dev->major, ALIGN_MMC_MINOR(dev->minor) + (i+1));
+ else
+ part = blkdev_lookup_by_devno(dev->major, (i+1));
if (!part) {
- LOGE("Error - unable to lookup partition for blkdev %d:%d", dev->major, (i+1));
+ LOGE("Error - unable to lookup partition for blkdev %d:%d",
+ dev->major, dev->minor);
continue;
}
rc = _volmgr_start(vol, part);