int scan_mtd_devices (void) { int err; struct flash_description *flash = get_flash_info(); struct mtd_info *mtd_info = &flash->mtd; libmtd_t libmtd = flash->libmtd; char blacklist[100] = { 0 }; char *token; char *saveptr; int i, index; #if defined(CONFIG_UBIBLACKLIST) strncpy(blacklist, CONFIG_UBIBLACKLIST, sizeof(blacklist)); #endif if (!libmtd) { ERROR("MTD is not present on the target"); return -1; } err = mtd_get_info(libmtd, mtd_info); if (err) { if (errno == ENODEV) ERROR("MTD is not present on the board"); return 0; } /* Allocate memory to store MTD infos */ flash->mtd_info = (struct mtd_ubi_info *)calloc( mtd_info->highest_mtd_num + 1, sizeof(struct mtd_ubi_info)); if (!flash->mtd_info) { ERROR("No enough memory for MTD structures"); return -ENOMEM; } token = strtok_r(blacklist, " ", &saveptr); if (token) { errno = 0; index = strtoul(token, NULL, 10); if (errno == 0) { ubi_insert_blacklist(index, flash); while ((token = strtok_r(NULL, " ", &saveptr))) { errno = 0; index = strtoul(token, NULL, 10); if (errno != 0) break; ubi_insert_blacklist(index, flash); } } } for (i = mtd_info->lowest_mtd_num; i <= mtd_info->highest_mtd_num; i++) { if (!mtd_dev_present(libmtd, i)) continue; err = mtd_get_dev_info1(libmtd, i, &flash->mtd_info[i].mtd); if (err) { TRACE("No information from MTD%d", i); continue; } #if defined(CONFIG_UBIVOL) if (!flash->mtd_info[i].skipubi) scan_ubi_partitions(i); #endif } return mtd_info->mtd_dev_cnt; }
int scan_mtd_devices (void) { int err; struct flash_description *flash = get_flash_info(); struct mtd_info *mtd_info = &flash->mtd; struct mtd_ubi_info *mtd_ubi_info; libmtd_t libmtd = flash->libmtd; char blacklist[100] = { 0 }; char *token; char *saveptr; int i, index; #if defined(CONFIG_UBIBLACKLIST) strncpy(blacklist, CONFIG_UBIBLACKLIST, sizeof(blacklist)); #endif /* Blacklist passed on the command line has priority */ if (strlen(mtd_ubi_blacklist)) strncpy(blacklist, mtd_ubi_blacklist, sizeof(blacklist)); if (!libmtd) { ERROR("MTD is not present on the target"); return -1; } err = mtd_get_info(libmtd, mtd_info); if (err) { if (errno == ENODEV) ERROR("MTD is not present on the board"); return 0; } /* Allocate memory to store MTD infos */ flash->mtd_info = (struct mtd_ubi_info *)calloc( mtd_info->highest_mtd_num + 1, sizeof(struct mtd_ubi_info)); if (!flash->mtd_info) { ERROR("No enough memory for MTD structures"); return -ENOMEM; } token = strtok_r(blacklist, " ", &saveptr); if (token) { errno = 0; index = strtoul(token, NULL, 10); if (errno == 0) { ubi_insert_blacklist(index, flash); while ((token = strtok_r(NULL, " ", &saveptr))) { errno = 0; index = strtoul(token, NULL, 10); if (errno != 0) break; ubi_insert_blacklist(index, flash); } } } for (i = mtd_info->lowest_mtd_num; i <= mtd_info->highest_mtd_num; i++) { /* initialize data */ mtd_ubi_info = &flash->mtd_info[i]; LIST_INIT(&mtd_ubi_info->ubi_partitions); if (!mtd_dev_present(libmtd, i)) continue; err = mtd_get_dev_info1(libmtd, i, &flash->mtd_info[i].mtd); if (err) { TRACE("No information from MTD%d", i); continue; } } #if defined(CONFIG_UBIVOL) /* * Now search for MTD that are already attached */ scan_for_ubi_devices(); /* * Search for volumes in MTD that are not attached, default case */ for (i = mtd_info->lowest_mtd_num; i <= mtd_info->highest_mtd_num; i++) { if (flash->libubi && !flash->mtd_info[i].skipubi && !flash->mtd_info[i].scanned && flash->mtd_info[i].mtd.type != MTD_UBIVOLUME) scan_ubi_partitions(i); } #endif return mtd_info->mtd_dev_cnt; }