]> www.infradead.org Git - mtd-utils.git/commitdiff
mtd-utils: Add multi-block erase function
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Mon, 25 Apr 2016 22:13:23 +0000 (00:13 +0200)
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>
Thu, 17 Nov 2016 10:36:55 +0000 (11:36 +0100)
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Signed-off-by: Richard Weinberger <richard@nod.at>
include/libmtd.h
lib/libmtd.c

index a6ff050bede17570f363928803c4c12be003ff37..f9f31643634208d2f0a46b606f12d452c6ea6931 100644 (file)
@@ -173,6 +173,20 @@ int mtd_lock(const struct mtd_dev_info *mtd, int fd, int eb);
  */
 int mtd_unlock(const struct mtd_dev_info *mtd, int fd, int eb);
 
+/**
+ * mtd_erase - erase multiple eraseblocks.
+ * @desc: MTD library descriptor
+ * @mtd: MTD device description object
+ * @fd: MTD device node file descriptor
+ * @eb: index of first eraseblock to erase
+ * @blocks: the number of eraseblocks to erase
+ *
+ * This function erases @blocks starting at eraseblock @eb of MTD device
+ * described by @fd. Returns %0 in case of success and %-1 in case of failure.
+ */
+int mtd_erase_multi(libmtd_t desc, const struct mtd_dev_info *mtd,
+                       int fd, int eb, int blocks);
+
 /**
  * mtd_erase - erase an eraseblock.
  * @desc: MTD library descriptor
index 1d162c7c378f2368a895e830a6ca319998389650..ff1180646556636393894e478b3f98f1be47d5e0 100644 (file)
@@ -845,7 +845,8 @@ int mtd_unlock(const struct mtd_dev_info *mtd, int fd, int eb)
        return mtd_xlock(mtd, fd, eb, MEMUNLOCK);
 }
 
-int mtd_erase(libmtd_t desc, const struct mtd_dev_info *mtd, int fd, int eb)
+int mtd_erase_multi(libmtd_t desc, const struct mtd_dev_info *mtd,
+                       int fd, int eb, int blocks)
 {
        int ret;
        struct libmtd *lib = (struct libmtd *)desc;
@@ -856,8 +857,12 @@ int mtd_erase(libmtd_t desc, const struct mtd_dev_info *mtd, int fd, int eb)
        if (ret)
                return ret;
 
+       ret = mtd_valid_erase_block(mtd, eb + blocks - 1);
+       if (ret)
+               return ret;
+
        ei64.start = (__u64)eb * mtd->eb_size;
-       ei64.length = mtd->eb_size;
+       ei64.length = (__u64)mtd->eb_size * blocks;
 
        if (lib->offs64_ioctls == OFFS64_IOCTLS_SUPPORTED ||
            lib->offs64_ioctls == OFFS64_IOCTLS_UNKNOWN) {
@@ -892,6 +897,11 @@ int mtd_erase(libmtd_t desc, const struct mtd_dev_info *mtd, int fd, int eb)
        return 0;
 }
 
+int mtd_erase(libmtd_t desc, const struct mtd_dev_info *mtd, int fd, int eb)
+{
+       return mtd_erase_multi(desc, mtd, fd, eb, 1);
+}
+
 int mtd_regioninfo(int fd, int regidx, struct region_info_user *reginfo)
 {
        int ret;