int ubi_detach(libubi_t desc, const char *node, const char *mtd_dev_node) { int mtd_num; if (!mtd_dev_node) { errno = EINVAL; return -1; } mtd_num = mtd_node_to_num(mtd_dev_node); if (mtd_num == -1) return -1; return ubi_detach_mtd(desc, node, mtd_num); }
void scan_ubi_partitions(int mtd) { struct flash_description *nand = get_flash_info(); int err; libubi_t libubi = nand->libubi; struct ubi_part *ubi_part; struct mtd_ubi_info *mtd_info; int i; if (mtd < 0 || mtd > MAX_MTD_DEVICES) ERROR("wrong MTD device /dev/mtd%d", mtd); mtd_info = &nand->mtd_info[mtd]; LIST_INIT(&mtd_info->ubi_partitions); /* * The program is called directly after a boot, * and a detach is not required. However, * detaching at the beginning allows consecutive * start of the program itself */ ubi_detach_mtd(libubi, DEFAULT_CTRL_DEV, mtd); mtd_info->req.dev_num = UBI_DEV_NUM_AUTO; mtd_info->req.mtd_num = mtd; #if CONFIG_UBIVIDOFFSET mtd_info->req.vid_hdr_offset = CONFIG_UBIVIDOFFSET; #else mtd_info->req.vid_hdr_offset = 0; #endif mtd_info->req.mtd_dev_node = NULL; err = ubi_attach(libubi, DEFAULT_CTRL_DEV, &mtd_info->req); if (err) { TRACE("cannot attach mtd%d - maybe not a NAND or raw device", mtd); return; } err = ubi_get_dev_info1(libubi, mtd_info->req.dev_num, &mtd_info->dev_info); if (err) { TRACE("cannot get information about UBI device %d", mtd_info->req.dev_num); return; } for (i = mtd_info->dev_info.lowest_vol_id; i <= mtd_info->dev_info.highest_vol_id; i++) { ubi_part = (struct ubi_part *)calloc(1, sizeof(struct ubi_part)); if (!ubi_part) ERROR("No memory: malloc failed\n"); err = ubi_get_vol_info1(libubi, mtd_info->dev_info.dev_num, i, &ubi_part->vol_info); if (err == -1) { if (errno == ENOENT) continue; TRACE("libubi failed to probe volume %d on ubi%d", i, mtd_info->dev_info.dev_num); return; } LIST_INSERT_HEAD(&mtd_info->ubi_partitions, ubi_part, next); TRACE("mtd%d:\tVolume found : \t%s", mtd, ubi_part->vol_info.name); } mtd_info->scanned = 1; }