xref: /rk3399_rockchip-uboot/drivers/mtd/ubi/build.c (revision 40da2a2a08f12015d06d78a334e4d977963fee34)
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