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