1f399d4a2SKyungmin Park /* 2f399d4a2SKyungmin Park * Copyright (c) International Business Machines Corp., 2006 3f399d4a2SKyungmin Park * Copyright (c) Nokia Corporation, 2007 4f399d4a2SKyungmin Park * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 6f399d4a2SKyungmin Park * 7f399d4a2SKyungmin Park * Author: Artem Bityutskiy (Битюцкий Артём), 8f399d4a2SKyungmin Park * Frank Haverkamp 9f399d4a2SKyungmin Park */ 10f399d4a2SKyungmin Park 11f399d4a2SKyungmin Park /* 12f399d4a2SKyungmin Park * This file includes UBI initialization and building of UBI devices. 13f399d4a2SKyungmin Park * 14f399d4a2SKyungmin Park * When UBI is initialized, it attaches all the MTD devices specified as the 15f399d4a2SKyungmin Park * module load parameters or the kernel boot parameters. If MTD devices were 16f399d4a2SKyungmin Park * specified, UBI does not attach any MTD device, but it is possible to do 17f399d4a2SKyungmin Park * later using the "UBI control device". 18f399d4a2SKyungmin Park */ 19f399d4a2SKyungmin Park 20ff94bc40SHeiko Schocher #ifndef __UBOOT__ 21f399d4a2SKyungmin Park #include <linux/module.h> 22f399d4a2SKyungmin Park #include <linux/moduleparam.h> 23f399d4a2SKyungmin Park #include <linux/stringify.h> 24ff94bc40SHeiko Schocher #include <linux/namei.h> 25f399d4a2SKyungmin Park #include <linux/stat.h> 26f399d4a2SKyungmin Park #include <linux/miscdevice.h> 27f399d4a2SKyungmin Park #include <linux/log2.h> 28f399d4a2SKyungmin Park #include <linux/kthread.h> 29ff94bc40SHeiko Schocher #include <linux/kernel.h> 30ff94bc40SHeiko Schocher #include <linux/slab.h> 31ff94bc40SHeiko Schocher #include <linux/major.h> 32ff94bc40SHeiko Schocher #else 33ff94bc40SHeiko Schocher #include <linux/compat.h> 34f399d4a2SKyungmin Park #endif 35ff94bc40SHeiko Schocher #include <linux/err.h> 36f399d4a2SKyungmin Park #include <ubi_uboot.h> 37ff94bc40SHeiko Schocher #include <linux/mtd/partitions.h> 38ff94bc40SHeiko Schocher 39f399d4a2SKyungmin Park #include "ubi.h" 40f399d4a2SKyungmin Park 41ff94bc40SHeiko Schocher /* Maximum length of the 'mtd=' parameter */ 42ff94bc40SHeiko Schocher #define MTD_PARAM_LEN_MAX 64 43ff94bc40SHeiko Schocher 44ff94bc40SHeiko Schocher /* Maximum number of comma-separated items in the 'mtd=' parameter */ 45ff94bc40SHeiko Schocher #define MTD_PARAM_MAX_COUNT 4 46ff94bc40SHeiko Schocher 47ff94bc40SHeiko Schocher /* Maximum value for the number of bad PEBs per 1024 PEBs */ 48ff94bc40SHeiko Schocher #define MAX_MTD_UBI_BEB_LIMIT 768 49ff94bc40SHeiko Schocher 50ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_MODULE 51ff94bc40SHeiko Schocher #define ubi_is_module() 1 52ff94bc40SHeiko Schocher #else 53ff94bc40SHeiko Schocher #define ubi_is_module() 0 54ff94bc40SHeiko Schocher #endif 55ff94bc40SHeiko Schocher 5660cfe87bSStefan Roese #if (CONFIG_SYS_MALLOC_LEN < (512 << 10)) 5760cfe87bSStefan Roese #error Malloc area too small for UBI, increase CONFIG_SYS_MALLOC_LEN to >= 512k 5860cfe87bSStefan Roese #endif 5960cfe87bSStefan Roese 60f399d4a2SKyungmin Park /** 61f399d4a2SKyungmin Park * struct mtd_dev_param - MTD device parameter description data structure. 62ff94bc40SHeiko Schocher * @name: MTD character device node path, MTD device name, or MTD device number 63ff94bc40SHeiko Schocher * string 64f399d4a2SKyungmin Park * @vid_hdr_offs: VID header offset 65ff94bc40SHeiko Schocher * @max_beb_per1024: maximum expected number of bad PEBs per 1024 PEBs 66f399d4a2SKyungmin Park */ 67ff94bc40SHeiko Schocher struct mtd_dev_param { 68f399d4a2SKyungmin Park char name[MTD_PARAM_LEN_MAX]; 69ff94bc40SHeiko Schocher int ubi_num; 70f399d4a2SKyungmin Park int vid_hdr_offs; 71ff94bc40SHeiko Schocher int max_beb_per1024; 72f399d4a2SKyungmin Park }; 73f399d4a2SKyungmin Park 74f399d4a2SKyungmin Park /* Numbers of elements set in the @mtd_dev_param array */ 75ff94bc40SHeiko Schocher static int __initdata mtd_devs; 76f399d4a2SKyungmin Park 77f399d4a2SKyungmin Park /* MTD devices specification parameters */ 78ff94bc40SHeiko Schocher static struct mtd_dev_param __initdata mtd_dev_param[UBI_MAX_DEVICES]; 79ff94bc40SHeiko Schocher #ifndef __UBOOT__ 80ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP 81ff94bc40SHeiko Schocher /* UBI module parameter to enable fastmap automatically on non-fastmap images */ 82ff94bc40SHeiko Schocher static bool fm_autoconvert; 83ff94bc40SHeiko Schocher #endif 84ff94bc40SHeiko Schocher #else 85ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP 86ff94bc40SHeiko Schocher #if !defined(CONFIG_MTD_UBI_FASTMAP_AUTOCONVERT) 87ff94bc40SHeiko Schocher #define CONFIG_MTD_UBI_FASTMAP_AUTOCONVERT 0 88ff94bc40SHeiko Schocher #endif 89ff94bc40SHeiko Schocher static bool fm_autoconvert = CONFIG_MTD_UBI_FASTMAP_AUTOCONVERT; 90ff94bc40SHeiko Schocher #endif 91ff94bc40SHeiko Schocher #endif 92f399d4a2SKyungmin Park /* Root UBI "class" object (corresponds to '/<sysfs>/class/ubi/') */ 93f399d4a2SKyungmin Park struct class *ubi_class; 94f399d4a2SKyungmin Park 95f399d4a2SKyungmin Park /* Slab cache for wear-leveling entries */ 96f399d4a2SKyungmin Park struct kmem_cache *ubi_wl_entry_slab; 97f399d4a2SKyungmin Park 98ff94bc40SHeiko Schocher #ifndef __UBOOT__ 99f399d4a2SKyungmin Park /* UBI control character device */ 100f399d4a2SKyungmin Park static struct miscdevice ubi_ctrl_cdev = { 101f399d4a2SKyungmin Park .minor = MISC_DYNAMIC_MINOR, 102f399d4a2SKyungmin Park .name = "ubi_ctrl", 103f399d4a2SKyungmin Park .fops = &ubi_ctrl_cdev_operations, 104f399d4a2SKyungmin Park }; 105f399d4a2SKyungmin Park #endif 106f399d4a2SKyungmin Park 107f399d4a2SKyungmin Park /* All UBI devices in system */ 108ff94bc40SHeiko Schocher #ifndef __UBOOT__ 109ff94bc40SHeiko Schocher static struct ubi_device *ubi_devices[UBI_MAX_DEVICES]; 110ff94bc40SHeiko Schocher #else 111f399d4a2SKyungmin Park struct ubi_device *ubi_devices[UBI_MAX_DEVICES]; 112ff94bc40SHeiko Schocher #endif 113f399d4a2SKyungmin Park 114ff94bc40SHeiko Schocher #ifndef __UBOOT__ 115f399d4a2SKyungmin Park /* Serializes UBI devices creations and removals */ 116f399d4a2SKyungmin Park DEFINE_MUTEX(ubi_devices_mutex); 117f399d4a2SKyungmin Park 118f399d4a2SKyungmin Park /* Protects @ubi_devices and @ubi->ref_count */ 119f399d4a2SKyungmin Park static DEFINE_SPINLOCK(ubi_devices_lock); 120f399d4a2SKyungmin Park 121f399d4a2SKyungmin Park /* "Show" method for files in '/<sysfs>/class/ubi/' */ 122ff94bc40SHeiko Schocher static ssize_t ubi_version_show(struct class *class, 123ff94bc40SHeiko Schocher struct class_attribute *attr, char *buf) 124f399d4a2SKyungmin Park { 125f399d4a2SKyungmin Park return sprintf(buf, "%d\n", UBI_VERSION); 126f399d4a2SKyungmin Park } 127f399d4a2SKyungmin Park 128f399d4a2SKyungmin Park /* UBI version attribute ('/<sysfs>/class/ubi/version') */ 129f399d4a2SKyungmin Park static struct class_attribute ubi_version = 130f399d4a2SKyungmin Park __ATTR(version, S_IRUGO, ubi_version_show, NULL); 131f399d4a2SKyungmin Park 132f399d4a2SKyungmin Park static ssize_t dev_attribute_show(struct device *dev, 133f399d4a2SKyungmin Park struct device_attribute *attr, char *buf); 134f399d4a2SKyungmin Park 135f399d4a2SKyungmin Park /* UBI device attributes (correspond to files in '/<sysfs>/class/ubi/ubiX') */ 136f399d4a2SKyungmin Park static struct device_attribute dev_eraseblock_size = 137f399d4a2SKyungmin Park __ATTR(eraseblock_size, S_IRUGO, dev_attribute_show, NULL); 138f399d4a2SKyungmin Park static struct device_attribute dev_avail_eraseblocks = 139f399d4a2SKyungmin Park __ATTR(avail_eraseblocks, S_IRUGO, dev_attribute_show, NULL); 140f399d4a2SKyungmin Park static struct device_attribute dev_total_eraseblocks = 141f399d4a2SKyungmin Park __ATTR(total_eraseblocks, S_IRUGO, dev_attribute_show, NULL); 142f399d4a2SKyungmin Park static struct device_attribute dev_volumes_count = 143f399d4a2SKyungmin Park __ATTR(volumes_count, S_IRUGO, dev_attribute_show, NULL); 144f399d4a2SKyungmin Park static struct device_attribute dev_max_ec = 145f399d4a2SKyungmin Park __ATTR(max_ec, S_IRUGO, dev_attribute_show, NULL); 146f399d4a2SKyungmin Park static struct device_attribute dev_reserved_for_bad = 147f399d4a2SKyungmin Park __ATTR(reserved_for_bad, S_IRUGO, dev_attribute_show, NULL); 148f399d4a2SKyungmin Park static struct device_attribute dev_bad_peb_count = 149f399d4a2SKyungmin Park __ATTR(bad_peb_count, S_IRUGO, dev_attribute_show, NULL); 150f399d4a2SKyungmin Park static struct device_attribute dev_max_vol_count = 151f399d4a2SKyungmin Park __ATTR(max_vol_count, S_IRUGO, dev_attribute_show, NULL); 152f399d4a2SKyungmin Park static struct device_attribute dev_min_io_size = 153f399d4a2SKyungmin Park __ATTR(min_io_size, S_IRUGO, dev_attribute_show, NULL); 154f399d4a2SKyungmin Park static struct device_attribute dev_bgt_enabled = 155f399d4a2SKyungmin Park __ATTR(bgt_enabled, S_IRUGO, dev_attribute_show, NULL); 156f399d4a2SKyungmin Park static struct device_attribute dev_mtd_num = 157f399d4a2SKyungmin Park __ATTR(mtd_num, S_IRUGO, dev_attribute_show, NULL); 158f399d4a2SKyungmin Park #endif 159f399d4a2SKyungmin Park 160f399d4a2SKyungmin Park /** 161ff94bc40SHeiko Schocher * ubi_volume_notify - send a volume change notification. 162ff94bc40SHeiko Schocher * @ubi: UBI device description object 163ff94bc40SHeiko Schocher * @vol: volume description object of the changed volume 164ff94bc40SHeiko Schocher * @ntype: notification type to send (%UBI_VOLUME_ADDED, etc) 165ff94bc40SHeiko Schocher * 166ff94bc40SHeiko Schocher * This is a helper function which notifies all subscribers about a volume 167ff94bc40SHeiko Schocher * change event (creation, removal, re-sizing, re-naming, updating). Returns 168ff94bc40SHeiko Schocher * zero in case of success and a negative error code in case of failure. 169ff94bc40SHeiko Schocher */ 170ff94bc40SHeiko Schocher int ubi_volume_notify(struct ubi_device *ubi, struct ubi_volume *vol, int ntype) 171ff94bc40SHeiko Schocher { 172ff94bc40SHeiko Schocher struct ubi_notification nt; 173ff94bc40SHeiko Schocher 174ff94bc40SHeiko Schocher ubi_do_get_device_info(ubi, &nt.di); 175ff94bc40SHeiko Schocher ubi_do_get_volume_info(ubi, vol, &nt.vi); 176ff94bc40SHeiko Schocher 177ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP 178ff94bc40SHeiko Schocher switch (ntype) { 179ff94bc40SHeiko Schocher case UBI_VOLUME_ADDED: 180ff94bc40SHeiko Schocher case UBI_VOLUME_REMOVED: 181ff94bc40SHeiko Schocher case UBI_VOLUME_RESIZED: 182ff94bc40SHeiko Schocher case UBI_VOLUME_RENAMED: 183ff94bc40SHeiko Schocher if (ubi_update_fastmap(ubi)) { 184ff94bc40SHeiko Schocher ubi_err("Unable to update fastmap!"); 185ff94bc40SHeiko Schocher ubi_ro_mode(ubi); 186ff94bc40SHeiko Schocher } 187ff94bc40SHeiko Schocher } 188ff94bc40SHeiko Schocher #endif 189ff94bc40SHeiko Schocher return blocking_notifier_call_chain(&ubi_notifiers, ntype, &nt); 190ff94bc40SHeiko Schocher } 191ff94bc40SHeiko Schocher 192ff94bc40SHeiko Schocher /** 193ff94bc40SHeiko Schocher * ubi_notify_all - send a notification to all volumes. 194ff94bc40SHeiko Schocher * @ubi: UBI device description object 195ff94bc40SHeiko Schocher * @ntype: notification type to send (%UBI_VOLUME_ADDED, etc) 196ff94bc40SHeiko Schocher * @nb: the notifier to call 197ff94bc40SHeiko Schocher * 198ff94bc40SHeiko Schocher * This function walks all volumes of UBI device @ubi and sends the @ntype 199ff94bc40SHeiko Schocher * notification for each volume. If @nb is %NULL, then all registered notifiers 200ff94bc40SHeiko Schocher * are called, otherwise only the @nb notifier is called. Returns the number of 201ff94bc40SHeiko Schocher * sent notifications. 202ff94bc40SHeiko Schocher */ 203ff94bc40SHeiko Schocher int ubi_notify_all(struct ubi_device *ubi, int ntype, struct notifier_block *nb) 204ff94bc40SHeiko Schocher { 205ff94bc40SHeiko Schocher struct ubi_notification nt; 206ff94bc40SHeiko Schocher int i, count = 0; 207ff94bc40SHeiko Schocher #ifndef __UBOOT__ 208ff94bc40SHeiko Schocher int ret; 209ff94bc40SHeiko Schocher #endif 210ff94bc40SHeiko Schocher 211ff94bc40SHeiko Schocher ubi_do_get_device_info(ubi, &nt.di); 212ff94bc40SHeiko Schocher 213ff94bc40SHeiko Schocher mutex_lock(&ubi->device_mutex); 214ff94bc40SHeiko Schocher for (i = 0; i < ubi->vtbl_slots; i++) { 215ff94bc40SHeiko Schocher /* 216ff94bc40SHeiko Schocher * Since the @ubi->device is locked, and we are not going to 217ff94bc40SHeiko Schocher * change @ubi->volumes, we do not have to lock 218ff94bc40SHeiko Schocher * @ubi->volumes_lock. 219ff94bc40SHeiko Schocher */ 220ff94bc40SHeiko Schocher if (!ubi->volumes[i]) 221ff94bc40SHeiko Schocher continue; 222ff94bc40SHeiko Schocher 223ff94bc40SHeiko Schocher ubi_do_get_volume_info(ubi, ubi->volumes[i], &nt.vi); 224ff94bc40SHeiko Schocher #ifndef __UBOOT__ 225ff94bc40SHeiko Schocher if (nb) 226ff94bc40SHeiko Schocher nb->notifier_call(nb, ntype, &nt); 227ff94bc40SHeiko Schocher else 228ff94bc40SHeiko Schocher ret = blocking_notifier_call_chain(&ubi_notifiers, ntype, 229ff94bc40SHeiko Schocher &nt); 230ff94bc40SHeiko Schocher #endif 231ff94bc40SHeiko Schocher count += 1; 232ff94bc40SHeiko Schocher } 233ff94bc40SHeiko Schocher mutex_unlock(&ubi->device_mutex); 234ff94bc40SHeiko Schocher 235ff94bc40SHeiko Schocher return count; 236ff94bc40SHeiko Schocher } 237ff94bc40SHeiko Schocher 238ff94bc40SHeiko Schocher /** 239ff94bc40SHeiko Schocher * ubi_enumerate_volumes - send "add" notification for all existing volumes. 240ff94bc40SHeiko Schocher * @nb: the notifier to call 241ff94bc40SHeiko Schocher * 242ff94bc40SHeiko Schocher * This function walks all UBI devices and volumes and sends the 243ff94bc40SHeiko Schocher * %UBI_VOLUME_ADDED notification for each volume. If @nb is %NULL, then all 244ff94bc40SHeiko Schocher * registered notifiers are called, otherwise only the @nb notifier is called. 245ff94bc40SHeiko Schocher * Returns the number of sent notifications. 246ff94bc40SHeiko Schocher */ 247ff94bc40SHeiko Schocher int ubi_enumerate_volumes(struct notifier_block *nb) 248ff94bc40SHeiko Schocher { 249ff94bc40SHeiko Schocher int i, count = 0; 250ff94bc40SHeiko Schocher 251ff94bc40SHeiko Schocher /* 252ff94bc40SHeiko Schocher * Since the @ubi_devices_mutex is locked, and we are not going to 253ff94bc40SHeiko Schocher * change @ubi_devices, we do not have to lock @ubi_devices_lock. 254ff94bc40SHeiko Schocher */ 255ff94bc40SHeiko Schocher for (i = 0; i < UBI_MAX_DEVICES; i++) { 256ff94bc40SHeiko Schocher struct ubi_device *ubi = ubi_devices[i]; 257ff94bc40SHeiko Schocher 258ff94bc40SHeiko Schocher if (!ubi) 259ff94bc40SHeiko Schocher continue; 260ff94bc40SHeiko Schocher count += ubi_notify_all(ubi, UBI_VOLUME_ADDED, nb); 261ff94bc40SHeiko Schocher } 262ff94bc40SHeiko Schocher 263ff94bc40SHeiko Schocher return count; 264ff94bc40SHeiko Schocher } 265ff94bc40SHeiko Schocher 266ff94bc40SHeiko Schocher /** 267f399d4a2SKyungmin Park * ubi_get_device - get UBI device. 268f399d4a2SKyungmin Park * @ubi_num: UBI device number 269f399d4a2SKyungmin Park * 270f399d4a2SKyungmin Park * This function returns UBI device description object for UBI device number 271f399d4a2SKyungmin Park * @ubi_num, or %NULL if the device does not exist. This function increases the 272f399d4a2SKyungmin Park * device reference count to prevent removal of the device. In other words, the 273f399d4a2SKyungmin Park * device cannot be removed if its reference count is not zero. 274f399d4a2SKyungmin Park */ 275f399d4a2SKyungmin Park struct ubi_device *ubi_get_device(int ubi_num) 276f399d4a2SKyungmin Park { 277f399d4a2SKyungmin Park struct ubi_device *ubi; 278f399d4a2SKyungmin Park 279f399d4a2SKyungmin Park spin_lock(&ubi_devices_lock); 280f399d4a2SKyungmin Park ubi = ubi_devices[ubi_num]; 281f399d4a2SKyungmin Park if (ubi) { 282f399d4a2SKyungmin Park ubi_assert(ubi->ref_count >= 0); 283f399d4a2SKyungmin Park ubi->ref_count += 1; 284f399d4a2SKyungmin Park get_device(&ubi->dev); 285f399d4a2SKyungmin Park } 286f399d4a2SKyungmin Park spin_unlock(&ubi_devices_lock); 287f399d4a2SKyungmin Park 288f399d4a2SKyungmin Park return ubi; 289f399d4a2SKyungmin Park } 290f399d4a2SKyungmin Park 291f399d4a2SKyungmin Park /** 292f399d4a2SKyungmin Park * ubi_put_device - drop an UBI device reference. 293f399d4a2SKyungmin Park * @ubi: UBI device description object 294f399d4a2SKyungmin Park */ 295f399d4a2SKyungmin Park void ubi_put_device(struct ubi_device *ubi) 296f399d4a2SKyungmin Park { 297f399d4a2SKyungmin Park spin_lock(&ubi_devices_lock); 298f399d4a2SKyungmin Park ubi->ref_count -= 1; 299f399d4a2SKyungmin Park put_device(&ubi->dev); 300f399d4a2SKyungmin Park spin_unlock(&ubi_devices_lock); 301f399d4a2SKyungmin Park } 302f399d4a2SKyungmin Park 303f399d4a2SKyungmin Park /** 304ff94bc40SHeiko Schocher * ubi_get_by_major - get UBI device by character device major number. 305f399d4a2SKyungmin Park * @major: major number 306f399d4a2SKyungmin Park * 307f399d4a2SKyungmin Park * This function is similar to 'ubi_get_device()', but it searches the device 308f399d4a2SKyungmin Park * by its major number. 309f399d4a2SKyungmin Park */ 310f399d4a2SKyungmin Park struct ubi_device *ubi_get_by_major(int major) 311f399d4a2SKyungmin Park { 312f399d4a2SKyungmin Park int i; 313f399d4a2SKyungmin Park struct ubi_device *ubi; 314f399d4a2SKyungmin Park 315f399d4a2SKyungmin Park spin_lock(&ubi_devices_lock); 316f399d4a2SKyungmin Park for (i = 0; i < UBI_MAX_DEVICES; i++) { 317f399d4a2SKyungmin Park ubi = ubi_devices[i]; 318f399d4a2SKyungmin Park if (ubi && MAJOR(ubi->cdev.dev) == major) { 319f399d4a2SKyungmin Park ubi_assert(ubi->ref_count >= 0); 320f399d4a2SKyungmin Park ubi->ref_count += 1; 321f399d4a2SKyungmin Park get_device(&ubi->dev); 322f399d4a2SKyungmin Park spin_unlock(&ubi_devices_lock); 323f399d4a2SKyungmin Park return ubi; 324f399d4a2SKyungmin Park } 325f399d4a2SKyungmin Park } 326f399d4a2SKyungmin Park spin_unlock(&ubi_devices_lock); 327f399d4a2SKyungmin Park 328f399d4a2SKyungmin Park return NULL; 329f399d4a2SKyungmin Park } 330f399d4a2SKyungmin Park 331f399d4a2SKyungmin Park /** 332f399d4a2SKyungmin Park * ubi_major2num - get UBI device number by character device major number. 333f399d4a2SKyungmin Park * @major: major number 334f399d4a2SKyungmin Park * 335f399d4a2SKyungmin Park * This function searches UBI device number object by its major number. If UBI 336f399d4a2SKyungmin Park * device was not found, this function returns -ENODEV, otherwise the UBI device 337f399d4a2SKyungmin Park * number is returned. 338f399d4a2SKyungmin Park */ 339f399d4a2SKyungmin Park int ubi_major2num(int major) 340f399d4a2SKyungmin Park { 341f399d4a2SKyungmin Park int i, ubi_num = -ENODEV; 342f399d4a2SKyungmin Park 343f399d4a2SKyungmin Park spin_lock(&ubi_devices_lock); 344f399d4a2SKyungmin Park for (i = 0; i < UBI_MAX_DEVICES; i++) { 345f399d4a2SKyungmin Park struct ubi_device *ubi = ubi_devices[i]; 346f399d4a2SKyungmin Park 347f399d4a2SKyungmin Park if (ubi && MAJOR(ubi->cdev.dev) == major) { 348f399d4a2SKyungmin Park ubi_num = ubi->ubi_num; 349f399d4a2SKyungmin Park break; 350f399d4a2SKyungmin Park } 351f399d4a2SKyungmin Park } 352f399d4a2SKyungmin Park spin_unlock(&ubi_devices_lock); 353f399d4a2SKyungmin Park 354f399d4a2SKyungmin Park return ubi_num; 355f399d4a2SKyungmin Park } 356f399d4a2SKyungmin Park 357ff94bc40SHeiko Schocher #ifndef __UBOOT__ 358f399d4a2SKyungmin Park /* "Show" method for files in '/<sysfs>/class/ubi/ubiX/' */ 359f399d4a2SKyungmin Park static ssize_t dev_attribute_show(struct device *dev, 360f399d4a2SKyungmin Park struct device_attribute *attr, char *buf) 361f399d4a2SKyungmin Park { 362f399d4a2SKyungmin Park ssize_t ret; 363f399d4a2SKyungmin Park struct ubi_device *ubi; 364f399d4a2SKyungmin Park 365f399d4a2SKyungmin Park /* 366f399d4a2SKyungmin Park * The below code looks weird, but it actually makes sense. We get the 367f399d4a2SKyungmin Park * UBI device reference from the contained 'struct ubi_device'. But it 368f399d4a2SKyungmin Park * is unclear if the device was removed or not yet. Indeed, if the 369f399d4a2SKyungmin Park * device was removed before we increased its reference count, 370f399d4a2SKyungmin Park * 'ubi_get_device()' will return -ENODEV and we fail. 371f399d4a2SKyungmin Park * 372f399d4a2SKyungmin Park * Remember, 'struct ubi_device' is freed in the release function, so 373f399d4a2SKyungmin Park * we still can use 'ubi->ubi_num'. 374f399d4a2SKyungmin Park */ 375f399d4a2SKyungmin Park ubi = container_of(dev, struct ubi_device, dev); 376f399d4a2SKyungmin Park ubi = ubi_get_device(ubi->ubi_num); 377f399d4a2SKyungmin Park if (!ubi) 378f399d4a2SKyungmin Park return -ENODEV; 379f399d4a2SKyungmin Park 380f399d4a2SKyungmin Park if (attr == &dev_eraseblock_size) 381f399d4a2SKyungmin Park ret = sprintf(buf, "%d\n", ubi->leb_size); 382f399d4a2SKyungmin Park else if (attr == &dev_avail_eraseblocks) 383f399d4a2SKyungmin Park ret = sprintf(buf, "%d\n", ubi->avail_pebs); 384f399d4a2SKyungmin Park else if (attr == &dev_total_eraseblocks) 385f399d4a2SKyungmin Park ret = sprintf(buf, "%d\n", ubi->good_peb_count); 386f399d4a2SKyungmin Park else if (attr == &dev_volumes_count) 387f399d4a2SKyungmin Park ret = sprintf(buf, "%d\n", ubi->vol_count - UBI_INT_VOL_COUNT); 388f399d4a2SKyungmin Park else if (attr == &dev_max_ec) 389f399d4a2SKyungmin Park ret = sprintf(buf, "%d\n", ubi->max_ec); 390f399d4a2SKyungmin Park else if (attr == &dev_reserved_for_bad) 391f399d4a2SKyungmin Park ret = sprintf(buf, "%d\n", ubi->beb_rsvd_pebs); 392f399d4a2SKyungmin Park else if (attr == &dev_bad_peb_count) 393f399d4a2SKyungmin Park ret = sprintf(buf, "%d\n", ubi->bad_peb_count); 394f399d4a2SKyungmin Park else if (attr == &dev_max_vol_count) 395f399d4a2SKyungmin Park ret = sprintf(buf, "%d\n", ubi->vtbl_slots); 396f399d4a2SKyungmin Park else if (attr == &dev_min_io_size) 397f399d4a2SKyungmin Park ret = sprintf(buf, "%d\n", ubi->min_io_size); 398f399d4a2SKyungmin Park else if (attr == &dev_bgt_enabled) 399f399d4a2SKyungmin Park ret = sprintf(buf, "%d\n", ubi->thread_enabled); 400f399d4a2SKyungmin Park else if (attr == &dev_mtd_num) 401f399d4a2SKyungmin Park ret = sprintf(buf, "%d\n", ubi->mtd->index); 402f399d4a2SKyungmin Park else 403f399d4a2SKyungmin Park ret = -EINVAL; 404f399d4a2SKyungmin Park 405f399d4a2SKyungmin Park ubi_put_device(ubi); 406f399d4a2SKyungmin Park return ret; 407f399d4a2SKyungmin Park } 408f399d4a2SKyungmin Park 409ff94bc40SHeiko Schocher static void dev_release(struct device *dev) 410ff94bc40SHeiko Schocher { 411ff94bc40SHeiko Schocher struct ubi_device *ubi = container_of(dev, struct ubi_device, dev); 412ff94bc40SHeiko Schocher 413ff94bc40SHeiko Schocher kfree(ubi); 414ff94bc40SHeiko Schocher } 415f399d4a2SKyungmin Park 416f399d4a2SKyungmin Park /** 417f399d4a2SKyungmin Park * ubi_sysfs_init - initialize sysfs for an UBI device. 418f399d4a2SKyungmin Park * @ubi: UBI device description object 419ff94bc40SHeiko Schocher * @ref: set to %1 on exit in case of failure if a reference to @ubi->dev was 420ff94bc40SHeiko Schocher * taken 421f399d4a2SKyungmin Park * 422f399d4a2SKyungmin Park * This function returns zero in case of success and a negative error code in 423f399d4a2SKyungmin Park * case of failure. 424f399d4a2SKyungmin Park */ 425ff94bc40SHeiko Schocher static int ubi_sysfs_init(struct ubi_device *ubi, int *ref) 426f399d4a2SKyungmin Park { 427f399d4a2SKyungmin Park int err; 428f399d4a2SKyungmin Park 429f399d4a2SKyungmin Park ubi->dev.release = dev_release; 430f399d4a2SKyungmin Park ubi->dev.devt = ubi->cdev.dev; 431f399d4a2SKyungmin Park ubi->dev.class = ubi_class; 432ff94bc40SHeiko Schocher dev_set_name(&ubi->dev, UBI_NAME_STR"%d", ubi->ubi_num); 433f399d4a2SKyungmin Park err = device_register(&ubi->dev); 434f399d4a2SKyungmin Park if (err) 435f399d4a2SKyungmin Park return err; 436f399d4a2SKyungmin Park 437ff94bc40SHeiko Schocher *ref = 1; 438f399d4a2SKyungmin Park err = device_create_file(&ubi->dev, &dev_eraseblock_size); 439f399d4a2SKyungmin Park if (err) 440f399d4a2SKyungmin Park return err; 441f399d4a2SKyungmin Park err = device_create_file(&ubi->dev, &dev_avail_eraseblocks); 442f399d4a2SKyungmin Park if (err) 443f399d4a2SKyungmin Park return err; 444f399d4a2SKyungmin Park err = device_create_file(&ubi->dev, &dev_total_eraseblocks); 445f399d4a2SKyungmin Park if (err) 446f399d4a2SKyungmin Park return err; 447f399d4a2SKyungmin Park err = device_create_file(&ubi->dev, &dev_volumes_count); 448f399d4a2SKyungmin Park if (err) 449f399d4a2SKyungmin Park return err; 450f399d4a2SKyungmin Park err = device_create_file(&ubi->dev, &dev_max_ec); 451f399d4a2SKyungmin Park if (err) 452f399d4a2SKyungmin Park return err; 453f399d4a2SKyungmin Park err = device_create_file(&ubi->dev, &dev_reserved_for_bad); 454f399d4a2SKyungmin Park if (err) 455f399d4a2SKyungmin Park return err; 456f399d4a2SKyungmin Park err = device_create_file(&ubi->dev, &dev_bad_peb_count); 457f399d4a2SKyungmin Park if (err) 458f399d4a2SKyungmin Park return err; 459f399d4a2SKyungmin Park err = device_create_file(&ubi->dev, &dev_max_vol_count); 460f399d4a2SKyungmin Park if (err) 461f399d4a2SKyungmin Park return err; 462f399d4a2SKyungmin Park err = device_create_file(&ubi->dev, &dev_min_io_size); 463f399d4a2SKyungmin Park if (err) 464f399d4a2SKyungmin Park return err; 465f399d4a2SKyungmin Park err = device_create_file(&ubi->dev, &dev_bgt_enabled); 466f399d4a2SKyungmin Park if (err) 467f399d4a2SKyungmin Park return err; 468f399d4a2SKyungmin Park err = device_create_file(&ubi->dev, &dev_mtd_num); 469f399d4a2SKyungmin Park return err; 470f399d4a2SKyungmin Park } 471f399d4a2SKyungmin Park 472f399d4a2SKyungmin Park /** 473f399d4a2SKyungmin Park * ubi_sysfs_close - close sysfs for an UBI device. 474f399d4a2SKyungmin Park * @ubi: UBI device description object 475f399d4a2SKyungmin Park */ 476f399d4a2SKyungmin Park static void ubi_sysfs_close(struct ubi_device *ubi) 477f399d4a2SKyungmin Park { 478f399d4a2SKyungmin Park device_remove_file(&ubi->dev, &dev_mtd_num); 479f399d4a2SKyungmin Park device_remove_file(&ubi->dev, &dev_bgt_enabled); 480f399d4a2SKyungmin Park device_remove_file(&ubi->dev, &dev_min_io_size); 481f399d4a2SKyungmin Park device_remove_file(&ubi->dev, &dev_max_vol_count); 482f399d4a2SKyungmin Park device_remove_file(&ubi->dev, &dev_bad_peb_count); 483f399d4a2SKyungmin Park device_remove_file(&ubi->dev, &dev_reserved_for_bad); 484f399d4a2SKyungmin Park device_remove_file(&ubi->dev, &dev_max_ec); 485f399d4a2SKyungmin Park device_remove_file(&ubi->dev, &dev_volumes_count); 486f399d4a2SKyungmin Park device_remove_file(&ubi->dev, &dev_total_eraseblocks); 487f399d4a2SKyungmin Park device_remove_file(&ubi->dev, &dev_avail_eraseblocks); 488f399d4a2SKyungmin Park device_remove_file(&ubi->dev, &dev_eraseblock_size); 489f399d4a2SKyungmin Park device_unregister(&ubi->dev); 490f399d4a2SKyungmin Park } 491f399d4a2SKyungmin Park #endif 492f399d4a2SKyungmin Park 493f399d4a2SKyungmin Park /** 494ff94bc40SHeiko Schocher * kill_volumes - destroy all user volumes. 495f399d4a2SKyungmin Park * @ubi: UBI device description object 496f399d4a2SKyungmin Park */ 497f399d4a2SKyungmin Park static void kill_volumes(struct ubi_device *ubi) 498f399d4a2SKyungmin Park { 499f399d4a2SKyungmin Park int i; 500f399d4a2SKyungmin Park 501f399d4a2SKyungmin Park for (i = 0; i < ubi->vtbl_slots; i++) 502f399d4a2SKyungmin Park if (ubi->volumes[i]) 503f399d4a2SKyungmin Park ubi_free_volume(ubi, ubi->volumes[i]); 504f399d4a2SKyungmin Park } 505f399d4a2SKyungmin Park 506f399d4a2SKyungmin Park /** 507f399d4a2SKyungmin Park * uif_init - initialize user interfaces for an UBI device. 508f399d4a2SKyungmin Park * @ubi: UBI device description object 509ff94bc40SHeiko Schocher * @ref: set to %1 on exit in case of failure if a reference to @ubi->dev was 510ff94bc40SHeiko Schocher * taken, otherwise set to %0 511ff94bc40SHeiko Schocher * 512ff94bc40SHeiko Schocher * This function initializes various user interfaces for an UBI device. If the 513ff94bc40SHeiko Schocher * initialization fails at an early stage, this function frees all the 514ff94bc40SHeiko Schocher * resources it allocated, returns an error, and @ref is set to %0. However, 515ff94bc40SHeiko Schocher * if the initialization fails after the UBI device was registered in the 516ff94bc40SHeiko Schocher * driver core subsystem, this function takes a reference to @ubi->dev, because 517ff94bc40SHeiko Schocher * otherwise the release function ('dev_release()') would free whole @ubi 518ff94bc40SHeiko Schocher * object. The @ref argument is set to %1 in this case. The caller has to put 519ff94bc40SHeiko Schocher * this reference. 520f399d4a2SKyungmin Park * 521f399d4a2SKyungmin Park * This function returns zero in case of success and a negative error code in 522f399d4a2SKyungmin Park * case of failure. 523f399d4a2SKyungmin Park */ 524ff94bc40SHeiko Schocher static int uif_init(struct ubi_device *ubi, int *ref) 525f399d4a2SKyungmin Park { 526f399d4a2SKyungmin Park int i, err; 527ff94bc40SHeiko Schocher #ifndef __UBOOT__ 528f399d4a2SKyungmin Park dev_t dev; 529f399d4a2SKyungmin Park #endif 530f399d4a2SKyungmin Park 531ff94bc40SHeiko Schocher *ref = 0; 532f399d4a2SKyungmin Park sprintf(ubi->ubi_name, UBI_NAME_STR "%d", ubi->ubi_num); 533f399d4a2SKyungmin Park 534f399d4a2SKyungmin Park /* 535f399d4a2SKyungmin Park * Major numbers for the UBI character devices are allocated 536f399d4a2SKyungmin Park * dynamically. Major numbers of volume character devices are 537f399d4a2SKyungmin Park * equivalent to ones of the corresponding UBI character device. Minor 538f399d4a2SKyungmin Park * numbers of UBI character devices are 0, while minor numbers of 539f399d4a2SKyungmin Park * volume character devices start from 1. Thus, we allocate one major 540f399d4a2SKyungmin Park * number and ubi->vtbl_slots + 1 minor numbers. 541f399d4a2SKyungmin Park */ 542f399d4a2SKyungmin Park err = alloc_chrdev_region(&dev, 0, ubi->vtbl_slots + 1, ubi->ubi_name); 543f399d4a2SKyungmin Park if (err) { 544f399d4a2SKyungmin Park ubi_err("cannot register UBI character devices"); 545f399d4a2SKyungmin Park return err; 546f399d4a2SKyungmin Park } 547f399d4a2SKyungmin Park 548f399d4a2SKyungmin Park ubi_assert(MINOR(dev) == 0); 549f399d4a2SKyungmin Park cdev_init(&ubi->cdev, &ubi_cdev_operations); 550ff94bc40SHeiko Schocher dbg_gen("%s major is %u", ubi->ubi_name, MAJOR(dev)); 551f399d4a2SKyungmin Park ubi->cdev.owner = THIS_MODULE; 552f399d4a2SKyungmin Park 553f399d4a2SKyungmin Park err = cdev_add(&ubi->cdev, dev, 1); 554f399d4a2SKyungmin Park if (err) { 555f399d4a2SKyungmin Park ubi_err("cannot add character device"); 556f399d4a2SKyungmin Park goto out_unreg; 557f399d4a2SKyungmin Park } 558f399d4a2SKyungmin Park 559ff94bc40SHeiko Schocher err = ubi_sysfs_init(ubi, ref); 560f399d4a2SKyungmin Park if (err) 561f399d4a2SKyungmin Park goto out_sysfs; 562f399d4a2SKyungmin Park 563f399d4a2SKyungmin Park for (i = 0; i < ubi->vtbl_slots; i++) 564f399d4a2SKyungmin Park if (ubi->volumes[i]) { 565f399d4a2SKyungmin Park err = ubi_add_volume(ubi, ubi->volumes[i]); 566f399d4a2SKyungmin Park if (err) { 567f399d4a2SKyungmin Park ubi_err("cannot add volume %d", i); 568f399d4a2SKyungmin Park goto out_volumes; 569f399d4a2SKyungmin Park } 570f399d4a2SKyungmin Park } 571f399d4a2SKyungmin Park 572f399d4a2SKyungmin Park return 0; 573f399d4a2SKyungmin Park 574f399d4a2SKyungmin Park out_volumes: 575f399d4a2SKyungmin Park kill_volumes(ubi); 576f399d4a2SKyungmin Park out_sysfs: 577ff94bc40SHeiko Schocher if (*ref) 578ff94bc40SHeiko Schocher get_device(&ubi->dev); 579f399d4a2SKyungmin Park ubi_sysfs_close(ubi); 580f399d4a2SKyungmin Park cdev_del(&ubi->cdev); 581f399d4a2SKyungmin Park out_unreg: 582f399d4a2SKyungmin Park unregister_chrdev_region(ubi->cdev.dev, ubi->vtbl_slots + 1); 583f399d4a2SKyungmin Park ubi_err("cannot initialize UBI %s, error %d", ubi->ubi_name, err); 584f399d4a2SKyungmin Park return err; 585f399d4a2SKyungmin Park } 586f399d4a2SKyungmin Park 587f399d4a2SKyungmin Park /** 588f399d4a2SKyungmin Park * uif_close - close user interfaces for an UBI device. 589f399d4a2SKyungmin Park * @ubi: UBI device description object 590ff94bc40SHeiko Schocher * 591ff94bc40SHeiko Schocher * Note, since this function un-registers UBI volume device objects (@vol->dev), 592ff94bc40SHeiko Schocher * the memory allocated voe the volumes is freed as well (in the release 593ff94bc40SHeiko Schocher * function). 594f399d4a2SKyungmin Park */ 595f399d4a2SKyungmin Park static void uif_close(struct ubi_device *ubi) 596f399d4a2SKyungmin Park { 597f399d4a2SKyungmin Park kill_volumes(ubi); 598f399d4a2SKyungmin Park ubi_sysfs_close(ubi); 599f399d4a2SKyungmin Park cdev_del(&ubi->cdev); 600f399d4a2SKyungmin Park unregister_chrdev_region(ubi->cdev.dev, ubi->vtbl_slots + 1); 601f399d4a2SKyungmin Park } 602f399d4a2SKyungmin Park 603f399d4a2SKyungmin Park /** 604ff94bc40SHeiko Schocher * ubi_free_internal_volumes - free internal volumes. 605ff94bc40SHeiko Schocher * @ubi: UBI device description object 606f399d4a2SKyungmin Park */ 607ff94bc40SHeiko Schocher void ubi_free_internal_volumes(struct ubi_device *ubi) 608f399d4a2SKyungmin Park { 609ff94bc40SHeiko Schocher int i; 610f399d4a2SKyungmin Park 611ff94bc40SHeiko Schocher for (i = ubi->vtbl_slots; 612ff94bc40SHeiko Schocher i < ubi->vtbl_slots + UBI_INT_VOL_COUNT; i++) { 613ff94bc40SHeiko Schocher kfree(ubi->volumes[i]->eba_tbl); 614ff94bc40SHeiko Schocher kfree(ubi->volumes[i]); 615ff94bc40SHeiko Schocher } 616ff94bc40SHeiko Schocher } 617f399d4a2SKyungmin Park 618ff94bc40SHeiko Schocher static int get_bad_peb_limit(const struct ubi_device *ubi, int max_beb_per1024) 619ff94bc40SHeiko Schocher { 620ff94bc40SHeiko Schocher int limit, device_pebs; 621ff94bc40SHeiko Schocher uint64_t device_size; 622f399d4a2SKyungmin Park 623ff94bc40SHeiko Schocher if (!max_beb_per1024) 624f399d4a2SKyungmin Park return 0; 625f399d4a2SKyungmin Park 626ff94bc40SHeiko Schocher /* 627ff94bc40SHeiko Schocher * Here we are using size of the entire flash chip and 628ff94bc40SHeiko Schocher * not just the MTD partition size because the maximum 629ff94bc40SHeiko Schocher * number of bad eraseblocks is a percentage of the 630ff94bc40SHeiko Schocher * whole device and bad eraseblocks are not fairly 631ff94bc40SHeiko Schocher * distributed over the flash chip. So the worst case 632ff94bc40SHeiko Schocher * is that all the bad eraseblocks of the chip are in 633ff94bc40SHeiko Schocher * the MTD partition we are attaching (ubi->mtd). 634ff94bc40SHeiko Schocher */ 635ff94bc40SHeiko Schocher device_size = mtd_get_device_size(ubi->mtd); 636ff94bc40SHeiko Schocher device_pebs = mtd_div_by_eb(device_size, ubi->mtd); 637ff94bc40SHeiko Schocher limit = mult_frac(device_pebs, max_beb_per1024, 1024); 638ff94bc40SHeiko Schocher 639ff94bc40SHeiko Schocher /* Round it up */ 640ff94bc40SHeiko Schocher if (mult_frac(limit, 1024, max_beb_per1024) < device_pebs) 641ff94bc40SHeiko Schocher limit += 1; 642ff94bc40SHeiko Schocher 643ff94bc40SHeiko Schocher return limit; 644f399d4a2SKyungmin Park } 645f399d4a2SKyungmin Park 646f399d4a2SKyungmin Park /** 647ff94bc40SHeiko Schocher * io_init - initialize I/O sub-system for a given UBI device. 648f399d4a2SKyungmin Park * @ubi: UBI device description object 649ff94bc40SHeiko Schocher * @max_beb_per1024: maximum expected number of bad PEB per 1024 PEBs 650f399d4a2SKyungmin Park * 651f399d4a2SKyungmin Park * If @ubi->vid_hdr_offset or @ubi->leb_start is zero, default offsets are 652f399d4a2SKyungmin Park * assumed: 653f399d4a2SKyungmin Park * o EC header is always at offset zero - this cannot be changed; 654f399d4a2SKyungmin Park * o VID header starts just after the EC header at the closest address 655f399d4a2SKyungmin Park * aligned to @io->hdrs_min_io_size; 656f399d4a2SKyungmin Park * o data starts just after the VID header at the closest address aligned to 657f399d4a2SKyungmin Park * @io->min_io_size 658f399d4a2SKyungmin Park * 659f399d4a2SKyungmin Park * This function returns zero in case of success and a negative error code in 660f399d4a2SKyungmin Park * case of failure. 661f399d4a2SKyungmin Park */ 662ff94bc40SHeiko Schocher static int io_init(struct ubi_device *ubi, int max_beb_per1024) 663f399d4a2SKyungmin Park { 664ff94bc40SHeiko Schocher dbg_gen("sizeof(struct ubi_ainf_peb) %zu", sizeof(struct ubi_ainf_peb)); 665ff94bc40SHeiko Schocher dbg_gen("sizeof(struct ubi_wl_entry) %zu", sizeof(struct ubi_wl_entry)); 666ff94bc40SHeiko Schocher 667f399d4a2SKyungmin Park if (ubi->mtd->numeraseregions != 0) { 668f399d4a2SKyungmin Park /* 669f399d4a2SKyungmin Park * Some flashes have several erase regions. Different regions 670f399d4a2SKyungmin Park * may have different eraseblock size and other 671f399d4a2SKyungmin Park * characteristics. It looks like mostly multi-region flashes 672f399d4a2SKyungmin Park * have one "main" region and one or more small regions to 673f399d4a2SKyungmin Park * store boot loader code or boot parameters or whatever. I 674f399d4a2SKyungmin Park * guess we should just pick the largest region. But this is 675f399d4a2SKyungmin Park * not implemented. 676f399d4a2SKyungmin Park */ 677f399d4a2SKyungmin Park ubi_err("multiple regions, not implemented"); 678f399d4a2SKyungmin Park return -EINVAL; 679f399d4a2SKyungmin Park } 680f399d4a2SKyungmin Park 681f399d4a2SKyungmin Park if (ubi->vid_hdr_offset < 0) 682f399d4a2SKyungmin Park return -EINVAL; 683f399d4a2SKyungmin Park 684f399d4a2SKyungmin Park /* 685f399d4a2SKyungmin Park * Note, in this implementation we support MTD devices with 0x7FFFFFFF 686f399d4a2SKyungmin Park * physical eraseblocks maximum. 687f399d4a2SKyungmin Park */ 688f399d4a2SKyungmin Park 689f399d4a2SKyungmin Park ubi->peb_size = ubi->mtd->erasesize; 690d318d0c4SStefan Roese ubi->peb_count = mtd_div_by_eb(ubi->mtd->size, ubi->mtd); 691f399d4a2SKyungmin Park ubi->flash_size = ubi->mtd->size; 692f399d4a2SKyungmin Park 693ff94bc40SHeiko Schocher if (mtd_can_have_bb(ubi->mtd)) { 694f399d4a2SKyungmin Park ubi->bad_allowed = 1; 695ff94bc40SHeiko Schocher ubi->bad_peb_limit = get_bad_peb_limit(ubi, max_beb_per1024); 696ff94bc40SHeiko Schocher } 697ff94bc40SHeiko Schocher 698ff94bc40SHeiko Schocher if (ubi->mtd->type == MTD_NORFLASH) { 699ff94bc40SHeiko Schocher ubi_assert(ubi->mtd->writesize == 1); 700ff94bc40SHeiko Schocher ubi->nor_flash = 1; 701ff94bc40SHeiko Schocher } 702f399d4a2SKyungmin Park 703f399d4a2SKyungmin Park ubi->min_io_size = ubi->mtd->writesize; 704f399d4a2SKyungmin Park ubi->hdrs_min_io_size = ubi->mtd->writesize >> ubi->mtd->subpage_sft; 705f399d4a2SKyungmin Park 706f399d4a2SKyungmin Park /* 707f399d4a2SKyungmin Park * Make sure minimal I/O unit is power of 2. Note, there is no 708f399d4a2SKyungmin Park * fundamental reason for this assumption. It is just an optimization 709f399d4a2SKyungmin Park * which allows us to avoid costly division operations. 710f399d4a2SKyungmin Park */ 711f399d4a2SKyungmin Park if (!is_power_of_2(ubi->min_io_size)) { 712f399d4a2SKyungmin Park ubi_err("min. I/O unit (%d) is not power of 2", 713f399d4a2SKyungmin Park ubi->min_io_size); 714f399d4a2SKyungmin Park return -EINVAL; 715f399d4a2SKyungmin Park } 716f399d4a2SKyungmin Park 717f399d4a2SKyungmin Park ubi_assert(ubi->hdrs_min_io_size > 0); 718f399d4a2SKyungmin Park ubi_assert(ubi->hdrs_min_io_size <= ubi->min_io_size); 719f399d4a2SKyungmin Park ubi_assert(ubi->min_io_size % ubi->hdrs_min_io_size == 0); 720f399d4a2SKyungmin Park 721ff94bc40SHeiko Schocher ubi->max_write_size = ubi->mtd->writebufsize; 722ff94bc40SHeiko Schocher /* 723ff94bc40SHeiko Schocher * Maximum write size has to be greater or equivalent to min. I/O 724ff94bc40SHeiko Schocher * size, and be multiple of min. I/O size. 725ff94bc40SHeiko Schocher */ 726ff94bc40SHeiko Schocher if (ubi->max_write_size < ubi->min_io_size || 727ff94bc40SHeiko Schocher ubi->max_write_size % ubi->min_io_size || 728ff94bc40SHeiko Schocher !is_power_of_2(ubi->max_write_size)) { 729ff94bc40SHeiko Schocher ubi_err("bad write buffer size %d for %d min. I/O unit", 730ff94bc40SHeiko Schocher ubi->max_write_size, ubi->min_io_size); 731ff94bc40SHeiko Schocher return -EINVAL; 732ff94bc40SHeiko Schocher } 733ff94bc40SHeiko Schocher 734f399d4a2SKyungmin Park /* Calculate default aligned sizes of EC and VID headers */ 735f399d4a2SKyungmin Park ubi->ec_hdr_alsize = ALIGN(UBI_EC_HDR_SIZE, ubi->hdrs_min_io_size); 736f399d4a2SKyungmin Park ubi->vid_hdr_alsize = ALIGN(UBI_VID_HDR_SIZE, ubi->hdrs_min_io_size); 737f399d4a2SKyungmin Park 738ff94bc40SHeiko Schocher dbg_gen("min_io_size %d", ubi->min_io_size); 739ff94bc40SHeiko Schocher dbg_gen("max_write_size %d", ubi->max_write_size); 740ff94bc40SHeiko Schocher dbg_gen("hdrs_min_io_size %d", ubi->hdrs_min_io_size); 741ff94bc40SHeiko Schocher dbg_gen("ec_hdr_alsize %d", ubi->ec_hdr_alsize); 742ff94bc40SHeiko Schocher dbg_gen("vid_hdr_alsize %d", ubi->vid_hdr_alsize); 743f399d4a2SKyungmin Park 744f399d4a2SKyungmin Park if (ubi->vid_hdr_offset == 0) 745f399d4a2SKyungmin Park /* Default offset */ 746f399d4a2SKyungmin Park ubi->vid_hdr_offset = ubi->vid_hdr_aloffset = 747f399d4a2SKyungmin Park ubi->ec_hdr_alsize; 748f399d4a2SKyungmin Park else { 749f399d4a2SKyungmin Park ubi->vid_hdr_aloffset = ubi->vid_hdr_offset & 750f399d4a2SKyungmin Park ~(ubi->hdrs_min_io_size - 1); 751f399d4a2SKyungmin Park ubi->vid_hdr_shift = ubi->vid_hdr_offset - 752f399d4a2SKyungmin Park ubi->vid_hdr_aloffset; 753f399d4a2SKyungmin Park } 754f399d4a2SKyungmin Park 755f399d4a2SKyungmin Park /* Similar for the data offset */ 756ff94bc40SHeiko Schocher ubi->leb_start = ubi->vid_hdr_offset + UBI_VID_HDR_SIZE; 757f399d4a2SKyungmin Park ubi->leb_start = ALIGN(ubi->leb_start, ubi->min_io_size); 758f399d4a2SKyungmin Park 759ff94bc40SHeiko Schocher dbg_gen("vid_hdr_offset %d", ubi->vid_hdr_offset); 760ff94bc40SHeiko Schocher dbg_gen("vid_hdr_aloffset %d", ubi->vid_hdr_aloffset); 761ff94bc40SHeiko Schocher dbg_gen("vid_hdr_shift %d", ubi->vid_hdr_shift); 762ff94bc40SHeiko Schocher dbg_gen("leb_start %d", ubi->leb_start); 763f399d4a2SKyungmin Park 764f399d4a2SKyungmin Park /* The shift must be aligned to 32-bit boundary */ 765f399d4a2SKyungmin Park if (ubi->vid_hdr_shift % 4) { 766f399d4a2SKyungmin Park ubi_err("unaligned VID header shift %d", 767f399d4a2SKyungmin Park ubi->vid_hdr_shift); 768f399d4a2SKyungmin Park return -EINVAL; 769f399d4a2SKyungmin Park } 770f399d4a2SKyungmin Park 771f399d4a2SKyungmin Park /* Check sanity */ 772f399d4a2SKyungmin Park if (ubi->vid_hdr_offset < UBI_EC_HDR_SIZE || 773f399d4a2SKyungmin Park ubi->leb_start < ubi->vid_hdr_offset + UBI_VID_HDR_SIZE || 774f399d4a2SKyungmin Park ubi->leb_start > ubi->peb_size - UBI_VID_HDR_SIZE || 775f399d4a2SKyungmin Park ubi->leb_start & (ubi->min_io_size - 1)) { 776f399d4a2SKyungmin Park ubi_err("bad VID header (%d) or data offsets (%d)", 777f399d4a2SKyungmin Park ubi->vid_hdr_offset, ubi->leb_start); 778f399d4a2SKyungmin Park return -EINVAL; 779f399d4a2SKyungmin Park } 780f399d4a2SKyungmin Park 781f399d4a2SKyungmin Park /* 782ff94bc40SHeiko Schocher * Set maximum amount of physical erroneous eraseblocks to be 10%. 783ff94bc40SHeiko Schocher * Erroneous PEB are those which have read errors. 784ff94bc40SHeiko Schocher */ 785ff94bc40SHeiko Schocher ubi->max_erroneous = ubi->peb_count / 10; 786ff94bc40SHeiko Schocher if (ubi->max_erroneous < 16) 787ff94bc40SHeiko Schocher ubi->max_erroneous = 16; 788ff94bc40SHeiko Schocher dbg_gen("max_erroneous %d", ubi->max_erroneous); 789ff94bc40SHeiko Schocher 790ff94bc40SHeiko Schocher /* 791f399d4a2SKyungmin Park * It may happen that EC and VID headers are situated in one minimal 792f399d4a2SKyungmin Park * I/O unit. In this case we can only accept this UBI image in 793f399d4a2SKyungmin Park * read-only mode. 794f399d4a2SKyungmin Park */ 795f399d4a2SKyungmin Park if (ubi->vid_hdr_offset + UBI_VID_HDR_SIZE <= ubi->hdrs_min_io_size) { 796ff94bc40SHeiko Schocher ubi_warn("EC and VID headers are in the same minimal I/O unit, switch to read-only mode"); 797f399d4a2SKyungmin Park ubi->ro_mode = 1; 798f399d4a2SKyungmin Park } 799f399d4a2SKyungmin Park 800f399d4a2SKyungmin Park ubi->leb_size = ubi->peb_size - ubi->leb_start; 801f399d4a2SKyungmin Park 802f399d4a2SKyungmin Park if (!(ubi->mtd->flags & MTD_WRITEABLE)) { 803ff94bc40SHeiko Schocher ubi_msg("MTD device %d is write-protected, attach in read-only mode", 804ff94bc40SHeiko Schocher ubi->mtd->index); 805f399d4a2SKyungmin Park ubi->ro_mode = 1; 806f399d4a2SKyungmin Park } 807f399d4a2SKyungmin Park 808f399d4a2SKyungmin Park /* 809ff94bc40SHeiko Schocher * Note, ideally, we have to initialize @ubi->bad_peb_count here. But 810f399d4a2SKyungmin Park * unfortunately, MTD does not provide this information. We should loop 811f399d4a2SKyungmin Park * over all physical eraseblocks and invoke mtd->block_is_bad() for 812ff94bc40SHeiko Schocher * each physical eraseblock. So, we leave @ubi->bad_peb_count 813ff94bc40SHeiko Schocher * uninitialized so far. 814f399d4a2SKyungmin Park */ 815f399d4a2SKyungmin Park 816f399d4a2SKyungmin Park return 0; 817f399d4a2SKyungmin Park } 818f399d4a2SKyungmin Park 819f399d4a2SKyungmin Park /** 820f399d4a2SKyungmin Park * autoresize - re-size the volume which has the "auto-resize" flag set. 821f399d4a2SKyungmin Park * @ubi: UBI device description object 822f399d4a2SKyungmin Park * @vol_id: ID of the volume to re-size 823f399d4a2SKyungmin Park * 824ff94bc40SHeiko Schocher * This function re-sizes the volume marked by the %UBI_VTBL_AUTORESIZE_FLG in 825f399d4a2SKyungmin Park * the volume table to the largest possible size. See comments in ubi-header.h 826f399d4a2SKyungmin Park * for more description of the flag. Returns zero in case of success and a 827f399d4a2SKyungmin Park * negative error code in case of failure. 828f399d4a2SKyungmin Park */ 829f399d4a2SKyungmin Park static int autoresize(struct ubi_device *ubi, int vol_id) 830f399d4a2SKyungmin Park { 831f399d4a2SKyungmin Park struct ubi_volume_desc desc; 832f399d4a2SKyungmin Park struct ubi_volume *vol = ubi->volumes[vol_id]; 833f399d4a2SKyungmin Park int err, old_reserved_pebs = vol->reserved_pebs; 834f399d4a2SKyungmin Park 835ff94bc40SHeiko Schocher if (ubi->ro_mode) { 836ff94bc40SHeiko Schocher ubi_warn("skip auto-resize because of R/O mode"); 837ff94bc40SHeiko Schocher return 0; 838ff94bc40SHeiko Schocher } 839ff94bc40SHeiko Schocher 840f399d4a2SKyungmin Park /* 841f399d4a2SKyungmin Park * Clear the auto-resize flag in the volume in-memory copy of the 842ff94bc40SHeiko Schocher * volume table, and 'ubi_resize_volume()' will propagate this change 843f399d4a2SKyungmin Park * to the flash. 844f399d4a2SKyungmin Park */ 845f399d4a2SKyungmin Park ubi->vtbl[vol_id].flags &= ~UBI_VTBL_AUTORESIZE_FLG; 846f399d4a2SKyungmin Park 847f399d4a2SKyungmin Park if (ubi->avail_pebs == 0) { 848f399d4a2SKyungmin Park struct ubi_vtbl_record vtbl_rec; 849f399d4a2SKyungmin Park 850f399d4a2SKyungmin Park /* 851ff94bc40SHeiko Schocher * No available PEBs to re-size the volume, clear the flag on 852f399d4a2SKyungmin Park * flash and exit. 853f399d4a2SKyungmin Park */ 854ff94bc40SHeiko Schocher vtbl_rec = ubi->vtbl[vol_id]; 855f399d4a2SKyungmin Park err = ubi_change_vtbl_record(ubi, vol_id, &vtbl_rec); 856f399d4a2SKyungmin Park if (err) 857f399d4a2SKyungmin Park ubi_err("cannot clean auto-resize flag for volume %d", 858f399d4a2SKyungmin Park vol_id); 859f399d4a2SKyungmin Park } else { 860f399d4a2SKyungmin Park desc.vol = vol; 861f399d4a2SKyungmin Park err = ubi_resize_volume(&desc, 862f399d4a2SKyungmin Park old_reserved_pebs + ubi->avail_pebs); 863f399d4a2SKyungmin Park if (err) 864f399d4a2SKyungmin Park ubi_err("cannot auto-resize volume %d", vol_id); 865f399d4a2SKyungmin Park } 866f399d4a2SKyungmin Park 867f399d4a2SKyungmin Park if (err) 868f399d4a2SKyungmin Park return err; 869f399d4a2SKyungmin Park 870f399d4a2SKyungmin Park ubi_msg("volume %d (\"%s\") re-sized from %d to %d LEBs", vol_id, 871f399d4a2SKyungmin Park vol->name, old_reserved_pebs, vol->reserved_pebs); 872f399d4a2SKyungmin Park return 0; 873f399d4a2SKyungmin Park } 874f399d4a2SKyungmin Park 875f399d4a2SKyungmin Park /** 876f399d4a2SKyungmin Park * ubi_attach_mtd_dev - attach an MTD device. 877ff94bc40SHeiko Schocher * @mtd: MTD device description object 878f399d4a2SKyungmin Park * @ubi_num: number to assign to the new UBI device 879f399d4a2SKyungmin Park * @vid_hdr_offset: VID header offset 880ff94bc40SHeiko Schocher * @max_beb_per1024: maximum expected number of bad PEB per 1024 PEBs 881f399d4a2SKyungmin Park * 882f399d4a2SKyungmin Park * This function attaches MTD device @mtd_dev to UBI and assign @ubi_num number 883f399d4a2SKyungmin Park * to the newly created UBI device, unless @ubi_num is %UBI_DEV_NUM_AUTO, in 884ff94bc40SHeiko Schocher * which case this function finds a vacant device number and assigns it 885f399d4a2SKyungmin Park * automatically. Returns the new UBI device number in case of success and a 886f399d4a2SKyungmin Park * negative error code in case of failure. 887f399d4a2SKyungmin Park * 888f399d4a2SKyungmin Park * Note, the invocations of this function has to be serialized by the 889f399d4a2SKyungmin Park * @ubi_devices_mutex. 890f399d4a2SKyungmin Park */ 891ff94bc40SHeiko Schocher int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, 892ff94bc40SHeiko Schocher int vid_hdr_offset, int max_beb_per1024) 893f399d4a2SKyungmin Park { 894f399d4a2SKyungmin Park struct ubi_device *ubi; 895ff94bc40SHeiko Schocher int i, err, ref = 0; 896ff94bc40SHeiko Schocher 897ff94bc40SHeiko Schocher if (max_beb_per1024 < 0 || max_beb_per1024 > MAX_MTD_UBI_BEB_LIMIT) 898ff94bc40SHeiko Schocher return -EINVAL; 899ff94bc40SHeiko Schocher 900ff94bc40SHeiko Schocher if (!max_beb_per1024) 901ff94bc40SHeiko Schocher max_beb_per1024 = CONFIG_MTD_UBI_BEB_LIMIT; 902f399d4a2SKyungmin Park 903f399d4a2SKyungmin Park /* 904f399d4a2SKyungmin Park * Check if we already have the same MTD device attached. 905f399d4a2SKyungmin Park * 906f399d4a2SKyungmin Park * Note, this function assumes that UBI devices creations and deletions 907f399d4a2SKyungmin Park * are serialized, so it does not take the &ubi_devices_lock. 908f399d4a2SKyungmin Park */ 909f399d4a2SKyungmin Park for (i = 0; i < UBI_MAX_DEVICES; i++) { 910f399d4a2SKyungmin Park ubi = ubi_devices[i]; 911f399d4a2SKyungmin Park if (ubi && mtd->index == ubi->mtd->index) { 912ff94bc40SHeiko Schocher ubi_err("mtd%d is already attached to ubi%d", 913f399d4a2SKyungmin Park mtd->index, i); 914f399d4a2SKyungmin Park return -EEXIST; 915f399d4a2SKyungmin Park } 916f399d4a2SKyungmin Park } 917f399d4a2SKyungmin Park 918f399d4a2SKyungmin Park /* 919f399d4a2SKyungmin Park * Make sure this MTD device is not emulated on top of an UBI volume 920f399d4a2SKyungmin Park * already. Well, generally this recursion works fine, but there are 921f399d4a2SKyungmin Park * different problems like the UBI module takes a reference to itself 922f399d4a2SKyungmin Park * by attaching (and thus, opening) the emulated MTD device. This 923f399d4a2SKyungmin Park * results in inability to unload the module. And in general it makes 924f399d4a2SKyungmin Park * no sense to attach emulated MTD devices, so we prohibit this. 925f399d4a2SKyungmin Park */ 926f399d4a2SKyungmin Park if (mtd->type == MTD_UBIVOLUME) { 927ff94bc40SHeiko Schocher ubi_err("refuse attaching mtd%d - it is already emulated on top of UBI", 928ff94bc40SHeiko Schocher mtd->index); 929f399d4a2SKyungmin Park return -EINVAL; 930f399d4a2SKyungmin Park } 931f399d4a2SKyungmin Park 932f399d4a2SKyungmin Park if (ubi_num == UBI_DEV_NUM_AUTO) { 933f399d4a2SKyungmin Park /* Search for an empty slot in the @ubi_devices array */ 934f399d4a2SKyungmin Park for (ubi_num = 0; ubi_num < UBI_MAX_DEVICES; ubi_num++) 935f399d4a2SKyungmin Park if (!ubi_devices[ubi_num]) 936f399d4a2SKyungmin Park break; 937f399d4a2SKyungmin Park if (ubi_num == UBI_MAX_DEVICES) { 938ff94bc40SHeiko Schocher ubi_err("only %d UBI devices may be created", 939ff94bc40SHeiko Schocher UBI_MAX_DEVICES); 940f399d4a2SKyungmin Park return -ENFILE; 941f399d4a2SKyungmin Park } 942f399d4a2SKyungmin Park } else { 943f399d4a2SKyungmin Park if (ubi_num >= UBI_MAX_DEVICES) 944f399d4a2SKyungmin Park return -EINVAL; 945f399d4a2SKyungmin Park 946f399d4a2SKyungmin Park /* Make sure ubi_num is not busy */ 947f399d4a2SKyungmin Park if (ubi_devices[ubi_num]) { 948ff94bc40SHeiko Schocher ubi_err("ubi%d already exists", ubi_num); 949f399d4a2SKyungmin Park return -EEXIST; 950f399d4a2SKyungmin Park } 951f399d4a2SKyungmin Park } 952f399d4a2SKyungmin Park 953f399d4a2SKyungmin Park ubi = kzalloc(sizeof(struct ubi_device), GFP_KERNEL); 954f399d4a2SKyungmin Park if (!ubi) 955f399d4a2SKyungmin Park return -ENOMEM; 956f399d4a2SKyungmin Park 957f399d4a2SKyungmin Park ubi->mtd = mtd; 958f399d4a2SKyungmin Park ubi->ubi_num = ubi_num; 959f399d4a2SKyungmin Park ubi->vid_hdr_offset = vid_hdr_offset; 960f399d4a2SKyungmin Park ubi->autoresize_vol_id = -1; 961f399d4a2SKyungmin Park 962ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP 963ff94bc40SHeiko Schocher ubi->fm_pool.used = ubi->fm_pool.size = 0; 964ff94bc40SHeiko Schocher ubi->fm_wl_pool.used = ubi->fm_wl_pool.size = 0; 965ff94bc40SHeiko Schocher 966ff94bc40SHeiko Schocher /* 967ff94bc40SHeiko Schocher * fm_pool.max_size is 5% of the total number of PEBs but it's also 968ff94bc40SHeiko Schocher * between UBI_FM_MAX_POOL_SIZE and UBI_FM_MIN_POOL_SIZE. 969ff94bc40SHeiko Schocher */ 970ff94bc40SHeiko Schocher ubi->fm_pool.max_size = min(((int)mtd_div_by_eb(ubi->mtd->size, 971ff94bc40SHeiko Schocher ubi->mtd) / 100) * 5, UBI_FM_MAX_POOL_SIZE); 972ff94bc40SHeiko Schocher if (ubi->fm_pool.max_size < UBI_FM_MIN_POOL_SIZE) 973ff94bc40SHeiko Schocher ubi->fm_pool.max_size = UBI_FM_MIN_POOL_SIZE; 974ff94bc40SHeiko Schocher 975ff94bc40SHeiko Schocher ubi->fm_wl_pool.max_size = UBI_FM_WL_POOL_SIZE; 976ff94bc40SHeiko Schocher ubi->fm_disabled = !fm_autoconvert; 977ff94bc40SHeiko Schocher 978ff94bc40SHeiko Schocher if (!ubi->fm_disabled && (int)mtd_div_by_eb(ubi->mtd->size, ubi->mtd) 979ff94bc40SHeiko Schocher <= UBI_FM_MAX_START) { 980ff94bc40SHeiko Schocher ubi_err("More than %i PEBs are needed for fastmap, sorry.", 981ff94bc40SHeiko Schocher UBI_FM_MAX_START); 982ff94bc40SHeiko Schocher ubi->fm_disabled = 1; 983ff94bc40SHeiko Schocher } 984ff94bc40SHeiko Schocher 985ff94bc40SHeiko Schocher ubi_msg("default fastmap pool size: %d", ubi->fm_pool.max_size); 986ff94bc40SHeiko Schocher ubi_msg("default fastmap WL pool size: %d", ubi->fm_wl_pool.max_size); 987ff94bc40SHeiko Schocher #else 988ff94bc40SHeiko Schocher ubi->fm_disabled = 1; 989ff94bc40SHeiko Schocher #endif 990f399d4a2SKyungmin Park mutex_init(&ubi->buf_mutex); 991f399d4a2SKyungmin Park mutex_init(&ubi->ckvol_mutex); 992ff94bc40SHeiko Schocher mutex_init(&ubi->device_mutex); 993f399d4a2SKyungmin Park spin_lock_init(&ubi->volumes_lock); 994ff94bc40SHeiko Schocher mutex_init(&ubi->fm_mutex); 995ff94bc40SHeiko Schocher init_rwsem(&ubi->fm_sem); 996f399d4a2SKyungmin Park 997f399d4a2SKyungmin Park ubi_msg("attaching mtd%d to ubi%d", mtd->index, ubi_num); 998f399d4a2SKyungmin Park 999ff94bc40SHeiko Schocher err = io_init(ubi, max_beb_per1024); 1000f399d4a2SKyungmin Park if (err) 1001f399d4a2SKyungmin Park goto out_free; 1002f399d4a2SKyungmin Park 100381732935SStefan Roese err = -ENOMEM; 1004ff94bc40SHeiko Schocher ubi->peb_buf = vmalloc(ubi->peb_size); 1005ff94bc40SHeiko Schocher if (!ubi->peb_buf) 1006f399d4a2SKyungmin Park goto out_free; 1007f399d4a2SKyungmin Park 1008ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP 1009ff94bc40SHeiko Schocher ubi->fm_size = ubi_calc_fm_size(ubi); 1010ff94bc40SHeiko Schocher ubi->fm_buf = vzalloc(ubi->fm_size); 1011ff94bc40SHeiko Schocher if (!ubi->fm_buf) 1012f399d4a2SKyungmin Park goto out_free; 1013f399d4a2SKyungmin Park #endif 1014ff94bc40SHeiko Schocher err = ubi_attach(ubi, 0); 1015f399d4a2SKyungmin Park if (err) { 1016ff94bc40SHeiko Schocher ubi_err("failed to attach mtd%d, error %d", mtd->index, err); 1017f399d4a2SKyungmin Park goto out_free; 1018f399d4a2SKyungmin Park } 1019f399d4a2SKyungmin Park 1020f399d4a2SKyungmin Park if (ubi->autoresize_vol_id != -1) { 1021f399d4a2SKyungmin Park err = autoresize(ubi, ubi->autoresize_vol_id); 1022f399d4a2SKyungmin Park if (err) 1023f399d4a2SKyungmin Park goto out_detach; 1024f399d4a2SKyungmin Park } 1025f399d4a2SKyungmin Park 1026ff94bc40SHeiko Schocher err = uif_init(ubi, &ref); 1027f399d4a2SKyungmin Park if (err) 1028f399d4a2SKyungmin Park goto out_detach; 1029f399d4a2SKyungmin Park 1030ff94bc40SHeiko Schocher err = ubi_debugfs_init_dev(ubi); 1031ff94bc40SHeiko Schocher if (err) 1032ff94bc40SHeiko Schocher goto out_uif; 1033ff94bc40SHeiko Schocher 1034ff94bc40SHeiko Schocher ubi->bgt_thread = kthread_create(ubi_thread, ubi, "%s", ubi->bgt_name); 1035f399d4a2SKyungmin Park if (IS_ERR(ubi->bgt_thread)) { 1036f399d4a2SKyungmin Park err = PTR_ERR(ubi->bgt_thread); 1037f399d4a2SKyungmin Park ubi_err("cannot spawn \"%s\", error %d", ubi->bgt_name, 1038f399d4a2SKyungmin Park err); 1039ff94bc40SHeiko Schocher goto out_debugfs; 1040f399d4a2SKyungmin Park } 1041f399d4a2SKyungmin Park 1042ff94bc40SHeiko Schocher ubi_msg("attached mtd%d (name \"%s\", size %llu MiB) to ubi%d", 1043ff94bc40SHeiko Schocher mtd->index, mtd->name, ubi->flash_size >> 20, ubi_num); 1044ff94bc40SHeiko Schocher ubi_msg("PEB size: %d bytes (%d KiB), LEB size: %d bytes", 1045ff94bc40SHeiko Schocher ubi->peb_size, ubi->peb_size >> 10, ubi->leb_size); 1046ff94bc40SHeiko Schocher ubi_msg("min./max. I/O unit sizes: %d/%d, sub-page size %d", 1047ff94bc40SHeiko Schocher ubi->min_io_size, ubi->max_write_size, ubi->hdrs_min_io_size); 1048ff94bc40SHeiko Schocher ubi_msg("VID header offset: %d (aligned %d), data offset: %d", 1049ff94bc40SHeiko Schocher ubi->vid_hdr_offset, ubi->vid_hdr_aloffset, ubi->leb_start); 1050ff94bc40SHeiko Schocher ubi_msg("good PEBs: %d, bad PEBs: %d, corrupted PEBs: %d", 1051ff94bc40SHeiko Schocher ubi->good_peb_count, ubi->bad_peb_count, ubi->corr_peb_count); 1052ff94bc40SHeiko Schocher ubi_msg("user volume: %d, internal volumes: %d, max. volumes count: %d", 1053ff94bc40SHeiko Schocher ubi->vol_count - UBI_INT_VOL_COUNT, UBI_INT_VOL_COUNT, 1054ff94bc40SHeiko Schocher ubi->vtbl_slots); 1055ff94bc40SHeiko Schocher ubi_msg("max/mean erase counter: %d/%d, WL threshold: %d, image sequence number: %u", 1056ff94bc40SHeiko Schocher ubi->max_ec, ubi->mean_ec, CONFIG_MTD_UBI_WL_THRESHOLD, 1057ff94bc40SHeiko Schocher ubi->image_seq); 1058ff94bc40SHeiko Schocher ubi_msg("available PEBs: %d, total reserved PEBs: %d, PEBs reserved for bad PEB handling: %d", 1059ff94bc40SHeiko Schocher ubi->avail_pebs, ubi->rsvd_pebs, ubi->beb_rsvd_pebs); 1060f399d4a2SKyungmin Park 1061ff94bc40SHeiko Schocher /* 1062ff94bc40SHeiko Schocher * The below lock makes sure we do not race with 'ubi_thread()' which 1063ff94bc40SHeiko Schocher * checks @ubi->thread_enabled. Otherwise we may fail to wake it up. 1064ff94bc40SHeiko Schocher */ 1065ff94bc40SHeiko Schocher spin_lock(&ubi->wl_lock); 1066f399d4a2SKyungmin Park ubi->thread_enabled = 1; 1067f399d4a2SKyungmin Park wake_up_process(ubi->bgt_thread); 1068ff94bc40SHeiko Schocher spin_unlock(&ubi->wl_lock); 1069f399d4a2SKyungmin Park 1070f399d4a2SKyungmin Park ubi_devices[ubi_num] = ubi; 1071ff94bc40SHeiko Schocher ubi_notify_all(ubi, UBI_VOLUME_ADDED, NULL); 1072f399d4a2SKyungmin Park return ubi_num; 1073f399d4a2SKyungmin Park 1074ff94bc40SHeiko Schocher out_debugfs: 1075ff94bc40SHeiko Schocher ubi_debugfs_exit_dev(ubi); 1076f399d4a2SKyungmin Park out_uif: 1077ff94bc40SHeiko Schocher get_device(&ubi->dev); 1078ff94bc40SHeiko Schocher ubi_assert(ref); 1079f399d4a2SKyungmin Park uif_close(ubi); 1080f399d4a2SKyungmin Park out_detach: 1081f399d4a2SKyungmin Park ubi_wl_close(ubi); 1082ff94bc40SHeiko Schocher ubi_free_internal_volumes(ubi); 1083f399d4a2SKyungmin Park vfree(ubi->vtbl); 1084f399d4a2SKyungmin Park out_free: 1085ff94bc40SHeiko Schocher vfree(ubi->peb_buf); 1086ff94bc40SHeiko Schocher vfree(ubi->fm_buf); 1087ff94bc40SHeiko Schocher if (ref) 1088ff94bc40SHeiko Schocher put_device(&ubi->dev); 1089ff94bc40SHeiko Schocher else 1090f399d4a2SKyungmin Park kfree(ubi); 1091f399d4a2SKyungmin Park return err; 1092f399d4a2SKyungmin Park } 1093f399d4a2SKyungmin Park 1094f399d4a2SKyungmin Park /** 1095f399d4a2SKyungmin Park * ubi_detach_mtd_dev - detach an MTD device. 1096f399d4a2SKyungmin Park * @ubi_num: UBI device number to detach from 1097f399d4a2SKyungmin Park * @anyway: detach MTD even if device reference count is not zero 1098f399d4a2SKyungmin Park * 1099f399d4a2SKyungmin Park * This function destroys an UBI device number @ubi_num and detaches the 1100f399d4a2SKyungmin Park * underlying MTD device. Returns zero in case of success and %-EBUSY if the 1101f399d4a2SKyungmin Park * UBI device is busy and cannot be destroyed, and %-EINVAL if it does not 1102f399d4a2SKyungmin Park * exist. 1103f399d4a2SKyungmin Park * 1104f399d4a2SKyungmin Park * Note, the invocations of this function has to be serialized by the 1105f399d4a2SKyungmin Park * @ubi_devices_mutex. 1106f399d4a2SKyungmin Park */ 1107f399d4a2SKyungmin Park int ubi_detach_mtd_dev(int ubi_num, int anyway) 1108f399d4a2SKyungmin Park { 1109f399d4a2SKyungmin Park struct ubi_device *ubi; 1110f399d4a2SKyungmin Park 1111f399d4a2SKyungmin Park if (ubi_num < 0 || ubi_num >= UBI_MAX_DEVICES) 1112f399d4a2SKyungmin Park return -EINVAL; 1113f399d4a2SKyungmin Park 1114ff94bc40SHeiko Schocher ubi = ubi_get_device(ubi_num); 1115ff94bc40SHeiko Schocher if (!ubi) 1116f399d4a2SKyungmin Park return -EINVAL; 1117f399d4a2SKyungmin Park 1118ff94bc40SHeiko Schocher spin_lock(&ubi_devices_lock); 1119ff94bc40SHeiko Schocher put_device(&ubi->dev); 1120ff94bc40SHeiko Schocher ubi->ref_count -= 1; 1121f399d4a2SKyungmin Park if (ubi->ref_count) { 1122f399d4a2SKyungmin Park if (!anyway) { 1123f399d4a2SKyungmin Park spin_unlock(&ubi_devices_lock); 1124f399d4a2SKyungmin Park return -EBUSY; 1125f399d4a2SKyungmin Park } 1126f399d4a2SKyungmin Park /* This may only happen if there is a bug */ 1127f399d4a2SKyungmin Park ubi_err("%s reference count %d, destroy anyway", 1128f399d4a2SKyungmin Park ubi->ubi_name, ubi->ref_count); 1129f399d4a2SKyungmin Park } 1130f399d4a2SKyungmin Park ubi_devices[ubi_num] = NULL; 1131f399d4a2SKyungmin Park spin_unlock(&ubi_devices_lock); 1132f399d4a2SKyungmin Park 1133f399d4a2SKyungmin Park ubi_assert(ubi_num == ubi->ubi_num); 1134ff94bc40SHeiko Schocher ubi_notify_all(ubi, UBI_VOLUME_REMOVED, NULL); 1135ff94bc40SHeiko Schocher ubi_msg("detaching mtd%d from ubi%d", ubi->mtd->index, ubi_num); 1136ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP 1137ff94bc40SHeiko Schocher /* If we don't write a new fastmap at detach time we lose all 1138ff94bc40SHeiko Schocher * EC updates that have been made since the last written fastmap. */ 1139ff94bc40SHeiko Schocher ubi_update_fastmap(ubi); 1140ff94bc40SHeiko Schocher #endif 1141f399d4a2SKyungmin Park /* 1142f399d4a2SKyungmin Park * Before freeing anything, we have to stop the background thread to 1143f399d4a2SKyungmin Park * prevent it from doing anything on this device while we are freeing. 1144f399d4a2SKyungmin Park */ 1145f399d4a2SKyungmin Park if (ubi->bgt_thread) 1146f399d4a2SKyungmin Park kthread_stop(ubi->bgt_thread); 1147f399d4a2SKyungmin Park 1148ff94bc40SHeiko Schocher /* 1149ff94bc40SHeiko Schocher * Get a reference to the device in order to prevent 'dev_release()' 1150ff94bc40SHeiko Schocher * from freeing the @ubi object. 1151ff94bc40SHeiko Schocher */ 1152ff94bc40SHeiko Schocher get_device(&ubi->dev); 1153ff94bc40SHeiko Schocher 1154ff94bc40SHeiko Schocher ubi_debugfs_exit_dev(ubi); 1155f399d4a2SKyungmin Park uif_close(ubi); 1156ff94bc40SHeiko Schocher 1157f399d4a2SKyungmin Park ubi_wl_close(ubi); 1158ff94bc40SHeiko Schocher ubi_free_internal_volumes(ubi); 1159f399d4a2SKyungmin Park vfree(ubi->vtbl); 1160f399d4a2SKyungmin Park put_mtd_device(ubi->mtd); 1161ff94bc40SHeiko Schocher vfree(ubi->peb_buf); 1162ff94bc40SHeiko Schocher vfree(ubi->fm_buf); 1163f399d4a2SKyungmin Park ubi_msg("mtd%d is detached from ubi%d", ubi->mtd->index, ubi->ubi_num); 1164ff94bc40SHeiko Schocher put_device(&ubi->dev); 1165f399d4a2SKyungmin Park return 0; 1166f399d4a2SKyungmin Park } 1167f399d4a2SKyungmin Park 1168ff94bc40SHeiko Schocher #ifndef __UBOOT__ 1169f399d4a2SKyungmin Park /** 1170ff94bc40SHeiko Schocher * open_mtd_by_chdev - open an MTD device by its character device node path. 1171ff94bc40SHeiko Schocher * @mtd_dev: MTD character device node path 1172ff94bc40SHeiko Schocher * 1173ff94bc40SHeiko Schocher * This helper function opens an MTD device by its character node device path. 1174ff94bc40SHeiko Schocher * Returns MTD device description object in case of success and a negative 1175ff94bc40SHeiko Schocher * error code in case of failure. 1176ff94bc40SHeiko Schocher */ 1177ff94bc40SHeiko Schocher static struct mtd_info * __init open_mtd_by_chdev(const char *mtd_dev) 1178ff94bc40SHeiko Schocher { 1179ff94bc40SHeiko Schocher int err, major, minor, mode; 1180ff94bc40SHeiko Schocher struct path path; 1181ff94bc40SHeiko Schocher 1182ff94bc40SHeiko Schocher /* Probably this is an MTD character device node path */ 1183ff94bc40SHeiko Schocher err = kern_path(mtd_dev, LOOKUP_FOLLOW, &path); 1184ff94bc40SHeiko Schocher if (err) 1185ff94bc40SHeiko Schocher return ERR_PTR(err); 1186ff94bc40SHeiko Schocher 1187ff94bc40SHeiko Schocher /* MTD device number is defined by the major / minor numbers */ 1188ff94bc40SHeiko Schocher major = imajor(path.dentry->d_inode); 1189ff94bc40SHeiko Schocher minor = iminor(path.dentry->d_inode); 1190ff94bc40SHeiko Schocher mode = path.dentry->d_inode->i_mode; 1191ff94bc40SHeiko Schocher path_put(&path); 1192ff94bc40SHeiko Schocher if (major != MTD_CHAR_MAJOR || !S_ISCHR(mode)) 1193ff94bc40SHeiko Schocher return ERR_PTR(-EINVAL); 1194ff94bc40SHeiko Schocher 1195ff94bc40SHeiko Schocher if (minor & 1) 1196ff94bc40SHeiko Schocher /* 1197ff94bc40SHeiko Schocher * Just do not think the "/dev/mtdrX" devices support is need, 1198ff94bc40SHeiko Schocher * so do not support them to avoid doing extra work. 1199ff94bc40SHeiko Schocher */ 1200ff94bc40SHeiko Schocher return ERR_PTR(-EINVAL); 1201ff94bc40SHeiko Schocher 1202ff94bc40SHeiko Schocher return get_mtd_device(NULL, minor / 2); 1203ff94bc40SHeiko Schocher } 1204ff94bc40SHeiko Schocher #endif 1205ff94bc40SHeiko Schocher 1206ff94bc40SHeiko Schocher /** 1207ff94bc40SHeiko Schocher * open_mtd_device - open MTD device by name, character device path, or number. 1208ff94bc40SHeiko Schocher * @mtd_dev: name, character device node path, or MTD device device number 1209f399d4a2SKyungmin Park * 1210f399d4a2SKyungmin Park * This function tries to open and MTD device described by @mtd_dev string, 1211ff94bc40SHeiko Schocher * which is first treated as ASCII MTD device number, and if it is not true, it 1212ff94bc40SHeiko Schocher * is treated as MTD device name, and if that is also not true, it is treated 1213ff94bc40SHeiko Schocher * as MTD character device node path. Returns MTD device description object in 1214ff94bc40SHeiko Schocher * case of success and a negative error code in case of failure. 1215f399d4a2SKyungmin Park */ 1216f399d4a2SKyungmin Park static struct mtd_info * __init open_mtd_device(const char *mtd_dev) 1217f399d4a2SKyungmin Park { 1218f399d4a2SKyungmin Park struct mtd_info *mtd; 1219f399d4a2SKyungmin Park int mtd_num; 1220f399d4a2SKyungmin Park char *endp; 1221f399d4a2SKyungmin Park 1222f399d4a2SKyungmin Park mtd_num = simple_strtoul(mtd_dev, &endp, 0); 1223f399d4a2SKyungmin Park if (*endp != '\0' || mtd_dev == endp) { 1224f399d4a2SKyungmin Park /* 1225f399d4a2SKyungmin Park * This does not look like an ASCII integer, probably this is 1226f399d4a2SKyungmin Park * MTD device name. 1227f399d4a2SKyungmin Park */ 1228f399d4a2SKyungmin Park mtd = get_mtd_device_nm(mtd_dev); 1229ff94bc40SHeiko Schocher #ifndef __UBOOT__ 1230ff94bc40SHeiko Schocher if (IS_ERR(mtd) && PTR_ERR(mtd) == -ENODEV) 1231ff94bc40SHeiko Schocher /* Probably this is an MTD character device node path */ 1232ff94bc40SHeiko Schocher mtd = open_mtd_by_chdev(mtd_dev); 1233ff94bc40SHeiko Schocher #endif 1234f399d4a2SKyungmin Park } else 1235f399d4a2SKyungmin Park mtd = get_mtd_device(NULL, mtd_num); 1236f399d4a2SKyungmin Park 1237f399d4a2SKyungmin Park return mtd; 1238f399d4a2SKyungmin Park } 1239f399d4a2SKyungmin Park 1240ff94bc40SHeiko Schocher #ifndef __UBOOT__ 1241ff94bc40SHeiko Schocher static int __init ubi_init(void) 1242ff94bc40SHeiko Schocher #else 1243ff94bc40SHeiko Schocher int ubi_init(void) 1244ff94bc40SHeiko Schocher #endif 1245f399d4a2SKyungmin Park { 1246f399d4a2SKyungmin Park int err, i, k; 1247f399d4a2SKyungmin Park 1248f399d4a2SKyungmin Park /* Ensure that EC and VID headers have correct size */ 1249f399d4a2SKyungmin Park BUILD_BUG_ON(sizeof(struct ubi_ec_hdr) != 64); 1250f399d4a2SKyungmin Park BUILD_BUG_ON(sizeof(struct ubi_vid_hdr) != 64); 1251f399d4a2SKyungmin Park 1252f399d4a2SKyungmin Park if (mtd_devs > UBI_MAX_DEVICES) { 1253f399d4a2SKyungmin Park ubi_err("too many MTD devices, maximum is %d", UBI_MAX_DEVICES); 1254f399d4a2SKyungmin Park return -EINVAL; 1255f399d4a2SKyungmin Park } 1256f399d4a2SKyungmin Park 1257f399d4a2SKyungmin Park /* Create base sysfs directory and sysfs files */ 1258f399d4a2SKyungmin Park ubi_class = class_create(THIS_MODULE, UBI_NAME_STR); 1259f399d4a2SKyungmin Park if (IS_ERR(ubi_class)) { 1260f399d4a2SKyungmin Park err = PTR_ERR(ubi_class); 1261f399d4a2SKyungmin Park ubi_err("cannot create UBI class"); 1262f399d4a2SKyungmin Park goto out; 1263f399d4a2SKyungmin Park } 1264f399d4a2SKyungmin Park 1265f399d4a2SKyungmin Park err = class_create_file(ubi_class, &ubi_version); 1266f399d4a2SKyungmin Park if (err) { 1267f399d4a2SKyungmin Park ubi_err("cannot create sysfs file"); 1268f399d4a2SKyungmin Park goto out_class; 1269f399d4a2SKyungmin Park } 1270f399d4a2SKyungmin Park 1271f399d4a2SKyungmin Park err = misc_register(&ubi_ctrl_cdev); 1272f399d4a2SKyungmin Park if (err) { 1273f399d4a2SKyungmin Park ubi_err("cannot register device"); 1274f399d4a2SKyungmin Park goto out_version; 1275f399d4a2SKyungmin Park } 1276f399d4a2SKyungmin Park 1277f399d4a2SKyungmin Park ubi_wl_entry_slab = kmem_cache_create("ubi_wl_entry_slab", 1278f399d4a2SKyungmin Park sizeof(struct ubi_wl_entry), 1279f399d4a2SKyungmin Park 0, 0, NULL); 1280ff94bc40SHeiko Schocher if (!ubi_wl_entry_slab) { 1281ff94bc40SHeiko Schocher err = -ENOMEM; 1282f399d4a2SKyungmin Park goto out_dev_unreg; 1283ff94bc40SHeiko Schocher } 1284ff94bc40SHeiko Schocher 1285ff94bc40SHeiko Schocher err = ubi_debugfs_init(); 1286ff94bc40SHeiko Schocher if (err) 1287ff94bc40SHeiko Schocher goto out_slab; 1288ff94bc40SHeiko Schocher 1289f399d4a2SKyungmin Park 1290f399d4a2SKyungmin Park /* Attach MTD devices */ 1291f399d4a2SKyungmin Park for (i = 0; i < mtd_devs; i++) { 1292f399d4a2SKyungmin Park struct mtd_dev_param *p = &mtd_dev_param[i]; 1293f399d4a2SKyungmin Park struct mtd_info *mtd; 1294f399d4a2SKyungmin Park 1295f399d4a2SKyungmin Park cond_resched(); 1296f399d4a2SKyungmin Park 1297f399d4a2SKyungmin Park mtd = open_mtd_device(p->name); 1298f399d4a2SKyungmin Park if (IS_ERR(mtd)) { 1299f399d4a2SKyungmin Park err = PTR_ERR(mtd); 1300ff94bc40SHeiko Schocher ubi_err("cannot open mtd %s, error %d", p->name, err); 1301ff94bc40SHeiko Schocher /* See comment below re-ubi_is_module(). */ 1302ff94bc40SHeiko Schocher if (ubi_is_module()) 1303f399d4a2SKyungmin Park goto out_detach; 1304ff94bc40SHeiko Schocher continue; 1305f399d4a2SKyungmin Park } 1306f399d4a2SKyungmin Park 1307f399d4a2SKyungmin Park mutex_lock(&ubi_devices_mutex); 1308ff94bc40SHeiko Schocher err = ubi_attach_mtd_dev(mtd, p->ubi_num, 1309ff94bc40SHeiko Schocher p->vid_hdr_offs, p->max_beb_per1024); 1310f399d4a2SKyungmin Park mutex_unlock(&ubi_devices_mutex); 1311f399d4a2SKyungmin Park if (err < 0) { 1312f399d4a2SKyungmin Park ubi_err("cannot attach mtd%d", mtd->index); 1313ff94bc40SHeiko Schocher put_mtd_device(mtd); 1314ff94bc40SHeiko Schocher 1315ff94bc40SHeiko Schocher /* 1316ff94bc40SHeiko Schocher * Originally UBI stopped initializing on any error. 1317ff94bc40SHeiko Schocher * However, later on it was found out that this 1318ff94bc40SHeiko Schocher * behavior is not very good when UBI is compiled into 1319ff94bc40SHeiko Schocher * the kernel and the MTD devices to attach are passed 1320ff94bc40SHeiko Schocher * through the command line. Indeed, UBI failure 1321ff94bc40SHeiko Schocher * stopped whole boot sequence. 1322ff94bc40SHeiko Schocher * 1323ff94bc40SHeiko Schocher * To fix this, we changed the behavior for the 1324ff94bc40SHeiko Schocher * non-module case, but preserved the old behavior for 1325ff94bc40SHeiko Schocher * the module case, just for compatibility. This is a 1326ff94bc40SHeiko Schocher * little inconsistent, though. 1327ff94bc40SHeiko Schocher */ 1328ff94bc40SHeiko Schocher if (ubi_is_module()) 1329f399d4a2SKyungmin Park goto out_detach; 1330f399d4a2SKyungmin Park } 1331f399d4a2SKyungmin Park } 1332f399d4a2SKyungmin Park 13334e67c571SHeiko Schocher err = ubiblock_init(); 13344e67c571SHeiko Schocher if (err) { 13354e67c571SHeiko Schocher ubi_err("block: cannot initialize, error %d", err); 13364e67c571SHeiko Schocher 13374e67c571SHeiko Schocher /* See comment above re-ubi_is_module(). */ 13384e67c571SHeiko Schocher if (ubi_is_module()) 13394e67c571SHeiko Schocher goto out_detach; 13404e67c571SHeiko Schocher } 13414e67c571SHeiko Schocher 1342f399d4a2SKyungmin Park return 0; 1343f399d4a2SKyungmin Park 1344f399d4a2SKyungmin Park out_detach: 1345f399d4a2SKyungmin Park for (k = 0; k < i; k++) 1346f399d4a2SKyungmin Park if (ubi_devices[k]) { 1347f399d4a2SKyungmin Park mutex_lock(&ubi_devices_mutex); 1348f399d4a2SKyungmin Park ubi_detach_mtd_dev(ubi_devices[k]->ubi_num, 1); 1349f399d4a2SKyungmin Park mutex_unlock(&ubi_devices_mutex); 1350f399d4a2SKyungmin Park } 1351ff94bc40SHeiko Schocher ubi_debugfs_exit(); 1352ff94bc40SHeiko Schocher out_slab: 1353f399d4a2SKyungmin Park kmem_cache_destroy(ubi_wl_entry_slab); 1354f399d4a2SKyungmin Park out_dev_unreg: 1355f399d4a2SKyungmin Park misc_deregister(&ubi_ctrl_cdev); 1356f399d4a2SKyungmin Park out_version: 1357f399d4a2SKyungmin Park class_remove_file(ubi_class, &ubi_version); 1358f399d4a2SKyungmin Park out_class: 1359f399d4a2SKyungmin Park class_destroy(ubi_class); 1360f399d4a2SKyungmin Park out: 1361*40da2a2aSHeiko Schocher #ifdef __UBOOT__ 1362*40da2a2aSHeiko Schocher /* Reset any globals that the driver depends on being zeroed */ 1363*40da2a2aSHeiko Schocher mtd_devs = 0; 1364*40da2a2aSHeiko Schocher #endif 1365ff94bc40SHeiko Schocher ubi_err("cannot initialize UBI, error %d", err); 1366f399d4a2SKyungmin Park return err; 1367f399d4a2SKyungmin Park } 1368ff94bc40SHeiko Schocher late_initcall(ubi_init); 1369f399d4a2SKyungmin Park 1370ff94bc40SHeiko Schocher #ifndef __UBOOT__ 1371ff94bc40SHeiko Schocher static void __exit ubi_exit(void) 1372ff94bc40SHeiko Schocher #else 1373ff94bc40SHeiko Schocher void ubi_exit(void) 1374ff94bc40SHeiko Schocher #endif 1375f399d4a2SKyungmin Park { 1376f399d4a2SKyungmin Park int i; 1377f399d4a2SKyungmin Park 13784e67c571SHeiko Schocher ubiblock_exit(); 13794e67c571SHeiko Schocher 1380f399d4a2SKyungmin Park for (i = 0; i < UBI_MAX_DEVICES; i++) 1381f399d4a2SKyungmin Park if (ubi_devices[i]) { 1382f399d4a2SKyungmin Park mutex_lock(&ubi_devices_mutex); 1383f399d4a2SKyungmin Park ubi_detach_mtd_dev(ubi_devices[i]->ubi_num, 1); 1384f399d4a2SKyungmin Park mutex_unlock(&ubi_devices_mutex); 1385f399d4a2SKyungmin Park } 1386ff94bc40SHeiko Schocher ubi_debugfs_exit(); 1387f399d4a2SKyungmin Park kmem_cache_destroy(ubi_wl_entry_slab); 1388f399d4a2SKyungmin Park misc_deregister(&ubi_ctrl_cdev); 1389f399d4a2SKyungmin Park class_remove_file(ubi_class, &ubi_version); 1390f399d4a2SKyungmin Park class_destroy(ubi_class); 1391*40da2a2aSHeiko Schocher #ifdef __UBOOT__ 1392*40da2a2aSHeiko Schocher /* Reset any globals that the driver depends on being zeroed */ 1393*40da2a2aSHeiko Schocher mtd_devs = 0; 1394*40da2a2aSHeiko Schocher #endif 1395f399d4a2SKyungmin Park } 1396f399d4a2SKyungmin Park module_exit(ubi_exit); 1397f399d4a2SKyungmin Park 1398f399d4a2SKyungmin Park /** 1399ff94bc40SHeiko Schocher * bytes_str_to_int - convert a number of bytes string into an integer. 1400f399d4a2SKyungmin Park * @str: the string to convert 1401f399d4a2SKyungmin Park * 1402f399d4a2SKyungmin Park * This function returns positive resulting integer in case of success and a 1403f399d4a2SKyungmin Park * negative error code in case of failure. 1404f399d4a2SKyungmin Park */ 1405f399d4a2SKyungmin Park static int __init bytes_str_to_int(const char *str) 1406f399d4a2SKyungmin Park { 1407f399d4a2SKyungmin Park char *endp; 1408f399d4a2SKyungmin Park unsigned long result; 1409f399d4a2SKyungmin Park 1410f399d4a2SKyungmin Park result = simple_strtoul(str, &endp, 0); 1411ff94bc40SHeiko Schocher if (str == endp || result >= INT_MAX) { 1412ff94bc40SHeiko Schocher ubi_err("incorrect bytes count: \"%s\"\n", str); 1413f399d4a2SKyungmin Park return -EINVAL; 1414f399d4a2SKyungmin Park } 1415f399d4a2SKyungmin Park 1416f399d4a2SKyungmin Park switch (*endp) { 1417f399d4a2SKyungmin Park case 'G': 1418f399d4a2SKyungmin Park result *= 1024; 1419f399d4a2SKyungmin Park case 'M': 1420f399d4a2SKyungmin Park result *= 1024; 1421f399d4a2SKyungmin Park case 'K': 1422f399d4a2SKyungmin Park result *= 1024; 1423f399d4a2SKyungmin Park if (endp[1] == 'i' && endp[2] == 'B') 1424f399d4a2SKyungmin Park endp += 2; 1425f399d4a2SKyungmin Park case '\0': 1426f399d4a2SKyungmin Park break; 1427f399d4a2SKyungmin Park default: 1428ff94bc40SHeiko Schocher ubi_err("incorrect bytes count: \"%s\"\n", str); 1429f399d4a2SKyungmin Park return -EINVAL; 1430f399d4a2SKyungmin Park } 1431f399d4a2SKyungmin Park 1432f399d4a2SKyungmin Park return result; 1433f399d4a2SKyungmin Park } 1434f399d4a2SKyungmin Park 1435ff94bc40SHeiko Schocher int kstrtoint(const char *s, unsigned int base, int *res) 1436ff94bc40SHeiko Schocher { 1437ff94bc40SHeiko Schocher unsigned long long tmp; 1438ff94bc40SHeiko Schocher 1439ff94bc40SHeiko Schocher tmp = simple_strtoull(s, NULL, base); 1440ff94bc40SHeiko Schocher if (tmp != (unsigned long long)(int)tmp) 1441ff94bc40SHeiko Schocher return -ERANGE; 1442ff94bc40SHeiko Schocher 1443ff94bc40SHeiko Schocher return (int)tmp; 1444ff94bc40SHeiko Schocher } 1445ff94bc40SHeiko Schocher 1446f399d4a2SKyungmin Park /** 1447f399d4a2SKyungmin Park * ubi_mtd_param_parse - parse the 'mtd=' UBI parameter. 1448f399d4a2SKyungmin Park * @val: the parameter value to parse 1449f399d4a2SKyungmin Park * @kp: not used 1450f399d4a2SKyungmin Park * 1451f399d4a2SKyungmin Park * This function returns zero in case of success and a negative error code in 1452f399d4a2SKyungmin Park * case of error. 1453f399d4a2SKyungmin Park */ 1454ff94bc40SHeiko Schocher #ifndef __UBOOT__ 1455ff94bc40SHeiko Schocher static int __init ubi_mtd_param_parse(const char *val, struct kernel_param *kp) 1456ff94bc40SHeiko Schocher #else 1457ff94bc40SHeiko Schocher int ubi_mtd_param_parse(const char *val, struct kernel_param *kp) 1458ff94bc40SHeiko Schocher #endif 1459f399d4a2SKyungmin Park { 1460f399d4a2SKyungmin Park int i, len; 1461f399d4a2SKyungmin Park struct mtd_dev_param *p; 1462f399d4a2SKyungmin Park char buf[MTD_PARAM_LEN_MAX]; 1463f399d4a2SKyungmin Park char *pbuf = &buf[0]; 1464ff94bc40SHeiko Schocher char *tokens[MTD_PARAM_MAX_COUNT], *token; 1465f399d4a2SKyungmin Park 1466f399d4a2SKyungmin Park if (!val) 1467f399d4a2SKyungmin Park return -EINVAL; 1468f399d4a2SKyungmin Park 1469f399d4a2SKyungmin Park if (mtd_devs == UBI_MAX_DEVICES) { 1470ff94bc40SHeiko Schocher ubi_err("too many parameters, max. is %d\n", 1471f399d4a2SKyungmin Park UBI_MAX_DEVICES); 1472f399d4a2SKyungmin Park return -EINVAL; 1473f399d4a2SKyungmin Park } 1474f399d4a2SKyungmin Park 1475f399d4a2SKyungmin Park len = strnlen(val, MTD_PARAM_LEN_MAX); 1476f399d4a2SKyungmin Park if (len == MTD_PARAM_LEN_MAX) { 1477ff94bc40SHeiko Schocher ubi_err("parameter \"%s\" is too long, max. is %d\n", 1478ff94bc40SHeiko Schocher val, MTD_PARAM_LEN_MAX); 1479f399d4a2SKyungmin Park return -EINVAL; 1480f399d4a2SKyungmin Park } 1481f399d4a2SKyungmin Park 1482f399d4a2SKyungmin Park if (len == 0) { 1483ff94bc40SHeiko Schocher pr_warn("UBI warning: empty 'mtd=' parameter - ignored\n"); 1484f399d4a2SKyungmin Park return 0; 1485f399d4a2SKyungmin Park } 1486f399d4a2SKyungmin Park 1487f399d4a2SKyungmin Park strcpy(buf, val); 1488f399d4a2SKyungmin Park 1489f399d4a2SKyungmin Park /* Get rid of the final newline */ 1490f399d4a2SKyungmin Park if (buf[len - 1] == '\n') 1491f399d4a2SKyungmin Park buf[len - 1] = '\0'; 1492f399d4a2SKyungmin Park 1493ff94bc40SHeiko Schocher for (i = 0; i < MTD_PARAM_MAX_COUNT; i++) 1494f399d4a2SKyungmin Park tokens[i] = strsep(&pbuf, ","); 1495f399d4a2SKyungmin Park 1496f399d4a2SKyungmin Park if (pbuf) { 1497ff94bc40SHeiko Schocher ubi_err("too many arguments at \"%s\"\n", val); 1498f399d4a2SKyungmin Park return -EINVAL; 1499f399d4a2SKyungmin Park } 1500f399d4a2SKyungmin Park 1501f399d4a2SKyungmin Park p = &mtd_dev_param[mtd_devs]; 1502f399d4a2SKyungmin Park strcpy(&p->name[0], tokens[0]); 1503f399d4a2SKyungmin Park 1504ff94bc40SHeiko Schocher token = tokens[1]; 1505ff94bc40SHeiko Schocher if (token) { 1506ff94bc40SHeiko Schocher p->vid_hdr_offs = bytes_str_to_int(token); 1507f399d4a2SKyungmin Park 1508f399d4a2SKyungmin Park if (p->vid_hdr_offs < 0) 1509f399d4a2SKyungmin Park return p->vid_hdr_offs; 1510ff94bc40SHeiko Schocher } 1511ff94bc40SHeiko Schocher 1512ff94bc40SHeiko Schocher token = tokens[2]; 1513ff94bc40SHeiko Schocher if (token) { 1514ff94bc40SHeiko Schocher int err = kstrtoint(token, 10, &p->max_beb_per1024); 1515ff94bc40SHeiko Schocher 1516ff94bc40SHeiko Schocher if (err) { 1517ff94bc40SHeiko Schocher ubi_err("bad value for max_beb_per1024 parameter: %s", 1518ff94bc40SHeiko Schocher token); 1519ff94bc40SHeiko Schocher return -EINVAL; 1520ff94bc40SHeiko Schocher } 1521ff94bc40SHeiko Schocher } 1522ff94bc40SHeiko Schocher 1523ff94bc40SHeiko Schocher token = tokens[3]; 1524ff94bc40SHeiko Schocher if (token) { 1525ff94bc40SHeiko Schocher int err = kstrtoint(token, 10, &p->ubi_num); 1526ff94bc40SHeiko Schocher 1527ff94bc40SHeiko Schocher if (err) { 1528ff94bc40SHeiko Schocher ubi_err("bad value for ubi_num parameter: %s", token); 1529ff94bc40SHeiko Schocher return -EINVAL; 1530ff94bc40SHeiko Schocher } 1531ff94bc40SHeiko Schocher } else 1532ff94bc40SHeiko Schocher p->ubi_num = UBI_DEV_NUM_AUTO; 1533f399d4a2SKyungmin Park 1534f399d4a2SKyungmin Park mtd_devs += 1; 1535f399d4a2SKyungmin Park return 0; 1536f399d4a2SKyungmin Park } 1537f399d4a2SKyungmin Park 1538f399d4a2SKyungmin Park module_param_call(mtd, ubi_mtd_param_parse, NULL, NULL, 000); 1539ff94bc40SHeiko Schocher MODULE_PARM_DESC(mtd, "MTD devices to attach. Parameter format: mtd=<name|num|path>[,<vid_hdr_offs>[,max_beb_per1024[,ubi_num]]].\n" 1540f399d4a2SKyungmin Park "Multiple \"mtd\" parameters may be specified.\n" 1541ff94bc40SHeiko Schocher "MTD devices may be specified by their number, name, or path to the MTD character device node.\n" 1542ff94bc40SHeiko Schocher "Optional \"vid_hdr_offs\" parameter specifies UBI VID header position to be used by UBI. (default value if 0)\n" 1543ff94bc40SHeiko Schocher "Optional \"max_beb_per1024\" parameter specifies the maximum expected bad eraseblock per 1024 eraseblocks. (default value (" 1544ff94bc40SHeiko Schocher __stringify(CONFIG_MTD_UBI_BEB_LIMIT) ") if 0)\n" 1545ff94bc40SHeiko Schocher "Optional \"ubi_num\" parameter specifies UBI device number which have to be assigned to the newly created UBI device (assigned automatically by default)\n" 1546ff94bc40SHeiko Schocher "\n" 1547ff94bc40SHeiko Schocher "Example 1: mtd=/dev/mtd0 - attach MTD device /dev/mtd0.\n" 1548ff94bc40SHeiko Schocher "Example 2: mtd=content,1984 mtd=4 - attach MTD device with name \"content\" using VID header offset 1984, and MTD device number 4 with default VID header offset.\n" 1549ff94bc40SHeiko Schocher "Example 3: mtd=/dev/mtd1,0,25 - attach MTD device /dev/mtd1 using default VID header offset and reserve 25*nand_size_in_blocks/1024 erase blocks for bad block handling.\n" 1550ff94bc40SHeiko Schocher "Example 4: mtd=/dev/mtd1,0,0,5 - attach MTD device /dev/mtd1 to UBI 5 and using default values for the other fields.\n" 1551ff94bc40SHeiko Schocher "\t(e.g. if the NAND *chipset* has 4096 PEB, 100 will be reserved for this UBI device)."); 1552ff94bc40SHeiko Schocher #ifdef CONFIG_MTD_UBI_FASTMAP 1553ff94bc40SHeiko Schocher module_param(fm_autoconvert, bool, 0644); 1554ff94bc40SHeiko Schocher MODULE_PARM_DESC(fm_autoconvert, "Set this parameter to enable fastmap automatically on images without a fastmap."); 1555ff94bc40SHeiko Schocher #endif 1556f399d4a2SKyungmin Park MODULE_VERSION(__stringify(UBI_VERSION)); 1557f399d4a2SKyungmin Park MODULE_DESCRIPTION("UBI - Unsorted Block Images"); 1558f399d4a2SKyungmin Park MODULE_AUTHOR("Artem Bityutskiy"); 1559f399d4a2SKyungmin Park MODULE_LICENSE("GPL"); 1560