Analog to mtd_peb_write_file() this adds a mtd_peb_read_file() Signed-off-by: Sascha Hauer <s.hauer@xxxxxxxxxxxxxx> --- 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 _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox