@@ -233,7 +233,7 @@ int legacy_get_dev_info(const char *node, struct mtd_dev_info *mtd)
{
struct stat st;
struct mtd_info_user ui;
- int fd, ret;
+ int fd, ret, region_cnt, i;
loff_t offs = 0;
struct proc_parse_info pi;
@@ -282,6 +282,32 @@ int legacy_get_dev_info(const char *node, struct mtd_dev_info *mtd)
} else
mtd->bb_allowed = 1;
+ ret = ioctl(fd, MEMGETREGIONCOUNT, ®ion_cnt);
+ if (ret == -1) {
+ if (errno != EOPNOTSUPP) {
+ sys_errmsg("MEMGETREGIONCOUNT ioctl failed");
+ goto out_close;
+ }
+ errno = 0;
+ mtd->region_cnt = 0;
+ } else
+ mtd->region_cnt = region_cnt;
+
+ if (mtd->region_cnt) {
+ mtd->reginfo = calloc(mtd->region_cnt,
+ sizeof(struct region_info_user));
+ if (!mtd->reginfo) {
+ errno = ENOMEM;
+ goto out_close;
+ }
+
+ for (i = 0; i < mtd->region_cnt; i++) {
+ ret = mtd_regioninfo(fd, i, &(mtd->reginfo[i]));
+ if (ret)
+ goto out_close;
+ }
+ }
+
mtd->type = ui.type;
mtd->size = ui.size;
mtd->eb_size = ui.erasesize;
Signed-off-by: Marian Rotariu <marian_rotariu@mentor.com> --- lib/libmtd_legacy.c | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-)