Lines Matching refs:ubi
154 int ubi_volume_notify(struct ubi_device *ubi, struct ubi_volume *vol, int ntype) in ubi_volume_notify() argument
159 ubi_do_get_device_info(ubi, &nt.di); in ubi_volume_notify()
160 ubi_do_get_volume_info(ubi, vol, &nt.vi); in ubi_volume_notify()
167 ret = ubi_update_fastmap(ubi); in ubi_volume_notify()
169 ubi_msg(ubi, "Unable to write a new fastmap: %i", ret); in ubi_volume_notify()
186 int ubi_notify_all(struct ubi_device *ubi, int ntype, struct notifier_block *nb) in ubi_notify_all() argument
191 ubi_do_get_device_info(ubi, &nt.di); in ubi_notify_all()
193 mutex_lock(&ubi->device_mutex); in ubi_notify_all()
194 for (i = 0; i < ubi->vtbl_slots; i++) { in ubi_notify_all()
200 if (!ubi->volumes[i]) in ubi_notify_all()
203 ubi_do_get_volume_info(ubi, ubi->volumes[i], &nt.vi); in ubi_notify_all()
211 mutex_unlock(&ubi->device_mutex); in ubi_notify_all()
234 struct ubi_device *ubi = ubi_devices[i]; in ubi_enumerate_volumes() local
236 if (!ubi) in ubi_enumerate_volumes()
238 count += ubi_notify_all(ubi, UBI_VOLUME_ADDED, nb); in ubi_enumerate_volumes()
255 struct ubi_device *ubi; in ubi_get_device() local
258 ubi = ubi_devices[ubi_num]; in ubi_get_device()
259 if (ubi) { in ubi_get_device()
260 ubi_assert(ubi->ref_count >= 0); in ubi_get_device()
261 ubi->ref_count += 1; in ubi_get_device()
262 get_device(&ubi->dev); in ubi_get_device()
266 return ubi; in ubi_get_device()
273 void ubi_put_device(struct ubi_device *ubi) in ubi_put_device() argument
276 ubi->ref_count -= 1; in ubi_put_device()
277 put_device(&ubi->dev); in ubi_put_device()
291 struct ubi_device *ubi; in ubi_get_by_major() local
295 ubi = ubi_devices[i]; in ubi_get_by_major()
296 if (ubi && MAJOR(ubi->cdev.dev) == major) { in ubi_get_by_major()
297 ubi_assert(ubi->ref_count >= 0); in ubi_get_by_major()
298 ubi->ref_count += 1; in ubi_get_by_major()
299 get_device(&ubi->dev); in ubi_get_by_major()
301 return ubi; in ubi_get_by_major()
323 struct ubi_device *ubi = ubi_devices[i]; in ubi_major2num() local
325 if (ubi && MAJOR(ubi->cdev.dev) == major) { in ubi_major2num()
326 ubi_num = ubi->ubi_num; in ubi_major2num()
340 struct ubi_device *ubi; in dev_attribute_show() local
352 ubi = container_of(dev, struct ubi_device, dev); in dev_attribute_show()
353 ubi = ubi_get_device(ubi->ubi_num); in dev_attribute_show()
354 if (!ubi) in dev_attribute_show()
358 ret = sprintf(buf, "%d\n", ubi->leb_size); in dev_attribute_show()
360 ret = sprintf(buf, "%d\n", ubi->avail_pebs); in dev_attribute_show()
362 ret = sprintf(buf, "%d\n", ubi->good_peb_count); in dev_attribute_show()
364 ret = sprintf(buf, "%d\n", ubi->vol_count - UBI_INT_VOL_COUNT); in dev_attribute_show()
366 ret = sprintf(buf, "%d\n", ubi->max_ec); in dev_attribute_show()
368 ret = sprintf(buf, "%d\n", ubi->beb_rsvd_pebs); in dev_attribute_show()
370 ret = sprintf(buf, "%d\n", ubi->bad_peb_count); in dev_attribute_show()
372 ret = sprintf(buf, "%d\n", ubi->vtbl_slots); in dev_attribute_show()
374 ret = sprintf(buf, "%d\n", ubi->min_io_size); in dev_attribute_show()
376 ret = sprintf(buf, "%d\n", ubi->thread_enabled); in dev_attribute_show()
378 ret = sprintf(buf, "%d\n", ubi->mtd->index); in dev_attribute_show()
380 ret = sprintf(buf, "%d\n", ubi->ro_mode); in dev_attribute_show()
384 ubi_put_device(ubi); in dev_attribute_show()
407 struct ubi_device *ubi = container_of(dev, struct ubi_device, dev); in dev_release() local
409 kfree(ubi); in dev_release()
416 static void kill_volumes(struct ubi_device *ubi) in kill_volumes() argument
420 for (i = 0; i < ubi->vtbl_slots; i++) in kill_volumes()
421 if (ubi->volumes[i]) in kill_volumes()
422 ubi_free_volume(ubi, ubi->volumes[i]); in kill_volumes()
436 static int uif_init(struct ubi_device *ubi) in uif_init() argument
441 sprintf(ubi->ubi_name, UBI_NAME_STR "%d", ubi->ubi_num); in uif_init()
451 err = alloc_chrdev_region(&dev, 0, ubi->vtbl_slots + 1, ubi->ubi_name); in uif_init()
453 ubi_err(ubi, "cannot register UBI character devices"); in uif_init()
457 ubi->dev.devt = dev; in uif_init()
460 cdev_init(&ubi->cdev, &ubi_cdev_operations); in uif_init()
461 dbg_gen("%s major is %u", ubi->ubi_name, MAJOR(dev)); in uif_init()
462 ubi->cdev.owner = THIS_MODULE; in uif_init()
464 dev_set_name(&ubi->dev, UBI_NAME_STR "%d", ubi->ubi_num); in uif_init()
465 err = cdev_device_add(&ubi->cdev, &ubi->dev); in uif_init()
469 for (i = 0; i < ubi->vtbl_slots; i++) in uif_init()
470 if (ubi->volumes[i]) { in uif_init()
471 err = ubi_add_volume(ubi, ubi->volumes[i]); in uif_init()
473 ubi_err(ubi, "cannot add volume %d", i); in uif_init()
481 kill_volumes(ubi); in uif_init()
482 cdev_device_del(&ubi->cdev, &ubi->dev); in uif_init()
484 unregister_chrdev_region(ubi->cdev.dev, ubi->vtbl_slots + 1); in uif_init()
485 ubi_err(ubi, "cannot initialize UBI %s, error %d", in uif_init()
486 ubi->ubi_name, err); in uif_init()
498 static void uif_close(struct ubi_device *ubi) in uif_close() argument
500 kill_volumes(ubi); in uif_close()
501 cdev_device_del(&ubi->cdev, &ubi->dev); in uif_close()
502 unregister_chrdev_region(ubi->cdev.dev, ubi->vtbl_slots + 1); in uif_close()
509 void ubi_free_internal_volumes(struct ubi_device *ubi) in ubi_free_internal_volumes() argument
513 for (i = ubi->vtbl_slots; in ubi_free_internal_volumes()
514 i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) { in ubi_free_internal_volumes()
515 ubi_eba_replace_table(ubi->volumes[i], NULL); in ubi_free_internal_volumes()
516 ubi_fastmap_destroy_checkmap(ubi->volumes[i]); in ubi_free_internal_volumes()
517 kfree(ubi->volumes[i]); in ubi_free_internal_volumes()
521 static int get_bad_peb_limit(const struct ubi_device *ubi, int max_beb_per1024) in get_bad_peb_limit() argument
532 limit = mtd_max_bad_blocks(ubi->mtd, 0, ubi->mtd->size); in get_bad_peb_limit()
547 device_size = mtd_get_device_size(ubi->mtd); in get_bad_peb_limit()
548 device_pebs = mtd_div_by_eb(device_size, ubi->mtd); in get_bad_peb_limit()
574 static int io_init(struct ubi_device *ubi, int max_beb_per1024) in io_init() argument
579 if (ubi->mtd->numeraseregions != 0) { in io_init()
589 ubi_err(ubi, "multiple regions, not implemented"); in io_init()
593 if (ubi->vid_hdr_offset < 0) in io_init()
601 ubi->peb_size = ubi->mtd->erasesize; in io_init()
602 ubi->peb_count = mtd_div_by_eb(ubi->mtd->size, ubi->mtd); in io_init()
603 ubi->flash_size = ubi->mtd->size; in io_init()
605 if (mtd_can_have_bb(ubi->mtd)) { in io_init()
606 ubi->bad_allowed = 1; in io_init()
607 ubi->bad_peb_limit = get_bad_peb_limit(ubi, max_beb_per1024); in io_init()
610 if (ubi->mtd->type == MTD_NORFLASH) { in io_init()
611 ubi_assert(ubi->mtd->writesize == 1); in io_init()
612 ubi->nor_flash = 1; in io_init()
615 ubi->min_io_size = ubi->mtd->writesize; in io_init()
616 ubi->hdrs_min_io_size = ubi->mtd->writesize >> ubi->mtd->subpage_sft; in io_init()
623 if (!is_power_of_2(ubi->min_io_size)) { in io_init()
624 ubi_err(ubi, "min. I/O unit (%d) is not power of 2", in io_init()
625 ubi->min_io_size); in io_init()
629 ubi_assert(ubi->hdrs_min_io_size > 0); in io_init()
630 ubi_assert(ubi->hdrs_min_io_size <= ubi->min_io_size); in io_init()
631 ubi_assert(ubi->min_io_size % ubi->hdrs_min_io_size == 0); in io_init()
633 ubi->max_write_size = ubi->mtd->writebufsize; in io_init()
638 if (ubi->max_write_size < ubi->min_io_size || in io_init()
639 ubi->max_write_size % ubi->min_io_size || in io_init()
640 !is_power_of_2(ubi->max_write_size)) { in io_init()
641 ubi_err(ubi, "bad write buffer size %d for %d min. I/O unit", in io_init()
642 ubi->max_write_size, ubi->min_io_size); in io_init()
647 ubi->ec_hdr_alsize = ALIGN(UBI_EC_HDR_SIZE, ubi->hdrs_min_io_size); in io_init()
648 ubi->vid_hdr_alsize = ALIGN(UBI_VID_HDR_SIZE, ubi->hdrs_min_io_size); in io_init()
650 dbg_gen("min_io_size %d", ubi->min_io_size); in io_init()
651 dbg_gen("max_write_size %d", ubi->max_write_size); in io_init()
652 dbg_gen("hdrs_min_io_size %d", ubi->hdrs_min_io_size); in io_init()
653 dbg_gen("ec_hdr_alsize %d", ubi->ec_hdr_alsize); in io_init()
654 dbg_gen("vid_hdr_alsize %d", ubi->vid_hdr_alsize); in io_init()
656 if (ubi->vid_hdr_offset == 0) in io_init()
658 ubi->vid_hdr_offset = ubi->vid_hdr_aloffset = in io_init()
659 ubi->ec_hdr_alsize; in io_init()
661 ubi->vid_hdr_aloffset = ubi->vid_hdr_offset & in io_init()
662 ~(ubi->hdrs_min_io_size - 1); in io_init()
663 ubi->vid_hdr_shift = ubi->vid_hdr_offset - in io_init()
664 ubi->vid_hdr_aloffset; in io_init()
668 ubi->leb_start = ubi->vid_hdr_offset + UBI_VID_HDR_SIZE; in io_init()
669 ubi->leb_start = ALIGN(ubi->leb_start, ubi->min_io_size); in io_init()
671 dbg_gen("vid_hdr_offset %d", ubi->vid_hdr_offset); in io_init()
672 dbg_gen("vid_hdr_aloffset %d", ubi->vid_hdr_aloffset); in io_init()
673 dbg_gen("vid_hdr_shift %d", ubi->vid_hdr_shift); in io_init()
674 dbg_gen("leb_start %d", ubi->leb_start); in io_init()
677 if (ubi->vid_hdr_shift % 4) { in io_init()
678 ubi_err(ubi, "unaligned VID header shift %d", in io_init()
679 ubi->vid_hdr_shift); in io_init()
684 if (ubi->vid_hdr_offset < UBI_EC_HDR_SIZE || in io_init()
685 ubi->leb_start < ubi->vid_hdr_offset + UBI_VID_HDR_SIZE || in io_init()
686 ubi->leb_start > ubi->peb_size - UBI_VID_HDR_SIZE || in io_init()
687 ubi->leb_start & (ubi->min_io_size - 1)) { in io_init()
688 ubi_err(ubi, "bad VID header (%d) or data offsets (%d)", in io_init()
689 ubi->vid_hdr_offset, ubi->leb_start); in io_init()
697 ubi->max_erroneous = ubi->peb_count / 10; in io_init()
698 if (ubi->max_erroneous < 16) in io_init()
699 ubi->max_erroneous = 16; in io_init()
700 dbg_gen("max_erroneous %d", ubi->max_erroneous); in io_init()
707 if (ubi->vid_hdr_offset + UBI_VID_HDR_SIZE <= ubi->hdrs_min_io_size) { in io_init()
708 ubi_warn(ubi, "EC and VID headers are in the same minimal I/O unit, switch to read-only mode"); in io_init()
709 ubi->ro_mode = 1; in io_init()
712 ubi->leb_size = ubi->peb_size - ubi->leb_start; in io_init()
714 if (!(ubi->mtd->flags & MTD_WRITEABLE)) { in io_init()
715 ubi_msg(ubi, "MTD device %d is write-protected, attach in read-only mode", in io_init()
716 ubi->mtd->index); in io_init()
717 ubi->ro_mode = 1; in io_init()
741 static int autoresize(struct ubi_device *ubi, int vol_id) in autoresize() argument
744 struct ubi_volume *vol = ubi->volumes[vol_id]; in autoresize()
747 if (ubi->ro_mode) { in autoresize()
748 ubi_warn(ubi, "skip auto-resize because of R/O mode"); in autoresize()
757 ubi->vtbl[vol_id].flags &= ~UBI_VTBL_AUTORESIZE_FLG; in autoresize()
759 if (ubi->avail_pebs == 0) { in autoresize()
766 vtbl_rec = ubi->vtbl[vol_id]; in autoresize()
767 err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec); in autoresize()
769 ubi_err(ubi, "cannot clean auto-resize flag for volume %d", in autoresize()
774 old_reserved_pebs + ubi->avail_pebs); in autoresize()
776 ubi_err(ubi, "cannot auto-resize volume %d", in autoresize()
783 ubi_msg(ubi, "volume %d (\"%s\") re-sized from %d to %d LEBs", in autoresize()
807 struct ubi_device *ubi; in ubi_attach_mtd_dev() local
823 ubi = ubi_devices[i]; in ubi_attach_mtd_dev()
824 if (ubi && mtd->index == ubi->mtd->index) { in ubi_attach_mtd_dev()
877 ubi = kzalloc(sizeof(struct ubi_device), GFP_KERNEL); in ubi_attach_mtd_dev()
878 if (!ubi) in ubi_attach_mtd_dev()
881 device_initialize(&ubi->dev); in ubi_attach_mtd_dev()
882 ubi->dev.release = dev_release; in ubi_attach_mtd_dev()
883 ubi->dev.class = &ubi_class; in ubi_attach_mtd_dev()
884 ubi->dev.groups = ubi_dev_groups; in ubi_attach_mtd_dev()
886 ubi->mtd = mtd; in ubi_attach_mtd_dev()
887 ubi->ubi_num = ubi_num; in ubi_attach_mtd_dev()
888 ubi->vid_hdr_offset = vid_hdr_offset; in ubi_attach_mtd_dev()
889 ubi->autoresize_vol_id = -1; in ubi_attach_mtd_dev()
892 ubi->fm_pool.used = ubi->fm_pool.size = 0; in ubi_attach_mtd_dev()
893 ubi->fm_wl_pool.used = ubi->fm_wl_pool.size = 0; in ubi_attach_mtd_dev()
899 ubi->fm_pool.max_size = min(((int)mtd_div_by_eb(ubi->mtd->size, in ubi_attach_mtd_dev()
900 ubi->mtd) / 100) * 5, UBI_FM_MAX_POOL_SIZE); in ubi_attach_mtd_dev()
901 ubi->fm_pool.max_size = max(ubi->fm_pool.max_size, in ubi_attach_mtd_dev()
904 ubi->fm_wl_pool.max_size = ubi->fm_pool.max_size / 2; in ubi_attach_mtd_dev()
905 ubi->fm_disabled = !fm_autoconvert; in ubi_attach_mtd_dev()
907 ubi_enable_dbg_chk_fastmap(ubi); in ubi_attach_mtd_dev()
909 if (!ubi->fm_disabled && (int)mtd_div_by_eb(ubi->mtd->size, ubi->mtd) in ubi_attach_mtd_dev()
911 ubi_err(ubi, "More than %i PEBs are needed for fastmap, sorry.", in ubi_attach_mtd_dev()
913 ubi->fm_disabled = 1; in ubi_attach_mtd_dev()
916 ubi_msg(ubi, "default fastmap pool size: %d", ubi->fm_pool.max_size); in ubi_attach_mtd_dev()
917 ubi_msg(ubi, "default fastmap WL pool size: %d", in ubi_attach_mtd_dev()
918 ubi->fm_wl_pool.max_size); in ubi_attach_mtd_dev()
920 ubi->fm_disabled = 1; in ubi_attach_mtd_dev()
922 mutex_init(&ubi->buf_mutex); in ubi_attach_mtd_dev()
923 mutex_init(&ubi->ckvol_mutex); in ubi_attach_mtd_dev()
924 mutex_init(&ubi->device_mutex); in ubi_attach_mtd_dev()
925 spin_lock_init(&ubi->volumes_lock); in ubi_attach_mtd_dev()
926 init_rwsem(&ubi->fm_protect); in ubi_attach_mtd_dev()
927 init_rwsem(&ubi->fm_eba_sem); in ubi_attach_mtd_dev()
929 ubi_msg(ubi, "attaching mtd%d", mtd->index); in ubi_attach_mtd_dev()
931 err = io_init(ubi, max_beb_per1024); in ubi_attach_mtd_dev()
936 ubi->peb_buf = vmalloc(ubi->peb_size); in ubi_attach_mtd_dev()
937 if (!ubi->peb_buf) in ubi_attach_mtd_dev()
941 ubi->fm_size = ubi_calc_fm_size(ubi); in ubi_attach_mtd_dev()
942 ubi->fm_buf = vzalloc(ubi->fm_size); in ubi_attach_mtd_dev()
943 if (!ubi->fm_buf) in ubi_attach_mtd_dev()
946 err = ubi_attach(ubi, 0); in ubi_attach_mtd_dev()
948 ubi_err(ubi, "failed to attach mtd%d, error %d", in ubi_attach_mtd_dev()
953 if (ubi->autoresize_vol_id != -1) { in ubi_attach_mtd_dev()
954 err = autoresize(ubi, ubi->autoresize_vol_id); in ubi_attach_mtd_dev()
960 ubi_devices[ubi_num] = ubi; in ubi_attach_mtd_dev()
962 err = uif_init(ubi); in ubi_attach_mtd_dev()
966 err = ubi_debugfs_init_dev(ubi); in ubi_attach_mtd_dev()
970 ubi->bgt_thread = kthread_create(ubi_thread, ubi, "%s", ubi->bgt_name); in ubi_attach_mtd_dev()
971 if (IS_ERR(ubi->bgt_thread)) { in ubi_attach_mtd_dev()
972 err = PTR_ERR(ubi->bgt_thread); in ubi_attach_mtd_dev()
973 ubi_err(ubi, "cannot spawn \"%s\", error %d", in ubi_attach_mtd_dev()
974 ubi->bgt_name, err); in ubi_attach_mtd_dev()
978 ubi_msg(ubi, "attached mtd%d (name \"%s\", size %llu MiB)", in ubi_attach_mtd_dev()
979 mtd->index, mtd->name, ubi->flash_size >> 20); in ubi_attach_mtd_dev()
980 ubi_msg(ubi, "PEB size: %d bytes (%d KiB), LEB size: %d bytes", in ubi_attach_mtd_dev()
981 ubi->peb_size, ubi->peb_size >> 10, ubi->leb_size); in ubi_attach_mtd_dev()
982 ubi_msg(ubi, "min./max. I/O unit sizes: %d/%d, sub-page size %d", in ubi_attach_mtd_dev()
983 ubi->min_io_size, ubi->max_write_size, ubi->hdrs_min_io_size); in ubi_attach_mtd_dev()
984 ubi_msg(ubi, "VID header offset: %d (aligned %d), data offset: %d", in ubi_attach_mtd_dev()
985 ubi->vid_hdr_offset, ubi->vid_hdr_aloffset, ubi->leb_start); in ubi_attach_mtd_dev()
986 ubi_msg(ubi, "good PEBs: %d, bad PEBs: %d, corrupted PEBs: %d", in ubi_attach_mtd_dev()
987 ubi->good_peb_count, ubi->bad_peb_count, ubi->corr_peb_count); in ubi_attach_mtd_dev()
988 ubi_msg(ubi, "user volume: %d, internal volumes: %d, max. volumes count: %d", in ubi_attach_mtd_dev()
989 ubi->vol_count - UBI_INT_VOL_COUNT, UBI_INT_VOL_COUNT, in ubi_attach_mtd_dev()
990 ubi->vtbl_slots); in ubi_attach_mtd_dev()
991 ubi_msg(ubi, "max/mean erase counter: %d/%d, WL threshold: %d, image sequence number: %u", in ubi_attach_mtd_dev()
992 ubi->max_ec, ubi->mean_ec, CONFIG_MTD_UBI_WL_THRESHOLD, in ubi_attach_mtd_dev()
993 ubi->image_seq); in ubi_attach_mtd_dev()
994 ubi_msg(ubi, "available PEBs: %d, total reserved PEBs: %d, PEBs reserved for bad PEB handling: %d", in ubi_attach_mtd_dev()
995 ubi->avail_pebs, ubi->rsvd_pebs, ubi->beb_rsvd_pebs); in ubi_attach_mtd_dev()
1001 spin_lock(&ubi->wl_lock); in ubi_attach_mtd_dev()
1002 ubi->thread_enabled = 1; in ubi_attach_mtd_dev()
1003 wake_up_process(ubi->bgt_thread); in ubi_attach_mtd_dev()
1004 spin_unlock(&ubi->wl_lock); in ubi_attach_mtd_dev()
1006 ubi_notify_all(ubi, UBI_VOLUME_ADDED, NULL); in ubi_attach_mtd_dev()
1010 ubi_debugfs_exit_dev(ubi); in ubi_attach_mtd_dev()
1012 uif_close(ubi); in ubi_attach_mtd_dev()
1015 ubi_wl_close(ubi); in ubi_attach_mtd_dev()
1016 ubi_free_internal_volumes(ubi); in ubi_attach_mtd_dev()
1017 vfree(ubi->vtbl); in ubi_attach_mtd_dev()
1019 vfree(ubi->peb_buf); in ubi_attach_mtd_dev()
1020 vfree(ubi->fm_buf); in ubi_attach_mtd_dev()
1021 put_device(&ubi->dev); in ubi_attach_mtd_dev()
1040 struct ubi_device *ubi; in ubi_detach_mtd_dev() local
1045 ubi = ubi_get_device(ubi_num); in ubi_detach_mtd_dev()
1046 if (!ubi) in ubi_detach_mtd_dev()
1050 put_device(&ubi->dev); in ubi_detach_mtd_dev()
1051 ubi->ref_count -= 1; in ubi_detach_mtd_dev()
1052 if (ubi->ref_count) { in ubi_detach_mtd_dev()
1058 ubi_err(ubi, "%s reference count %d, destroy anyway", in ubi_detach_mtd_dev()
1059 ubi->ubi_name, ubi->ref_count); in ubi_detach_mtd_dev()
1064 ubi_assert(ubi_num == ubi->ubi_num); in ubi_detach_mtd_dev()
1065 ubi_notify_all(ubi, UBI_VOLUME_REMOVED, NULL); in ubi_detach_mtd_dev()
1066 ubi_msg(ubi, "detaching mtd%d", ubi->mtd->index); in ubi_detach_mtd_dev()
1072 if (!ubi_dbg_chk_fastmap(ubi)) in ubi_detach_mtd_dev()
1073 ubi_update_fastmap(ubi); in ubi_detach_mtd_dev()
1079 if (ubi->bgt_thread) in ubi_detach_mtd_dev()
1080 kthread_stop(ubi->bgt_thread); in ubi_detach_mtd_dev()
1083 cancel_work_sync(&ubi->fm_work); in ubi_detach_mtd_dev()
1085 ubi_debugfs_exit_dev(ubi); in ubi_detach_mtd_dev()
1086 uif_close(ubi); in ubi_detach_mtd_dev()
1088 ubi_wl_close(ubi); in ubi_detach_mtd_dev()
1089 ubi_free_internal_volumes(ubi); in ubi_detach_mtd_dev()
1090 vfree(ubi->vtbl); in ubi_detach_mtd_dev()
1091 vfree(ubi->peb_buf); in ubi_detach_mtd_dev()
1092 vfree(ubi->fm_buf); in ubi_detach_mtd_dev()
1093 ubi_msg(ubi, "mtd%d is detached", ubi->mtd->index); in ubi_detach_mtd_dev()
1094 put_mtd_device(ubi->mtd); in ubi_detach_mtd_dev()
1095 put_device(&ubi->dev); in ubi_detach_mtd_dev()