[PATCH 1/2] mtd: peb: Add mtd_peb_read_file()
Sascha Hauer
s.hauer at pengutronix.de
Tue Apr 19 23:38:39 PDT 2022
Analog to mtd_peb_write_file() this adds a mtd_peb_read_file()
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
drivers/mtd/peb.c | 45 +++++++++++++++++++++++++++++++++++++++++++
include/mtd/mtd-peb.h | 2 ++
2 files changed, 47 insertions(+)
diff --git a/drivers/mtd/peb.c b/drivers/mtd/peb.c
index 6c61e0734c..8443ed86bc 100644
--- a/drivers/mtd/peb.c
+++ b/drivers/mtd/peb.c
@@ -508,6 +508,51 @@ out:
return ret;
}
+/**
+ * mtd_peb_read_file - read data from a mtd device
+ * @mtd: mtd device
+ * @peb_start: The first PEB where to start reading
+ * @peb_last: last PEB where to read from
+ * @buf: buffer to read to
+ * @len: how many bytes to read
+ *
+ * This function reads @len bytes of data to buffer @buf from the mtd device
+ * @mtd starting at @peb_start. Reading will stop at @peb_last. This function
+ * skips all bad blocks and returns 0 on success or a negative error code
+ * otherwise.
+ */
+int mtd_peb_read_file(struct mtd_info *mtd, unsigned int peb_start,
+ unsigned int peb_last, void *buf, size_t len)
+{
+ int ret, pnum;
+
+ pnum = peb_start;
+
+ while (len) {
+ size_t now = min_t(size_t, mtd->erasesize, len);
+
+ if (pnum > peb_last)
+ return -EIO;
+
+ if (mtd_peb_is_bad(mtd, pnum)) {
+ pnum++;
+ continue;
+ }
+
+ ret = mtd_peb_read(mtd, buf, pnum, 0, now);
+ if (ret)
+ goto out;
+
+ len -= now;
+ pnum++;
+ buf += now;
+ }
+
+ ret = 0;
+out:
+ return ret;
+}
+
/**
* mtd_peb_erase - erase a physical eraseblock.
* @mtd: mtd device
diff --git a/include/mtd/mtd-peb.h b/include/mtd/mtd-peb.h
index cfcc0be611..cf8d8ff8da 100644
--- a/include/mtd/mtd-peb.h
+++ b/include/mtd/mtd-peb.h
@@ -23,6 +23,8 @@ int mtd_num_pebs(struct mtd_info *mtd);
int mtd_peb_create_bitflips(struct mtd_info *mtd, int pnum, int offset,
int len, int num_bitflips, int random,
int info);
+int mtd_peb_read_file(struct mtd_info *mtd, unsigned int peb_start,
+ unsigned int peb_last, void *buf, size_t len);
int mtd_peb_write_file(struct mtd_info *mtd, int peb_start, int max_pebs,
const void *buf, size_t len);
--
2.30.2
More information about the barebox
mailing list