xref: /openbmc/u-boot/drivers/mtd/ubi/io.c (revision a715415b)
183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
22d262c48SKyungmin Park /*
32d262c48SKyungmin Park  * Copyright (c) International Business Machines Corp., 2006
42d262c48SKyungmin Park  * Copyright (c) Nokia Corporation, 2006, 2007
52d262c48SKyungmin Park  *
62d262c48SKyungmin Park  * Author: Artem Bityutskiy (Битюцкий Артём)
72d262c48SKyungmin Park  */
82d262c48SKyungmin Park 
92d262c48SKyungmin Park /*
10ff94bc40SHeiko Schocher  * UBI input/output sub-system.
112d262c48SKyungmin Park  *
12ff94bc40SHeiko Schocher  * This sub-system provides a uniform way to work with all kinds of the
13ff94bc40SHeiko Schocher  * underlying MTD devices. It also implements handy functions for reading and
14ff94bc40SHeiko Schocher  * writing UBI headers.
152d262c48SKyungmin Park  *
162d262c48SKyungmin Park  * We are trying to have a paranoid mindset and not to trust to what we read
17ff94bc40SHeiko Schocher  * from the flash media in order to be more secure and robust. So this
18ff94bc40SHeiko Schocher  * sub-system validates every single header it reads from the flash media.
192d262c48SKyungmin Park  *
202d262c48SKyungmin Park  * Some words about how the eraseblock headers are stored.
212d262c48SKyungmin Park  *
222d262c48SKyungmin Park  * The erase counter header is always stored at offset zero. By default, the
232d262c48SKyungmin Park  * VID header is stored after the EC header at the closest aligned offset
242d262c48SKyungmin Park  * (i.e. aligned to the minimum I/O unit size). Data starts next to the VID
252d262c48SKyungmin Park  * header at the closest aligned offset. But this default layout may be
262d262c48SKyungmin Park  * changed. For example, for different reasons (e.g., optimization) UBI may be
272d262c48SKyungmin Park  * asked to put the VID header at further offset, and even at an unaligned
282d262c48SKyungmin Park  * offset. Of course, if the offset of the VID header is unaligned, UBI adds
292d262c48SKyungmin Park  * proper padding in front of it. Data offset may also be changed but it has to
302d262c48SKyungmin Park  * be aligned.
312d262c48SKyungmin Park  *
322d262c48SKyungmin Park  * About minimal I/O units. In general, UBI assumes flash device model where
332d262c48SKyungmin Park  * there is only one minimal I/O unit size. E.g., in case of NOR flash it is 1,
342d262c48SKyungmin Park  * in case of NAND flash it is a NAND page, etc. This is reported by MTD in the
352d262c48SKyungmin Park  * @ubi->mtd->writesize field. But as an exception, UBI admits of using another
362d262c48SKyungmin Park  * (smaller) minimal I/O unit size for EC and VID headers to make it possible
372d262c48SKyungmin Park  * to do different optimizations.
382d262c48SKyungmin Park  *
392d262c48SKyungmin Park  * This is extremely useful in case of NAND flashes which admit of several
402d262c48SKyungmin Park  * write operations to one NAND page. In this case UBI can fit EC and VID
412d262c48SKyungmin Park  * headers at one NAND page. Thus, UBI may use "sub-page" size as the minimal
422d262c48SKyungmin Park  * I/O unit for the headers (the @ubi->hdrs_min_io_size field). But it still
432d262c48SKyungmin Park  * reports NAND page size (@ubi->min_io_size) as a minimal I/O unit for the UBI
442d262c48SKyungmin Park  * users.
452d262c48SKyungmin Park  *
462d262c48SKyungmin Park  * Example: some Samsung NANDs with 2KiB pages allow 4x 512-byte writes, so
472d262c48SKyungmin Park  * although the minimal I/O unit is 2K, UBI uses 512 bytes for EC and VID
482d262c48SKyungmin Park  * headers.
492d262c48SKyungmin Park  *
502d262c48SKyungmin Park  * Q: why not just to treat sub-page as a minimal I/O unit of this flash
512d262c48SKyungmin Park  * device, e.g., make @ubi->min_io_size = 512 in the example above?
522d262c48SKyungmin Park  *
532d262c48SKyungmin Park  * A: because when writing a sub-page, MTD still writes a full 2K page but the
54ff94bc40SHeiko Schocher  * bytes which are not relevant to the sub-page are 0xFF. So, basically,
55ff94bc40SHeiko Schocher  * writing 4x512 sub-pages is 4 times slower than writing one 2KiB NAND page.
56ff94bc40SHeiko Schocher  * Thus, we prefer to use sub-pages only for EC and VID headers.
572d262c48SKyungmin Park  *
582d262c48SKyungmin Park  * As it was noted above, the VID header may start at a non-aligned offset.
592d262c48SKyungmin Park  * For example, in case of a 2KiB page NAND flash with a 512 bytes sub-page,
602d262c48SKyungmin Park  * the VID header may reside at offset 1984 which is the last 64 bytes of the
612d262c48SKyungmin Park  * last sub-page (EC header is always at offset zero). This causes some
622d262c48SKyungmin Park  * difficulties when reading and writing VID headers.
632d262c48SKyungmin Park  *
642d262c48SKyungmin Park  * Suppose we have a 64-byte buffer and we read a VID header at it. We change
652d262c48SKyungmin Park  * the data and want to write this VID header out. As we can only write in
662d262c48SKyungmin Park  * 512-byte chunks, we have to allocate one more buffer and copy our VID header
672d262c48SKyungmin Park  * to offset 448 of this buffer.
682d262c48SKyungmin Park  *
69ff94bc40SHeiko Schocher  * The I/O sub-system does the following trick in order to avoid this extra
70ff94bc40SHeiko Schocher  * copy. It always allocates a @ubi->vid_hdr_alsize bytes buffer for the VID
71ff94bc40SHeiko Schocher  * header and returns a pointer to offset @ubi->vid_hdr_shift of this buffer.
72ff94bc40SHeiko Schocher  * When the VID header is being written out, it shifts the VID header pointer
73ff94bc40SHeiko Schocher  * back and writes the whole sub-page.
742d262c48SKyungmin Park  */
752d262c48SKyungmin Park 
76ff94bc40SHeiko Schocher #ifndef __UBOOT__
772d262c48SKyungmin Park #include <linux/crc32.h>
782d262c48SKyungmin Park #include <linux/err.h>
79ff94bc40SHeiko Schocher #include <linux/slab.h>
80ff94bc40SHeiko Schocher #else
81*f8c987f8SAlexey Brodkin #include <hexdump.h>
82ff94bc40SHeiko Schocher #include <ubi_uboot.h>
832d262c48SKyungmin Park #endif
842d262c48SKyungmin Park 
852d262c48SKyungmin Park #include "ubi.h"
862d262c48SKyungmin Park 
87ff94bc40SHeiko Schocher static int self_check_not_bad(const struct ubi_device *ubi, int pnum);
88ff94bc40SHeiko Schocher static int self_check_peb_ec_hdr(const struct ubi_device *ubi, int pnum);
89ff94bc40SHeiko Schocher static int self_check_ec_hdr(const struct ubi_device *ubi, int pnum,
902d262c48SKyungmin Park 			     const struct ubi_ec_hdr *ec_hdr);
91ff94bc40SHeiko Schocher static int self_check_peb_vid_hdr(const struct ubi_device *ubi, int pnum);
92ff94bc40SHeiko Schocher static int self_check_vid_hdr(const struct ubi_device *ubi, int pnum,
932d262c48SKyungmin Park 			      const struct ubi_vid_hdr *vid_hdr);
94ff94bc40SHeiko Schocher static int self_check_write(struct ubi_device *ubi, const void *buf, int pnum,
95ff94bc40SHeiko Schocher 			    int offset, int len);
962d262c48SKyungmin Park 
972d262c48SKyungmin Park /**
982d262c48SKyungmin Park  * ubi_io_read - read data from a physical eraseblock.
992d262c48SKyungmin Park  * @ubi: UBI device description object
1002d262c48SKyungmin Park  * @buf: buffer where to store the read data
1012d262c48SKyungmin Park  * @pnum: physical eraseblock number to read from
1022d262c48SKyungmin Park  * @offset: offset within the physical eraseblock from where to read
1032d262c48SKyungmin Park  * @len: how many bytes to read
1042d262c48SKyungmin Park  *
1052d262c48SKyungmin Park  * This function reads data from offset @offset of physical eraseblock @pnum
1062d262c48SKyungmin Park  * and stores the read data in the @buf buffer. The following return codes are
1072d262c48SKyungmin Park  * possible:
1082d262c48SKyungmin Park  *
1092d262c48SKyungmin Park  * o %0 if all the requested data were successfully read;
1102d262c48SKyungmin Park  * o %UBI_IO_BITFLIPS if all the requested data were successfully read, but
1112d262c48SKyungmin Park  *   correctable bit-flips were detected; this is harmless but may indicate
1122d262c48SKyungmin Park  *   that this eraseblock may become bad soon (but do not have to);
1132d262c48SKyungmin Park  * o %-EBADMSG if the MTD subsystem reported about data integrity problems, for
1142d262c48SKyungmin Park  *   example it can be an ECC error in case of NAND; this most probably means
1152d262c48SKyungmin Park  *   that the data is corrupted;
1162d262c48SKyungmin Park  * o %-EIO if some I/O error occurred;
1172d262c48SKyungmin Park  * o other negative error codes in case of other errors.
1182d262c48SKyungmin Park  */
ubi_io_read(const struct ubi_device * ubi,void * buf,int pnum,int offset,int len)1192d262c48SKyungmin Park int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset,
1202d262c48SKyungmin Park 		int len)
1212d262c48SKyungmin Park {
1222d262c48SKyungmin Park 	int err, retries = 0;
1232d262c48SKyungmin Park 	size_t read;
1242d262c48SKyungmin Park 	loff_t addr;
1252d262c48SKyungmin Park 
1262d262c48SKyungmin Park 	dbg_io("read %d bytes from PEB %d:%d", len, pnum, offset);
1272d262c48SKyungmin Park 
1282d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
1292d262c48SKyungmin Park 	ubi_assert(offset >= 0 && offset + len <= ubi->peb_size);
1302d262c48SKyungmin Park 	ubi_assert(len > 0);
1312d262c48SKyungmin Park 
132ff94bc40SHeiko Schocher 	err = self_check_not_bad(ubi, pnum);
1332d262c48SKyungmin Park 	if (err)
134ff94bc40SHeiko Schocher 		return err;
135ff94bc40SHeiko Schocher 
136ff94bc40SHeiko Schocher 	/*
137ff94bc40SHeiko Schocher 	 * Deliberately corrupt the buffer to improve robustness. Indeed, if we
138ff94bc40SHeiko Schocher 	 * do not do this, the following may happen:
139ff94bc40SHeiko Schocher 	 * 1. The buffer contains data from previous operation, e.g., read from
140ff94bc40SHeiko Schocher 	 *    another PEB previously. The data looks like expected, e.g., if we
141ff94bc40SHeiko Schocher 	 *    just do not read anything and return - the caller would not
142ff94bc40SHeiko Schocher 	 *    notice this. E.g., if we are reading a VID header, the buffer may
143ff94bc40SHeiko Schocher 	 *    contain a valid VID header from another PEB.
144ff94bc40SHeiko Schocher 	 * 2. The driver is buggy and returns us success or -EBADMSG or
145ff94bc40SHeiko Schocher 	 *    -EUCLEAN, but it does not actually put any data to the buffer.
146ff94bc40SHeiko Schocher 	 *
147ff94bc40SHeiko Schocher 	 * This may confuse UBI or upper layers - they may think the buffer
148ff94bc40SHeiko Schocher 	 * contains valid data while in fact it is just old data. This is
149ff94bc40SHeiko Schocher 	 * especially possible because UBI (and UBIFS) relies on CRC, and
150ff94bc40SHeiko Schocher 	 * treats data as correct even in case of ECC errors if the CRC is
151ff94bc40SHeiko Schocher 	 * correct.
152ff94bc40SHeiko Schocher 	 *
153ff94bc40SHeiko Schocher 	 * Try to prevent this situation by changing the first byte of the
154ff94bc40SHeiko Schocher 	 * buffer.
155ff94bc40SHeiko Schocher 	 */
156ff94bc40SHeiko Schocher 	*((uint8_t *)buf) ^= 0xFF;
1572d262c48SKyungmin Park 
1582d262c48SKyungmin Park 	addr = (loff_t)pnum * ubi->peb_size + offset;
1592d262c48SKyungmin Park retry:
160dfe64e2cSSergey Lapin 	err = mtd_read(ubi->mtd, addr, len, &read, buf);
1612d262c48SKyungmin Park 	if (err) {
162ff94bc40SHeiko Schocher 		const char *errstr = mtd_is_eccerr(err) ? " (ECC error)" : "";
163ff94bc40SHeiko Schocher 
164ff94bc40SHeiko Schocher 		if (mtd_is_bitflip(err)) {
1652d262c48SKyungmin Park 			/*
1662d262c48SKyungmin Park 			 * -EUCLEAN is reported if there was a bit-flip which
1672d262c48SKyungmin Park 			 * was corrected, so this is harmless.
168ff94bc40SHeiko Schocher 			 *
169ff94bc40SHeiko Schocher 			 * We do not report about it here unless debugging is
170ff94bc40SHeiko Schocher 			 * enabled. A corresponding message will be printed
171ff94bc40SHeiko Schocher 			 * later, when it is has been scrubbed.
1722d262c48SKyungmin Park 			 */
1730195a7bbSHeiko Schocher 			ubi_msg(ubi, "fixable bit-flip detected at PEB %d",
1740195a7bbSHeiko Schocher 				pnum);
1752d262c48SKyungmin Park 			ubi_assert(len == read);
1762d262c48SKyungmin Park 			return UBI_IO_BITFLIPS;
1772d262c48SKyungmin Park 		}
1782d262c48SKyungmin Park 
179ff94bc40SHeiko Schocher 		if (retries++ < UBI_IO_RETRIES) {
1800195a7bbSHeiko Schocher 			ubi_warn(ubi, "error %d%s while reading %d bytes from PEB %d:%d, read only %zd bytes, retry",
181ff94bc40SHeiko Schocher 				 err, errstr, len, pnum, offset, read);
1822d262c48SKyungmin Park 			yield();
1832d262c48SKyungmin Park 			goto retry;
1842d262c48SKyungmin Park 		}
1852d262c48SKyungmin Park 
1860195a7bbSHeiko Schocher 		ubi_err(ubi, "error %d%s while reading %d bytes from PEB %d:%d, read %zd bytes",
187ff94bc40SHeiko Schocher 			err, errstr, len, pnum, offset, read);
188ff94bc40SHeiko Schocher 		dump_stack();
1892d262c48SKyungmin Park 
1902d262c48SKyungmin Park 		/*
1912d262c48SKyungmin Park 		 * The driver should never return -EBADMSG if it failed to read
1922d262c48SKyungmin Park 		 * all the requested data. But some buggy drivers might do
1932d262c48SKyungmin Park 		 * this, so we change it to -EIO.
1942d262c48SKyungmin Park 		 */
195ff94bc40SHeiko Schocher 		if (read != len && mtd_is_eccerr(err)) {
1962d262c48SKyungmin Park 			ubi_assert(0);
197ff94bc40SHeiko Schocher 			err = -EIO;
1982d262c48SKyungmin Park 		}
1992d262c48SKyungmin Park 	} else {
2002d262c48SKyungmin Park 		ubi_assert(len == read);
2012d262c48SKyungmin Park 
202ff94bc40SHeiko Schocher 		if (ubi_dbg_is_bitflip(ubi)) {
203ff94bc40SHeiko Schocher 			dbg_gen("bit-flip (emulated)");
2042d262c48SKyungmin Park 			err = UBI_IO_BITFLIPS;
2052d262c48SKyungmin Park 		}
2062d262c48SKyungmin Park 	}
2072d262c48SKyungmin Park 
2082d262c48SKyungmin Park 	return err;
2092d262c48SKyungmin Park }
2102d262c48SKyungmin Park 
2112d262c48SKyungmin Park /**
2122d262c48SKyungmin Park  * ubi_io_write - write data to a physical eraseblock.
2132d262c48SKyungmin Park  * @ubi: UBI device description object
2142d262c48SKyungmin Park  * @buf: buffer with the data to write
2152d262c48SKyungmin Park  * @pnum: physical eraseblock number to write to
2162d262c48SKyungmin Park  * @offset: offset within the physical eraseblock where to write
2172d262c48SKyungmin Park  * @len: how many bytes to write
2182d262c48SKyungmin Park  *
2192d262c48SKyungmin Park  * This function writes @len bytes of data from buffer @buf to offset @offset
2202d262c48SKyungmin Park  * of physical eraseblock @pnum. If all the data were successfully written,
2212d262c48SKyungmin Park  * zero is returned. If an error occurred, this function returns a negative
2222d262c48SKyungmin Park  * error code. If %-EIO is returned, the physical eraseblock most probably went
2232d262c48SKyungmin Park  * bad.
2242d262c48SKyungmin Park  *
2252d262c48SKyungmin Park  * Note, in case of an error, it is possible that something was still written
2262d262c48SKyungmin Park  * to the flash media, but may be some garbage.
2272d262c48SKyungmin Park  */
ubi_io_write(struct ubi_device * ubi,const void * buf,int pnum,int offset,int len)2282d262c48SKyungmin Park int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset,
2292d262c48SKyungmin Park 		 int len)
2302d262c48SKyungmin Park {
2312d262c48SKyungmin Park 	int err;
2322d262c48SKyungmin Park 	size_t written;
2332d262c48SKyungmin Park 	loff_t addr;
2342d262c48SKyungmin Park 
2352d262c48SKyungmin Park 	dbg_io("write %d bytes to PEB %d:%d", len, pnum, offset);
2362d262c48SKyungmin Park 
2372d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
2382d262c48SKyungmin Park 	ubi_assert(offset >= 0 && offset + len <= ubi->peb_size);
2392d262c48SKyungmin Park 	ubi_assert(offset % ubi->hdrs_min_io_size == 0);
2402d262c48SKyungmin Park 	ubi_assert(len > 0 && len % ubi->hdrs_min_io_size == 0);
2412d262c48SKyungmin Park 
2422d262c48SKyungmin Park 	if (ubi->ro_mode) {
2430195a7bbSHeiko Schocher 		ubi_err(ubi, "read-only mode");
2442d262c48SKyungmin Park 		return -EROFS;
2452d262c48SKyungmin Park 	}
2462d262c48SKyungmin Park 
247ff94bc40SHeiko Schocher 	err = self_check_not_bad(ubi, pnum);
2482d262c48SKyungmin Park 	if (err)
249ff94bc40SHeiko Schocher 		return err;
2502d262c48SKyungmin Park 
2512d262c48SKyungmin Park 	/* The area we are writing to has to contain all 0xFF bytes */
252ff94bc40SHeiko Schocher 	err = ubi_self_check_all_ff(ubi, pnum, offset, len);
2532d262c48SKyungmin Park 	if (err)
254ff94bc40SHeiko Schocher 		return err;
2552d262c48SKyungmin Park 
2562d262c48SKyungmin Park 	if (offset >= ubi->leb_start) {
2572d262c48SKyungmin Park 		/*
2582d262c48SKyungmin Park 		 * We write to the data area of the physical eraseblock. Make
2592d262c48SKyungmin Park 		 * sure it has valid EC and VID headers.
2602d262c48SKyungmin Park 		 */
261ff94bc40SHeiko Schocher 		err = self_check_peb_ec_hdr(ubi, pnum);
2622d262c48SKyungmin Park 		if (err)
263ff94bc40SHeiko Schocher 			return err;
264ff94bc40SHeiko Schocher 		err = self_check_peb_vid_hdr(ubi, pnum);
2652d262c48SKyungmin Park 		if (err)
266ff94bc40SHeiko Schocher 			return err;
2672d262c48SKyungmin Park 	}
2682d262c48SKyungmin Park 
269ff94bc40SHeiko Schocher 	if (ubi_dbg_is_write_failure(ubi)) {
2700195a7bbSHeiko Schocher 		ubi_err(ubi, "cannot write %d bytes to PEB %d:%d (emulated)",
271ff94bc40SHeiko Schocher 			len, pnum, offset);
272ff94bc40SHeiko Schocher 		dump_stack();
2732d262c48SKyungmin Park 		return -EIO;
2742d262c48SKyungmin Park 	}
2752d262c48SKyungmin Park 
2762d262c48SKyungmin Park 	addr = (loff_t)pnum * ubi->peb_size + offset;
277dfe64e2cSSergey Lapin 	err = mtd_write(ubi->mtd, addr, len, &written, buf);
2782d262c48SKyungmin Park 	if (err) {
2790195a7bbSHeiko Schocher 		ubi_err(ubi, "error %d while writing %d bytes to PEB %d:%d, written %zd bytes",
280ff94bc40SHeiko Schocher 			err, len, pnum, offset, written);
281ff94bc40SHeiko Schocher 		dump_stack();
282ff94bc40SHeiko Schocher 		ubi_dump_flash(ubi, pnum, offset, len);
2832d262c48SKyungmin Park 	} else
2842d262c48SKyungmin Park 		ubi_assert(written == len);
2852d262c48SKyungmin Park 
286ff94bc40SHeiko Schocher 	if (!err) {
287ff94bc40SHeiko Schocher 		err = self_check_write(ubi, buf, pnum, offset, len);
288ff94bc40SHeiko Schocher 		if (err)
289ff94bc40SHeiko Schocher 			return err;
290ff94bc40SHeiko Schocher 
291ff94bc40SHeiko Schocher 		/*
292ff94bc40SHeiko Schocher 		 * Since we always write sequentially, the rest of the PEB has
293ff94bc40SHeiko Schocher 		 * to contain only 0xFF bytes.
294ff94bc40SHeiko Schocher 		 */
295ff94bc40SHeiko Schocher 		offset += len;
296ff94bc40SHeiko Schocher 		len = ubi->peb_size - offset;
297ff94bc40SHeiko Schocher 		if (len)
298ff94bc40SHeiko Schocher 			err = ubi_self_check_all_ff(ubi, pnum, offset, len);
299ff94bc40SHeiko Schocher 	}
300ff94bc40SHeiko Schocher 
3012d262c48SKyungmin Park 	return err;
3022d262c48SKyungmin Park }
3032d262c48SKyungmin Park 
3042d262c48SKyungmin Park /**
3052d262c48SKyungmin Park  * erase_callback - MTD erasure call-back.
3062d262c48SKyungmin Park  * @ei: MTD erase information object.
3072d262c48SKyungmin Park  *
3082d262c48SKyungmin Park  * Note, even though MTD erase interface is asynchronous, all the current
3092d262c48SKyungmin Park  * implementations are synchronous anyway.
3102d262c48SKyungmin Park  */
erase_callback(struct erase_info * ei)3112d262c48SKyungmin Park static void erase_callback(struct erase_info *ei)
3122d262c48SKyungmin Park {
3132d262c48SKyungmin Park 	wake_up_interruptible((wait_queue_head_t *)ei->priv);
3142d262c48SKyungmin Park }
3152d262c48SKyungmin Park 
3162d262c48SKyungmin Park /**
3172d262c48SKyungmin Park  * do_sync_erase - synchronously erase a physical eraseblock.
3182d262c48SKyungmin Park  * @ubi: UBI device description object
3192d262c48SKyungmin Park  * @pnum: the physical eraseblock number to erase
3202d262c48SKyungmin Park  *
3212d262c48SKyungmin Park  * This function synchronously erases physical eraseblock @pnum and returns
3222d262c48SKyungmin Park  * zero in case of success and a negative error code in case of failure. If
3232d262c48SKyungmin Park  * %-EIO is returned, the physical eraseblock most probably went bad.
3242d262c48SKyungmin Park  */
do_sync_erase(struct ubi_device * ubi,int pnum)3252d262c48SKyungmin Park static int do_sync_erase(struct ubi_device *ubi, int pnum)
3262d262c48SKyungmin Park {
3272d262c48SKyungmin Park 	int err, retries = 0;
3282d262c48SKyungmin Park 	struct erase_info ei;
3292d262c48SKyungmin Park 	wait_queue_head_t wq;
3302d262c48SKyungmin Park 
3312d262c48SKyungmin Park 	dbg_io("erase PEB %d", pnum);
332ff94bc40SHeiko Schocher 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
333ff94bc40SHeiko Schocher 
334ff94bc40SHeiko Schocher 	if (ubi->ro_mode) {
3350195a7bbSHeiko Schocher 		ubi_err(ubi, "read-only mode");
336ff94bc40SHeiko Schocher 		return -EROFS;
337ff94bc40SHeiko Schocher 	}
3382d262c48SKyungmin Park 
3392d262c48SKyungmin Park retry:
3402d262c48SKyungmin Park 	init_waitqueue_head(&wq);
3412d262c48SKyungmin Park 	memset(&ei, 0, sizeof(struct erase_info));
3422d262c48SKyungmin Park 
3432d262c48SKyungmin Park 	ei.mtd      = ubi->mtd;
3442d262c48SKyungmin Park 	ei.addr     = (loff_t)pnum * ubi->peb_size;
3452d262c48SKyungmin Park 	ei.len      = ubi->peb_size;
3462d262c48SKyungmin Park 	ei.callback = erase_callback;
3472d262c48SKyungmin Park 	ei.priv     = (unsigned long)&wq;
3482d262c48SKyungmin Park 
349dfe64e2cSSergey Lapin 	err = mtd_erase(ubi->mtd, &ei);
3502d262c48SKyungmin Park 	if (err) {
3512d262c48SKyungmin Park 		if (retries++ < UBI_IO_RETRIES) {
3520195a7bbSHeiko Schocher 			ubi_warn(ubi, "error %d while erasing PEB %d, retry",
3532d262c48SKyungmin Park 				 err, pnum);
3542d262c48SKyungmin Park 			yield();
3552d262c48SKyungmin Park 			goto retry;
3562d262c48SKyungmin Park 		}
3570195a7bbSHeiko Schocher 		ubi_err(ubi, "cannot erase PEB %d, error %d", pnum, err);
358ff94bc40SHeiko Schocher 		dump_stack();
3592d262c48SKyungmin Park 		return err;
3602d262c48SKyungmin Park 	}
3612d262c48SKyungmin Park 
3622d262c48SKyungmin Park 	err = wait_event_interruptible(wq, ei.state == MTD_ERASE_DONE ||
3632d262c48SKyungmin Park 					   ei.state == MTD_ERASE_FAILED);
3642d262c48SKyungmin Park 	if (err) {
3650195a7bbSHeiko Schocher 		ubi_err(ubi, "interrupted PEB %d erasure", pnum);
3662d262c48SKyungmin Park 		return -EINTR;
3672d262c48SKyungmin Park 	}
3682d262c48SKyungmin Park 
3692d262c48SKyungmin Park 	if (ei.state == MTD_ERASE_FAILED) {
3702d262c48SKyungmin Park 		if (retries++ < UBI_IO_RETRIES) {
3710195a7bbSHeiko Schocher 			ubi_warn(ubi, "error while erasing PEB %d, retry",
3720195a7bbSHeiko Schocher 				 pnum);
3732d262c48SKyungmin Park 			yield();
3742d262c48SKyungmin Park 			goto retry;
3752d262c48SKyungmin Park 		}
3760195a7bbSHeiko Schocher 		ubi_err(ubi, "cannot erase PEB %d", pnum);
377ff94bc40SHeiko Schocher 		dump_stack();
3782d262c48SKyungmin Park 		return -EIO;
3792d262c48SKyungmin Park 	}
3802d262c48SKyungmin Park 
381ff94bc40SHeiko Schocher 	err = ubi_self_check_all_ff(ubi, pnum, 0, ubi->peb_size);
3822d262c48SKyungmin Park 	if (err)
383ff94bc40SHeiko Schocher 		return err;
3842d262c48SKyungmin Park 
385ff94bc40SHeiko Schocher 	if (ubi_dbg_is_erase_failure(ubi)) {
3860195a7bbSHeiko Schocher 		ubi_err(ubi, "cannot erase PEB %d (emulated)", pnum);
3872d262c48SKyungmin Park 		return -EIO;
3882d262c48SKyungmin Park 	}
3892d262c48SKyungmin Park 
3902d262c48SKyungmin Park 	return 0;
3912d262c48SKyungmin Park }
3922d262c48SKyungmin Park 
3932d262c48SKyungmin Park /* Patterns to write to a physical eraseblock when torturing it */
3942d262c48SKyungmin Park static uint8_t patterns[] = {0xa5, 0x5a, 0x0};
3952d262c48SKyungmin Park 
3962d262c48SKyungmin Park /**
3972d262c48SKyungmin Park  * torture_peb - test a supposedly bad physical eraseblock.
3982d262c48SKyungmin Park  * @ubi: UBI device description object
3992d262c48SKyungmin Park  * @pnum: the physical eraseblock number to test
4002d262c48SKyungmin Park  *
4012d262c48SKyungmin Park  * This function returns %-EIO if the physical eraseblock did not pass the
4022d262c48SKyungmin Park  * test, a positive number of erase operations done if the test was
4032d262c48SKyungmin Park  * successfully passed, and other negative error codes in case of other errors.
4042d262c48SKyungmin Park  */
torture_peb(struct ubi_device * ubi,int pnum)4052d262c48SKyungmin Park static int torture_peb(struct ubi_device *ubi, int pnum)
4062d262c48SKyungmin Park {
4072d262c48SKyungmin Park 	int err, i, patt_count;
4082d262c48SKyungmin Park 
4090195a7bbSHeiko Schocher 	ubi_msg(ubi, "run torture test for PEB %d", pnum);
4102d262c48SKyungmin Park 	patt_count = ARRAY_SIZE(patterns);
4112d262c48SKyungmin Park 	ubi_assert(patt_count > 0);
4122d262c48SKyungmin Park 
4132d262c48SKyungmin Park 	mutex_lock(&ubi->buf_mutex);
4142d262c48SKyungmin Park 	for (i = 0; i < patt_count; i++) {
4152d262c48SKyungmin Park 		err = do_sync_erase(ubi, pnum);
4162d262c48SKyungmin Park 		if (err)
4172d262c48SKyungmin Park 			goto out;
4182d262c48SKyungmin Park 
4192d262c48SKyungmin Park 		/* Make sure the PEB contains only 0xFF bytes */
420ff94bc40SHeiko Schocher 		err = ubi_io_read(ubi, ubi->peb_buf, pnum, 0, ubi->peb_size);
4212d262c48SKyungmin Park 		if (err)
4222d262c48SKyungmin Park 			goto out;
4232d262c48SKyungmin Park 
424ff94bc40SHeiko Schocher 		err = ubi_check_pattern(ubi->peb_buf, 0xFF, ubi->peb_size);
4252d262c48SKyungmin Park 		if (err == 0) {
4260195a7bbSHeiko Schocher 			ubi_err(ubi, "erased PEB %d, but a non-0xFF byte found",
4272d262c48SKyungmin Park 				pnum);
4282d262c48SKyungmin Park 			err = -EIO;
4292d262c48SKyungmin Park 			goto out;
4302d262c48SKyungmin Park 		}
4312d262c48SKyungmin Park 
4322d262c48SKyungmin Park 		/* Write a pattern and check it */
433ff94bc40SHeiko Schocher 		memset(ubi->peb_buf, patterns[i], ubi->peb_size);
434ff94bc40SHeiko Schocher 		err = ubi_io_write(ubi, ubi->peb_buf, pnum, 0, ubi->peb_size);
4352d262c48SKyungmin Park 		if (err)
4362d262c48SKyungmin Park 			goto out;
4372d262c48SKyungmin Park 
438ff94bc40SHeiko Schocher 		memset(ubi->peb_buf, ~patterns[i], ubi->peb_size);
439ff94bc40SHeiko Schocher 		err = ubi_io_read(ubi, ubi->peb_buf, pnum, 0, ubi->peb_size);
4402d262c48SKyungmin Park 		if (err)
4412d262c48SKyungmin Park 			goto out;
4422d262c48SKyungmin Park 
443ff94bc40SHeiko Schocher 		err = ubi_check_pattern(ubi->peb_buf, patterns[i],
444ff94bc40SHeiko Schocher 					ubi->peb_size);
4452d262c48SKyungmin Park 		if (err == 0) {
4460195a7bbSHeiko Schocher 			ubi_err(ubi, "pattern %x checking failed for PEB %d",
4472d262c48SKyungmin Park 				patterns[i], pnum);
4482d262c48SKyungmin Park 			err = -EIO;
4492d262c48SKyungmin Park 			goto out;
4502d262c48SKyungmin Park 		}
4512d262c48SKyungmin Park 	}
4522d262c48SKyungmin Park 
4532d262c48SKyungmin Park 	err = patt_count;
4540195a7bbSHeiko Schocher 	ubi_msg(ubi, "PEB %d passed torture test, do not mark it as bad", pnum);
4552d262c48SKyungmin Park 
4562d262c48SKyungmin Park out:
4572d262c48SKyungmin Park 	mutex_unlock(&ubi->buf_mutex);
458ff94bc40SHeiko Schocher 	if (err == UBI_IO_BITFLIPS || mtd_is_eccerr(err)) {
4592d262c48SKyungmin Park 		/*
4602d262c48SKyungmin Park 		 * If a bit-flip or data integrity error was detected, the test
4612d262c48SKyungmin Park 		 * has not passed because it happened on a freshly erased
4622d262c48SKyungmin Park 		 * physical eraseblock which means something is wrong with it.
4632d262c48SKyungmin Park 		 */
4640195a7bbSHeiko Schocher 		ubi_err(ubi, "read problems on freshly erased PEB %d, must be bad",
4652d262c48SKyungmin Park 			pnum);
4662d262c48SKyungmin Park 		err = -EIO;
4672d262c48SKyungmin Park 	}
4682d262c48SKyungmin Park 	return err;
4692d262c48SKyungmin Park }
4702d262c48SKyungmin Park 
4712d262c48SKyungmin Park /**
472ff94bc40SHeiko Schocher  * nor_erase_prepare - prepare a NOR flash PEB for erasure.
473ff94bc40SHeiko Schocher  * @ubi: UBI device description object
474ff94bc40SHeiko Schocher  * @pnum: physical eraseblock number to prepare
475ff94bc40SHeiko Schocher  *
476ff94bc40SHeiko Schocher  * NOR flash, or at least some of them, have peculiar embedded PEB erasure
477ff94bc40SHeiko Schocher  * algorithm: the PEB is first filled with zeroes, then it is erased. And
478ff94bc40SHeiko Schocher  * filling with zeroes starts from the end of the PEB. This was observed with
479ff94bc40SHeiko Schocher  * Spansion S29GL512N NOR flash.
480ff94bc40SHeiko Schocher  *
481ff94bc40SHeiko Schocher  * This means that in case of a power cut we may end up with intact data at the
482ff94bc40SHeiko Schocher  * beginning of the PEB, and all zeroes at the end of PEB. In other words, the
483ff94bc40SHeiko Schocher  * EC and VID headers are OK, but a large chunk of data at the end of PEB is
484ff94bc40SHeiko Schocher  * zeroed. This makes UBI mistakenly treat this PEB as used and associate it
485ff94bc40SHeiko Schocher  * with an LEB, which leads to subsequent failures (e.g., UBIFS fails).
486ff94bc40SHeiko Schocher  *
487ff94bc40SHeiko Schocher  * This function is called before erasing NOR PEBs and it zeroes out EC and VID
488ff94bc40SHeiko Schocher  * magic numbers in order to invalidate them and prevent the failures. Returns
489ff94bc40SHeiko Schocher  * zero in case of success and a negative error code in case of failure.
490ff94bc40SHeiko Schocher  */
nor_erase_prepare(struct ubi_device * ubi,int pnum)491ff94bc40SHeiko Schocher static int nor_erase_prepare(struct ubi_device *ubi, int pnum)
492ff94bc40SHeiko Schocher {
493ff94bc40SHeiko Schocher 	int err;
494ff94bc40SHeiko Schocher 	size_t written;
495ff94bc40SHeiko Schocher 	loff_t addr;
496ff94bc40SHeiko Schocher 	uint32_t data = 0;
497ff94bc40SHeiko Schocher 	struct ubi_ec_hdr ec_hdr;
498ff94bc40SHeiko Schocher 
499ff94bc40SHeiko Schocher 	/*
500ff94bc40SHeiko Schocher 	 * Note, we cannot generally define VID header buffers on stack,
501ff94bc40SHeiko Schocher 	 * because of the way we deal with these buffers (see the header
502ff94bc40SHeiko Schocher 	 * comment in this file). But we know this is a NOR-specific piece of
503ff94bc40SHeiko Schocher 	 * code, so we can do this. But yes, this is error-prone and we should
504ff94bc40SHeiko Schocher 	 * (pre-)allocate VID header buffer instead.
505ff94bc40SHeiko Schocher 	 */
506ff94bc40SHeiko Schocher 	struct ubi_vid_hdr vid_hdr;
507ff94bc40SHeiko Schocher 
508ff94bc40SHeiko Schocher 	/*
509ff94bc40SHeiko Schocher 	 * If VID or EC is valid, we have to corrupt them before erasing.
510ff94bc40SHeiko Schocher 	 * It is important to first invalidate the EC header, and then the VID
511ff94bc40SHeiko Schocher 	 * header. Otherwise a power cut may lead to valid EC header and
512ff94bc40SHeiko Schocher 	 * invalid VID header, in which case UBI will treat this PEB as
513ff94bc40SHeiko Schocher 	 * corrupted and will try to preserve it, and print scary warnings.
514ff94bc40SHeiko Schocher 	 */
515ff94bc40SHeiko Schocher 	addr = (loff_t)pnum * ubi->peb_size;
516ff94bc40SHeiko Schocher 	err = ubi_io_read_ec_hdr(ubi, pnum, &ec_hdr, 0);
517ff94bc40SHeiko Schocher 	if (err != UBI_IO_BAD_HDR_EBADMSG && err != UBI_IO_BAD_HDR &&
518ff94bc40SHeiko Schocher 	    err != UBI_IO_FF){
519ff94bc40SHeiko Schocher 		err = mtd_write(ubi->mtd, addr, 4, &written, (void *)&data);
520ff94bc40SHeiko Schocher 		if(err)
521ff94bc40SHeiko Schocher 			goto error;
522ff94bc40SHeiko Schocher 	}
523ff94bc40SHeiko Schocher 
524ff94bc40SHeiko Schocher 	err = ubi_io_read_vid_hdr(ubi, pnum, &vid_hdr, 0);
525ff94bc40SHeiko Schocher 	if (err != UBI_IO_BAD_HDR_EBADMSG && err != UBI_IO_BAD_HDR &&
526ff94bc40SHeiko Schocher 	    err != UBI_IO_FF){
527ff94bc40SHeiko Schocher 		addr += ubi->vid_hdr_aloffset;
528ff94bc40SHeiko Schocher 		err = mtd_write(ubi->mtd, addr, 4, &written, (void *)&data);
529ff94bc40SHeiko Schocher 		if (err)
530ff94bc40SHeiko Schocher 			goto error;
531ff94bc40SHeiko Schocher 	}
532ff94bc40SHeiko Schocher 	return 0;
533ff94bc40SHeiko Schocher 
534ff94bc40SHeiko Schocher error:
535ff94bc40SHeiko Schocher 	/*
536ff94bc40SHeiko Schocher 	 * The PEB contains a valid VID or EC header, but we cannot invalidate
537ff94bc40SHeiko Schocher 	 * it. Supposedly the flash media or the driver is screwed up, so
538ff94bc40SHeiko Schocher 	 * return an error.
539ff94bc40SHeiko Schocher 	 */
5400195a7bbSHeiko Schocher 	ubi_err(ubi, "cannot invalidate PEB %d, write returned %d", pnum, err);
541ff94bc40SHeiko Schocher 	ubi_dump_flash(ubi, pnum, 0, ubi->peb_size);
542ff94bc40SHeiko Schocher 	return -EIO;
543ff94bc40SHeiko Schocher }
544ff94bc40SHeiko Schocher 
545ff94bc40SHeiko Schocher /**
5462d262c48SKyungmin Park  * ubi_io_sync_erase - synchronously erase a physical eraseblock.
5472d262c48SKyungmin Park  * @ubi: UBI device description object
5482d262c48SKyungmin Park  * @pnum: physical eraseblock number to erase
5492d262c48SKyungmin Park  * @torture: if this physical eraseblock has to be tortured
5502d262c48SKyungmin Park  *
5512d262c48SKyungmin Park  * This function synchronously erases physical eraseblock @pnum. If @torture
5522d262c48SKyungmin Park  * flag is not zero, the physical eraseblock is checked by means of writing
5532d262c48SKyungmin Park  * different patterns to it and reading them back. If the torturing is enabled,
554ff94bc40SHeiko Schocher  * the physical eraseblock is erased more than once.
5552d262c48SKyungmin Park  *
5562d262c48SKyungmin Park  * This function returns the number of erasures made in case of success, %-EIO
5572d262c48SKyungmin Park  * if the erasure failed or the torturing test failed, and other negative error
5582d262c48SKyungmin Park  * codes in case of other errors. Note, %-EIO means that the physical
5592d262c48SKyungmin Park  * eraseblock is bad.
5602d262c48SKyungmin Park  */
ubi_io_sync_erase(struct ubi_device * ubi,int pnum,int torture)5612d262c48SKyungmin Park int ubi_io_sync_erase(struct ubi_device *ubi, int pnum, int torture)
5622d262c48SKyungmin Park {
5632d262c48SKyungmin Park 	int err, ret = 0;
5642d262c48SKyungmin Park 
5652d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
5662d262c48SKyungmin Park 
567ff94bc40SHeiko Schocher 	err = self_check_not_bad(ubi, pnum);
5682d262c48SKyungmin Park 	if (err != 0)
569ff94bc40SHeiko Schocher 		return err;
5702d262c48SKyungmin Park 
5712d262c48SKyungmin Park 	if (ubi->ro_mode) {
5720195a7bbSHeiko Schocher 		ubi_err(ubi, "read-only mode");
5732d262c48SKyungmin Park 		return -EROFS;
5742d262c48SKyungmin Park 	}
5752d262c48SKyungmin Park 
576ff94bc40SHeiko Schocher 	if (ubi->nor_flash) {
577ff94bc40SHeiko Schocher 		err = nor_erase_prepare(ubi, pnum);
578ff94bc40SHeiko Schocher 		if (err)
579ff94bc40SHeiko Schocher 			return err;
580ff94bc40SHeiko Schocher 	}
581ff94bc40SHeiko Schocher 
5822d262c48SKyungmin Park 	if (torture) {
5832d262c48SKyungmin Park 		ret = torture_peb(ubi, pnum);
5842d262c48SKyungmin Park 		if (ret < 0)
5852d262c48SKyungmin Park 			return ret;
5862d262c48SKyungmin Park 	}
5872d262c48SKyungmin Park 
5882d262c48SKyungmin Park 	err = do_sync_erase(ubi, pnum);
5892d262c48SKyungmin Park 	if (err)
5902d262c48SKyungmin Park 		return err;
5912d262c48SKyungmin Park 
5922d262c48SKyungmin Park 	return ret + 1;
5932d262c48SKyungmin Park }
5942d262c48SKyungmin Park 
5952d262c48SKyungmin Park /**
5962d262c48SKyungmin Park  * ubi_io_is_bad - check if a physical eraseblock is bad.
5972d262c48SKyungmin Park  * @ubi: UBI device description object
5982d262c48SKyungmin Park  * @pnum: the physical eraseblock number to check
5992d262c48SKyungmin Park  *
6002d262c48SKyungmin Park  * This function returns a positive number if the physical eraseblock is bad,
6012d262c48SKyungmin Park  * zero if not, and a negative error code if an error occurred.
6022d262c48SKyungmin Park  */
ubi_io_is_bad(const struct ubi_device * ubi,int pnum)6032d262c48SKyungmin Park int ubi_io_is_bad(const struct ubi_device *ubi, int pnum)
6042d262c48SKyungmin Park {
6052d262c48SKyungmin Park 	struct mtd_info *mtd = ubi->mtd;
6062d262c48SKyungmin Park 
6072d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
6082d262c48SKyungmin Park 
6092d262c48SKyungmin Park 	if (ubi->bad_allowed) {
6102d262c48SKyungmin Park 		int ret;
6112d262c48SKyungmin Park 
612dfe64e2cSSergey Lapin 		ret = mtd_block_isbad(mtd, (loff_t)pnum * ubi->peb_size);
6132d262c48SKyungmin Park 		if (ret < 0)
6140195a7bbSHeiko Schocher 			ubi_err(ubi, "error %d while checking if PEB %d is bad",
6152d262c48SKyungmin Park 				ret, pnum);
6162d262c48SKyungmin Park 		else if (ret)
6172d262c48SKyungmin Park 			dbg_io("PEB %d is bad", pnum);
6182d262c48SKyungmin Park 		return ret;
6192d262c48SKyungmin Park 	}
6202d262c48SKyungmin Park 
6212d262c48SKyungmin Park 	return 0;
6222d262c48SKyungmin Park }
6232d262c48SKyungmin Park 
6242d262c48SKyungmin Park /**
6252d262c48SKyungmin Park  * ubi_io_mark_bad - mark a physical eraseblock as bad.
6262d262c48SKyungmin Park  * @ubi: UBI device description object
6272d262c48SKyungmin Park  * @pnum: the physical eraseblock number to mark
6282d262c48SKyungmin Park  *
6292d262c48SKyungmin Park  * This function returns zero in case of success and a negative error code in
6302d262c48SKyungmin Park  * case of failure.
6312d262c48SKyungmin Park  */
ubi_io_mark_bad(const struct ubi_device * ubi,int pnum)6322d262c48SKyungmin Park int ubi_io_mark_bad(const struct ubi_device *ubi, int pnum)
6332d262c48SKyungmin Park {
6342d262c48SKyungmin Park 	int err;
6352d262c48SKyungmin Park 	struct mtd_info *mtd = ubi->mtd;
6362d262c48SKyungmin Park 
6372d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
6382d262c48SKyungmin Park 
6392d262c48SKyungmin Park 	if (ubi->ro_mode) {
6400195a7bbSHeiko Schocher 		ubi_err(ubi, "read-only mode");
6412d262c48SKyungmin Park 		return -EROFS;
6422d262c48SKyungmin Park 	}
6432d262c48SKyungmin Park 
6442d262c48SKyungmin Park 	if (!ubi->bad_allowed)
6452d262c48SKyungmin Park 		return 0;
6462d262c48SKyungmin Park 
647dfe64e2cSSergey Lapin 	err = mtd_block_markbad(mtd, (loff_t)pnum * ubi->peb_size);
6482d262c48SKyungmin Park 	if (err)
6490195a7bbSHeiko Schocher 		ubi_err(ubi, "cannot mark PEB %d bad, error %d", pnum, err);
6502d262c48SKyungmin Park 	return err;
6512d262c48SKyungmin Park }
6522d262c48SKyungmin Park 
6532d262c48SKyungmin Park /**
6542d262c48SKyungmin Park  * validate_ec_hdr - validate an erase counter header.
6552d262c48SKyungmin Park  * @ubi: UBI device description object
6562d262c48SKyungmin Park  * @ec_hdr: the erase counter header to check
6572d262c48SKyungmin Park  *
6582d262c48SKyungmin Park  * This function returns zero if the erase counter header is OK, and %1 if
6592d262c48SKyungmin Park  * not.
6602d262c48SKyungmin Park  */
validate_ec_hdr(const struct ubi_device * ubi,const struct ubi_ec_hdr * ec_hdr)6612d262c48SKyungmin Park static int validate_ec_hdr(const struct ubi_device *ubi,
6622d262c48SKyungmin Park 			   const struct ubi_ec_hdr *ec_hdr)
6632d262c48SKyungmin Park {
6642d262c48SKyungmin Park 	long long ec;
6652d262c48SKyungmin Park 	int vid_hdr_offset, leb_start;
6662d262c48SKyungmin Park 
6672d262c48SKyungmin Park 	ec = be64_to_cpu(ec_hdr->ec);
6682d262c48SKyungmin Park 	vid_hdr_offset = be32_to_cpu(ec_hdr->vid_hdr_offset);
6692d262c48SKyungmin Park 	leb_start = be32_to_cpu(ec_hdr->data_offset);
6702d262c48SKyungmin Park 
6712d262c48SKyungmin Park 	if (ec_hdr->version != UBI_VERSION) {
6720195a7bbSHeiko Schocher 		ubi_err(ubi, "node with incompatible UBI version found: this UBI version is %d, image version is %d",
6732d262c48SKyungmin Park 			UBI_VERSION, (int)ec_hdr->version);
6742d262c48SKyungmin Park 		goto bad;
6752d262c48SKyungmin Park 	}
6762d262c48SKyungmin Park 
6772d262c48SKyungmin Park 	if (vid_hdr_offset != ubi->vid_hdr_offset) {
6780195a7bbSHeiko Schocher 		ubi_err(ubi, "bad VID header offset %d, expected %d",
6792d262c48SKyungmin Park 			vid_hdr_offset, ubi->vid_hdr_offset);
6802d262c48SKyungmin Park 		goto bad;
6812d262c48SKyungmin Park 	}
6822d262c48SKyungmin Park 
6832d262c48SKyungmin Park 	if (leb_start != ubi->leb_start) {
6840195a7bbSHeiko Schocher 		ubi_err(ubi, "bad data offset %d, expected %d",
6852d262c48SKyungmin Park 			leb_start, ubi->leb_start);
6862d262c48SKyungmin Park 		goto bad;
6872d262c48SKyungmin Park 	}
6882d262c48SKyungmin Park 
6892d262c48SKyungmin Park 	if (ec < 0 || ec > UBI_MAX_ERASECOUNTER) {
6900195a7bbSHeiko Schocher 		ubi_err(ubi, "bad erase counter %lld", ec);
6912d262c48SKyungmin Park 		goto bad;
6922d262c48SKyungmin Park 	}
6932d262c48SKyungmin Park 
6942d262c48SKyungmin Park 	return 0;
6952d262c48SKyungmin Park 
6962d262c48SKyungmin Park bad:
6970195a7bbSHeiko Schocher 	ubi_err(ubi, "bad EC header");
698ff94bc40SHeiko Schocher 	ubi_dump_ec_hdr(ec_hdr);
699ff94bc40SHeiko Schocher 	dump_stack();
7002d262c48SKyungmin Park 	return 1;
7012d262c48SKyungmin Park }
7022d262c48SKyungmin Park 
7032d262c48SKyungmin Park /**
7042d262c48SKyungmin Park  * ubi_io_read_ec_hdr - read and check an erase counter header.
7052d262c48SKyungmin Park  * @ubi: UBI device description object
7062d262c48SKyungmin Park  * @pnum: physical eraseblock to read from
7072d262c48SKyungmin Park  * @ec_hdr: a &struct ubi_ec_hdr object where to store the read erase counter
7082d262c48SKyungmin Park  * header
7092d262c48SKyungmin Park  * @verbose: be verbose if the header is corrupted or was not found
7102d262c48SKyungmin Park  *
7112d262c48SKyungmin Park  * This function reads erase counter header from physical eraseblock @pnum and
7122d262c48SKyungmin Park  * stores it in @ec_hdr. This function also checks CRC checksum of the read
7132d262c48SKyungmin Park  * erase counter header. The following codes may be returned:
7142d262c48SKyungmin Park  *
7152d262c48SKyungmin Park  * o %0 if the CRC checksum is correct and the header was successfully read;
7162d262c48SKyungmin Park  * o %UBI_IO_BITFLIPS if the CRC is correct, but bit-flips were detected
7172d262c48SKyungmin Park  *   and corrected by the flash driver; this is harmless but may indicate that
7182d262c48SKyungmin Park  *   this eraseblock may become bad soon (but may be not);
719ff94bc40SHeiko Schocher  * o %UBI_IO_BAD_HDR if the erase counter header is corrupted (a CRC error);
720ff94bc40SHeiko Schocher  * o %UBI_IO_BAD_HDR_EBADMSG is the same as %UBI_IO_BAD_HDR, but there also was
721ff94bc40SHeiko Schocher  *   a data integrity error (uncorrectable ECC error in case of NAND);
722ff94bc40SHeiko Schocher  * o %UBI_IO_FF if only 0xFF bytes were read (the PEB is supposedly empty)
7232d262c48SKyungmin Park  * o a negative error code in case of failure.
7242d262c48SKyungmin Park  */
ubi_io_read_ec_hdr(struct ubi_device * ubi,int pnum,struct ubi_ec_hdr * ec_hdr,int verbose)7252d262c48SKyungmin Park int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum,
7262d262c48SKyungmin Park 		       struct ubi_ec_hdr *ec_hdr, int verbose)
7272d262c48SKyungmin Park {
728ff94bc40SHeiko Schocher 	int err, read_err;
7292d262c48SKyungmin Park 	uint32_t crc, magic, hdr_crc;
7302d262c48SKyungmin Park 
7312d262c48SKyungmin Park 	dbg_io("read EC header from PEB %d", pnum);
7322d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
7332d262c48SKyungmin Park 
734ff94bc40SHeiko Schocher 	read_err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE);
735ff94bc40SHeiko Schocher 	if (read_err) {
736ff94bc40SHeiko Schocher 		if (read_err != UBI_IO_BITFLIPS && !mtd_is_eccerr(read_err))
737ff94bc40SHeiko Schocher 			return read_err;
7382d262c48SKyungmin Park 
7392d262c48SKyungmin Park 		/*
7402d262c48SKyungmin Park 		 * We read all the data, but either a correctable bit-flip
741ff94bc40SHeiko Schocher 		 * occurred, or MTD reported a data integrity error
742ff94bc40SHeiko Schocher 		 * (uncorrectable ECC error in case of NAND). The former is
743ff94bc40SHeiko Schocher 		 * harmless, the later may mean that the read data is
744ff94bc40SHeiko Schocher 		 * corrupted. But we have a CRC check-sum and we will detect
745ff94bc40SHeiko Schocher 		 * this. If the EC header is still OK, we just report this as
746ff94bc40SHeiko Schocher 		 * there was a bit-flip, to force scrubbing.
7472d262c48SKyungmin Park 		 */
7482d262c48SKyungmin Park 	}
7492d262c48SKyungmin Park 
7502d262c48SKyungmin Park 	magic = be32_to_cpu(ec_hdr->magic);
7512d262c48SKyungmin Park 	if (magic != UBI_EC_HDR_MAGIC) {
752ff94bc40SHeiko Schocher 		if (mtd_is_eccerr(read_err))
753ff94bc40SHeiko Schocher 			return UBI_IO_BAD_HDR_EBADMSG;
754ff94bc40SHeiko Schocher 
7552d262c48SKyungmin Park 		/*
7562d262c48SKyungmin Park 		 * The magic field is wrong. Let's check if we have read all
7572d262c48SKyungmin Park 		 * 0xFF. If yes, this physical eraseblock is assumed to be
7582d262c48SKyungmin Park 		 * empty.
7592d262c48SKyungmin Park 		 */
760ff94bc40SHeiko Schocher 		if (ubi_check_pattern(ec_hdr, 0xFF, UBI_EC_HDR_SIZE)) {
7612d262c48SKyungmin Park 			/* The physical eraseblock is supposedly empty */
7622d262c48SKyungmin Park 			if (verbose)
7630195a7bbSHeiko Schocher 				ubi_warn(ubi, "no EC header found at PEB %d, only 0xFF bytes",
764ff94bc40SHeiko Schocher 					 pnum);
765ff94bc40SHeiko Schocher 			dbg_bld("no EC header found at PEB %d, only 0xFF bytes",
766ff94bc40SHeiko Schocher 				pnum);
767ff94bc40SHeiko Schocher 			if (!read_err)
768ff94bc40SHeiko Schocher 				return UBI_IO_FF;
769ff94bc40SHeiko Schocher 			else
770ff94bc40SHeiko Schocher 				return UBI_IO_FF_BITFLIPS;
7712d262c48SKyungmin Park 		}
7722d262c48SKyungmin Park 
7732d262c48SKyungmin Park 		/*
7742d262c48SKyungmin Park 		 * This is not a valid erase counter header, and these are not
7752d262c48SKyungmin Park 		 * 0xFF bytes. Report that the header is corrupted.
7762d262c48SKyungmin Park 		 */
7772d262c48SKyungmin Park 		if (verbose) {
7780195a7bbSHeiko Schocher 			ubi_warn(ubi, "bad magic number at PEB %d: %08x instead of %08x",
779ff94bc40SHeiko Schocher 				 pnum, magic, UBI_EC_HDR_MAGIC);
780ff94bc40SHeiko Schocher 			ubi_dump_ec_hdr(ec_hdr);
7812d262c48SKyungmin Park 		}
782ff94bc40SHeiko Schocher 		dbg_bld("bad magic number at PEB %d: %08x instead of %08x",
783ff94bc40SHeiko Schocher 			pnum, magic, UBI_EC_HDR_MAGIC);
784ff94bc40SHeiko Schocher 		return UBI_IO_BAD_HDR;
7852d262c48SKyungmin Park 	}
7862d262c48SKyungmin Park 
7872d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, ec_hdr, UBI_EC_HDR_SIZE_CRC);
7882d262c48SKyungmin Park 	hdr_crc = be32_to_cpu(ec_hdr->hdr_crc);
7892d262c48SKyungmin Park 
7902d262c48SKyungmin Park 	if (hdr_crc != crc) {
7912d262c48SKyungmin Park 		if (verbose) {
7920195a7bbSHeiko Schocher 			ubi_warn(ubi, "bad EC header CRC at PEB %d, calculated %#08x, read %#08x",
793ff94bc40SHeiko Schocher 				 pnum, crc, hdr_crc);
794ff94bc40SHeiko Schocher 			ubi_dump_ec_hdr(ec_hdr);
7952d262c48SKyungmin Park 		}
796ff94bc40SHeiko Schocher 		dbg_bld("bad EC header CRC at PEB %d, calculated %#08x, read %#08x",
797ff94bc40SHeiko Schocher 			pnum, crc, hdr_crc);
798ff94bc40SHeiko Schocher 
799ff94bc40SHeiko Schocher 		if (!read_err)
800ff94bc40SHeiko Schocher 			return UBI_IO_BAD_HDR;
801ff94bc40SHeiko Schocher 		else
802ff94bc40SHeiko Schocher 			return UBI_IO_BAD_HDR_EBADMSG;
8032d262c48SKyungmin Park 	}
8042d262c48SKyungmin Park 
8052d262c48SKyungmin Park 	/* And of course validate what has just been read from the media */
8062d262c48SKyungmin Park 	err = validate_ec_hdr(ubi, ec_hdr);
8072d262c48SKyungmin Park 	if (err) {
8080195a7bbSHeiko Schocher 		ubi_err(ubi, "validation failed for PEB %d", pnum);
8092d262c48SKyungmin Park 		return -EINVAL;
8102d262c48SKyungmin Park 	}
8112d262c48SKyungmin Park 
812ff94bc40SHeiko Schocher 	/*
813ff94bc40SHeiko Schocher 	 * If there was %-EBADMSG, but the header CRC is still OK, report about
814ff94bc40SHeiko Schocher 	 * a bit-flip to force scrubbing on this PEB.
815ff94bc40SHeiko Schocher 	 */
8162d262c48SKyungmin Park 	return read_err ? UBI_IO_BITFLIPS : 0;
8172d262c48SKyungmin Park }
8182d262c48SKyungmin Park 
8192d262c48SKyungmin Park /**
8202d262c48SKyungmin Park  * ubi_io_write_ec_hdr - write an erase counter header.
8212d262c48SKyungmin Park  * @ubi: UBI device description object
8222d262c48SKyungmin Park  * @pnum: physical eraseblock to write to
8232d262c48SKyungmin Park  * @ec_hdr: the erase counter header to write
8242d262c48SKyungmin Park  *
8252d262c48SKyungmin Park  * This function writes erase counter header described by @ec_hdr to physical
8262d262c48SKyungmin Park  * eraseblock @pnum. It also fills most fields of @ec_hdr before writing, so
8272d262c48SKyungmin Park  * the caller do not have to fill them. Callers must only fill the @ec_hdr->ec
8282d262c48SKyungmin Park  * field.
8292d262c48SKyungmin Park  *
8302d262c48SKyungmin Park  * This function returns zero in case of success and a negative error code in
8312d262c48SKyungmin Park  * case of failure. If %-EIO is returned, the physical eraseblock most probably
8322d262c48SKyungmin Park  * went bad.
8332d262c48SKyungmin Park  */
ubi_io_write_ec_hdr(struct ubi_device * ubi,int pnum,struct ubi_ec_hdr * ec_hdr)8342d262c48SKyungmin Park int ubi_io_write_ec_hdr(struct ubi_device *ubi, int pnum,
8352d262c48SKyungmin Park 			struct ubi_ec_hdr *ec_hdr)
8362d262c48SKyungmin Park {
8372d262c48SKyungmin Park 	int err;
8382d262c48SKyungmin Park 	uint32_t crc;
8392d262c48SKyungmin Park 
8402d262c48SKyungmin Park 	dbg_io("write EC header to PEB %d", pnum);
8412d262c48SKyungmin Park 	ubi_assert(pnum >= 0 &&  pnum < ubi->peb_count);
8422d262c48SKyungmin Park 
8432d262c48SKyungmin Park 	ec_hdr->magic = cpu_to_be32(UBI_EC_HDR_MAGIC);
8442d262c48SKyungmin Park 	ec_hdr->version = UBI_VERSION;
8452d262c48SKyungmin Park 	ec_hdr->vid_hdr_offset = cpu_to_be32(ubi->vid_hdr_offset);
8462d262c48SKyungmin Park 	ec_hdr->data_offset = cpu_to_be32(ubi->leb_start);
847ff94bc40SHeiko Schocher 	ec_hdr->image_seq = cpu_to_be32(ubi->image_seq);
8482d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, ec_hdr, UBI_EC_HDR_SIZE_CRC);
8492d262c48SKyungmin Park 	ec_hdr->hdr_crc = cpu_to_be32(crc);
8502d262c48SKyungmin Park 
851ff94bc40SHeiko Schocher 	err = self_check_ec_hdr(ubi, pnum, ec_hdr);
8522d262c48SKyungmin Park 	if (err)
853ff94bc40SHeiko Schocher 		return err;
8542d262c48SKyungmin Park 
8550195a7bbSHeiko Schocher 	if (ubi_dbg_power_cut(ubi, POWER_CUT_EC_WRITE))
8560195a7bbSHeiko Schocher 		return -EROFS;
8570195a7bbSHeiko Schocher 
8582d262c48SKyungmin Park 	err = ubi_io_write(ubi, ec_hdr, pnum, 0, ubi->ec_hdr_alsize);
8592d262c48SKyungmin Park 	return err;
8602d262c48SKyungmin Park }
8612d262c48SKyungmin Park 
8622d262c48SKyungmin Park /**
8632d262c48SKyungmin Park  * validate_vid_hdr - validate a volume identifier header.
8642d262c48SKyungmin Park  * @ubi: UBI device description object
8652d262c48SKyungmin Park  * @vid_hdr: the volume identifier header to check
8662d262c48SKyungmin Park  *
8672d262c48SKyungmin Park  * This function checks that data stored in the volume identifier header
8682d262c48SKyungmin Park  * @vid_hdr. Returns zero if the VID header is OK and %1 if not.
8692d262c48SKyungmin Park  */
validate_vid_hdr(const struct ubi_device * ubi,const struct ubi_vid_hdr * vid_hdr)8702d262c48SKyungmin Park static int validate_vid_hdr(const struct ubi_device *ubi,
8712d262c48SKyungmin Park 			    const struct ubi_vid_hdr *vid_hdr)
8722d262c48SKyungmin Park {
8732d262c48SKyungmin Park 	int vol_type = vid_hdr->vol_type;
8742d262c48SKyungmin Park 	int copy_flag = vid_hdr->copy_flag;
8752d262c48SKyungmin Park 	int vol_id = be32_to_cpu(vid_hdr->vol_id);
8762d262c48SKyungmin Park 	int lnum = be32_to_cpu(vid_hdr->lnum);
8772d262c48SKyungmin Park 	int compat = vid_hdr->compat;
8782d262c48SKyungmin Park 	int data_size = be32_to_cpu(vid_hdr->data_size);
8792d262c48SKyungmin Park 	int used_ebs = be32_to_cpu(vid_hdr->used_ebs);
8802d262c48SKyungmin Park 	int data_pad = be32_to_cpu(vid_hdr->data_pad);
8812d262c48SKyungmin Park 	int data_crc = be32_to_cpu(vid_hdr->data_crc);
8822d262c48SKyungmin Park 	int usable_leb_size = ubi->leb_size - data_pad;
8832d262c48SKyungmin Park 
8842d262c48SKyungmin Park 	if (copy_flag != 0 && copy_flag != 1) {
8850195a7bbSHeiko Schocher 		ubi_err(ubi, "bad copy_flag");
8862d262c48SKyungmin Park 		goto bad;
8872d262c48SKyungmin Park 	}
8882d262c48SKyungmin Park 
8892d262c48SKyungmin Park 	if (vol_id < 0 || lnum < 0 || data_size < 0 || used_ebs < 0 ||
8902d262c48SKyungmin Park 	    data_pad < 0) {
8910195a7bbSHeiko Schocher 		ubi_err(ubi, "negative values");
8922d262c48SKyungmin Park 		goto bad;
8932d262c48SKyungmin Park 	}
8942d262c48SKyungmin Park 
8952d262c48SKyungmin Park 	if (vol_id >= UBI_MAX_VOLUMES && vol_id < UBI_INTERNAL_VOL_START) {
8960195a7bbSHeiko Schocher 		ubi_err(ubi, "bad vol_id");
8972d262c48SKyungmin Park 		goto bad;
8982d262c48SKyungmin Park 	}
8992d262c48SKyungmin Park 
9002d262c48SKyungmin Park 	if (vol_id < UBI_INTERNAL_VOL_START && compat != 0) {
9010195a7bbSHeiko Schocher 		ubi_err(ubi, "bad compat");
9022d262c48SKyungmin Park 		goto bad;
9032d262c48SKyungmin Park 	}
9042d262c48SKyungmin Park 
9052d262c48SKyungmin Park 	if (vol_id >= UBI_INTERNAL_VOL_START && compat != UBI_COMPAT_DELETE &&
9062d262c48SKyungmin Park 	    compat != UBI_COMPAT_RO && compat != UBI_COMPAT_PRESERVE &&
9072d262c48SKyungmin Park 	    compat != UBI_COMPAT_REJECT) {
9080195a7bbSHeiko Schocher 		ubi_err(ubi, "bad compat");
9092d262c48SKyungmin Park 		goto bad;
9102d262c48SKyungmin Park 	}
9112d262c48SKyungmin Park 
9122d262c48SKyungmin Park 	if (vol_type != UBI_VID_DYNAMIC && vol_type != UBI_VID_STATIC) {
9130195a7bbSHeiko Schocher 		ubi_err(ubi, "bad vol_type");
9142d262c48SKyungmin Park 		goto bad;
9152d262c48SKyungmin Park 	}
9162d262c48SKyungmin Park 
9172d262c48SKyungmin Park 	if (data_pad >= ubi->leb_size / 2) {
9180195a7bbSHeiko Schocher 		ubi_err(ubi, "bad data_pad");
9192d262c48SKyungmin Park 		goto bad;
9202d262c48SKyungmin Park 	}
9212d262c48SKyungmin Park 
9222d262c48SKyungmin Park 	if (vol_type == UBI_VID_STATIC) {
9232d262c48SKyungmin Park 		/*
9242d262c48SKyungmin Park 		 * Although from high-level point of view static volumes may
9252d262c48SKyungmin Park 		 * contain zero bytes of data, but no VID headers can contain
9262d262c48SKyungmin Park 		 * zero at these fields, because they empty volumes do not have
9272d262c48SKyungmin Park 		 * mapped logical eraseblocks.
9282d262c48SKyungmin Park 		 */
9292d262c48SKyungmin Park 		if (used_ebs == 0) {
9300195a7bbSHeiko Schocher 			ubi_err(ubi, "zero used_ebs");
9312d262c48SKyungmin Park 			goto bad;
9322d262c48SKyungmin Park 		}
9332d262c48SKyungmin Park 		if (data_size == 0) {
9340195a7bbSHeiko Schocher 			ubi_err(ubi, "zero data_size");
9352d262c48SKyungmin Park 			goto bad;
9362d262c48SKyungmin Park 		}
9372d262c48SKyungmin Park 		if (lnum < used_ebs - 1) {
9382d262c48SKyungmin Park 			if (data_size != usable_leb_size) {
9390195a7bbSHeiko Schocher 				ubi_err(ubi, "bad data_size");
9402d262c48SKyungmin Park 				goto bad;
9412d262c48SKyungmin Park 			}
9422d262c48SKyungmin Park 		} else if (lnum == used_ebs - 1) {
9432d262c48SKyungmin Park 			if (data_size == 0) {
9440195a7bbSHeiko Schocher 				ubi_err(ubi, "bad data_size at last LEB");
9452d262c48SKyungmin Park 				goto bad;
9462d262c48SKyungmin Park 			}
9472d262c48SKyungmin Park 		} else {
9480195a7bbSHeiko Schocher 			ubi_err(ubi, "too high lnum");
9492d262c48SKyungmin Park 			goto bad;
9502d262c48SKyungmin Park 		}
9512d262c48SKyungmin Park 	} else {
9522d262c48SKyungmin Park 		if (copy_flag == 0) {
9532d262c48SKyungmin Park 			if (data_crc != 0) {
9540195a7bbSHeiko Schocher 				ubi_err(ubi, "non-zero data CRC");
9552d262c48SKyungmin Park 				goto bad;
9562d262c48SKyungmin Park 			}
9572d262c48SKyungmin Park 			if (data_size != 0) {
9580195a7bbSHeiko Schocher 				ubi_err(ubi, "non-zero data_size");
9592d262c48SKyungmin Park 				goto bad;
9602d262c48SKyungmin Park 			}
9612d262c48SKyungmin Park 		} else {
9622d262c48SKyungmin Park 			if (data_size == 0) {
9630195a7bbSHeiko Schocher 				ubi_err(ubi, "zero data_size of copy");
9642d262c48SKyungmin Park 				goto bad;
9652d262c48SKyungmin Park 			}
9662d262c48SKyungmin Park 		}
9672d262c48SKyungmin Park 		if (used_ebs != 0) {
9680195a7bbSHeiko Schocher 			ubi_err(ubi, "bad used_ebs");
9692d262c48SKyungmin Park 			goto bad;
9702d262c48SKyungmin Park 		}
9712d262c48SKyungmin Park 	}
9722d262c48SKyungmin Park 
9732d262c48SKyungmin Park 	return 0;
9742d262c48SKyungmin Park 
9752d262c48SKyungmin Park bad:
9760195a7bbSHeiko Schocher 	ubi_err(ubi, "bad VID header");
977ff94bc40SHeiko Schocher 	ubi_dump_vid_hdr(vid_hdr);
978ff94bc40SHeiko Schocher 	dump_stack();
9792d262c48SKyungmin Park 	return 1;
9802d262c48SKyungmin Park }
9812d262c48SKyungmin Park 
9822d262c48SKyungmin Park /**
9832d262c48SKyungmin Park  * ubi_io_read_vid_hdr - read and check a volume identifier header.
9842d262c48SKyungmin Park  * @ubi: UBI device description object
9852d262c48SKyungmin Park  * @pnum: physical eraseblock number to read from
9862d262c48SKyungmin Park  * @vid_hdr: &struct ubi_vid_hdr object where to store the read volume
9872d262c48SKyungmin Park  * identifier header
9882d262c48SKyungmin Park  * @verbose: be verbose if the header is corrupted or wasn't found
9892d262c48SKyungmin Park  *
9902d262c48SKyungmin Park  * This function reads the volume identifier header from physical eraseblock
9912d262c48SKyungmin Park  * @pnum and stores it in @vid_hdr. It also checks CRC checksum of the read
992ff94bc40SHeiko Schocher  * volume identifier header. The error codes are the same as in
993ff94bc40SHeiko Schocher  * 'ubi_io_read_ec_hdr()'.
9942d262c48SKyungmin Park  *
995ff94bc40SHeiko Schocher  * Note, the implementation of this function is also very similar to
996ff94bc40SHeiko Schocher  * 'ubi_io_read_ec_hdr()', so refer commentaries in 'ubi_io_read_ec_hdr()'.
9972d262c48SKyungmin Park  */
ubi_io_read_vid_hdr(struct ubi_device * ubi,int pnum,struct ubi_vid_hdr * vid_hdr,int verbose)9982d262c48SKyungmin Park int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,
9992d262c48SKyungmin Park 			struct ubi_vid_hdr *vid_hdr, int verbose)
10002d262c48SKyungmin Park {
1001ff94bc40SHeiko Schocher 	int err, read_err;
10022d262c48SKyungmin Park 	uint32_t crc, magic, hdr_crc;
10032d262c48SKyungmin Park 	void *p;
10042d262c48SKyungmin Park 
10052d262c48SKyungmin Park 	dbg_io("read VID header from PEB %d", pnum);
10062d262c48SKyungmin Park 	ubi_assert(pnum >= 0 &&  pnum < ubi->peb_count);
10072d262c48SKyungmin Park 
10082d262c48SKyungmin Park 	p = (char *)vid_hdr - ubi->vid_hdr_shift;
1009ff94bc40SHeiko Schocher 	read_err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset,
10102d262c48SKyungmin Park 			  ubi->vid_hdr_alsize);
1011ff94bc40SHeiko Schocher 	if (read_err && read_err != UBI_IO_BITFLIPS && !mtd_is_eccerr(read_err))
1012ff94bc40SHeiko Schocher 		return read_err;
10132d262c48SKyungmin Park 
10142d262c48SKyungmin Park 	magic = be32_to_cpu(vid_hdr->magic);
10152d262c48SKyungmin Park 	if (magic != UBI_VID_HDR_MAGIC) {
1016ff94bc40SHeiko Schocher 		if (mtd_is_eccerr(read_err))
1017ff94bc40SHeiko Schocher 			return UBI_IO_BAD_HDR_EBADMSG;
10182d262c48SKyungmin Park 
1019ff94bc40SHeiko Schocher 		if (ubi_check_pattern(vid_hdr, 0xFF, UBI_VID_HDR_SIZE)) {
10202d262c48SKyungmin Park 			if (verbose)
10210195a7bbSHeiko Schocher 				ubi_warn(ubi, "no VID header found at PEB %d, only 0xFF bytes",
1022ff94bc40SHeiko Schocher 					 pnum);
1023ff94bc40SHeiko Schocher 			dbg_bld("no VID header found at PEB %d, only 0xFF bytes",
1024ff94bc40SHeiko Schocher 				pnum);
1025ff94bc40SHeiko Schocher 			if (!read_err)
1026ff94bc40SHeiko Schocher 				return UBI_IO_FF;
1027ff94bc40SHeiko Schocher 			else
1028ff94bc40SHeiko Schocher 				return UBI_IO_FF_BITFLIPS;
10292d262c48SKyungmin Park 		}
10302d262c48SKyungmin Park 
10312d262c48SKyungmin Park 		if (verbose) {
10320195a7bbSHeiko Schocher 			ubi_warn(ubi, "bad magic number at PEB %d: %08x instead of %08x",
1033ff94bc40SHeiko Schocher 				 pnum, magic, UBI_VID_HDR_MAGIC);
1034ff94bc40SHeiko Schocher 			ubi_dump_vid_hdr(vid_hdr);
10352d262c48SKyungmin Park 		}
1036ff94bc40SHeiko Schocher 		dbg_bld("bad magic number at PEB %d: %08x instead of %08x",
1037ff94bc40SHeiko Schocher 			pnum, magic, UBI_VID_HDR_MAGIC);
1038ff94bc40SHeiko Schocher 		return UBI_IO_BAD_HDR;
10392d262c48SKyungmin Park 	}
10402d262c48SKyungmin Park 
10412d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, vid_hdr, UBI_VID_HDR_SIZE_CRC);
10422d262c48SKyungmin Park 	hdr_crc = be32_to_cpu(vid_hdr->hdr_crc);
10432d262c48SKyungmin Park 
10442d262c48SKyungmin Park 	if (hdr_crc != crc) {
10452d262c48SKyungmin Park 		if (verbose) {
10460195a7bbSHeiko Schocher 			ubi_warn(ubi, "bad CRC at PEB %d, calculated %#08x, read %#08x",
1047ff94bc40SHeiko Schocher 				 pnum, crc, hdr_crc);
1048ff94bc40SHeiko Schocher 			ubi_dump_vid_hdr(vid_hdr);
10492d262c48SKyungmin Park 		}
1050ff94bc40SHeiko Schocher 		dbg_bld("bad CRC at PEB %d, calculated %#08x, read %#08x",
1051ff94bc40SHeiko Schocher 			pnum, crc, hdr_crc);
1052ff94bc40SHeiko Schocher 		if (!read_err)
1053ff94bc40SHeiko Schocher 			return UBI_IO_BAD_HDR;
1054ff94bc40SHeiko Schocher 		else
1055ff94bc40SHeiko Schocher 			return UBI_IO_BAD_HDR_EBADMSG;
10562d262c48SKyungmin Park 	}
10572d262c48SKyungmin Park 
10582d262c48SKyungmin Park 	err = validate_vid_hdr(ubi, vid_hdr);
10592d262c48SKyungmin Park 	if (err) {
10600195a7bbSHeiko Schocher 		ubi_err(ubi, "validation failed for PEB %d", pnum);
10612d262c48SKyungmin Park 		return -EINVAL;
10622d262c48SKyungmin Park 	}
10632d262c48SKyungmin Park 
10642d262c48SKyungmin Park 	return read_err ? UBI_IO_BITFLIPS : 0;
10652d262c48SKyungmin Park }
10662d262c48SKyungmin Park 
10672d262c48SKyungmin Park /**
10682d262c48SKyungmin Park  * ubi_io_write_vid_hdr - write a volume identifier header.
10692d262c48SKyungmin Park  * @ubi: UBI device description object
10702d262c48SKyungmin Park  * @pnum: the physical eraseblock number to write to
10712d262c48SKyungmin Park  * @vid_hdr: the volume identifier header to write
10722d262c48SKyungmin Park  *
10732d262c48SKyungmin Park  * This function writes the volume identifier header described by @vid_hdr to
10742d262c48SKyungmin Park  * physical eraseblock @pnum. This function automatically fills the
10752d262c48SKyungmin Park  * @vid_hdr->magic and the @vid_hdr->version fields, as well as calculates
10762d262c48SKyungmin Park  * header CRC checksum and stores it at vid_hdr->hdr_crc.
10772d262c48SKyungmin Park  *
10782d262c48SKyungmin Park  * This function returns zero in case of success and a negative error code in
10792d262c48SKyungmin Park  * case of failure. If %-EIO is returned, the physical eraseblock probably went
10802d262c48SKyungmin Park  * bad.
10812d262c48SKyungmin Park  */
ubi_io_write_vid_hdr(struct ubi_device * ubi,int pnum,struct ubi_vid_hdr * vid_hdr)10822d262c48SKyungmin Park int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum,
10832d262c48SKyungmin Park 			 struct ubi_vid_hdr *vid_hdr)
10842d262c48SKyungmin Park {
10852d262c48SKyungmin Park 	int err;
10862d262c48SKyungmin Park 	uint32_t crc;
10872d262c48SKyungmin Park 	void *p;
10882d262c48SKyungmin Park 
10892d262c48SKyungmin Park 	dbg_io("write VID header to PEB %d", pnum);
10902d262c48SKyungmin Park 	ubi_assert(pnum >= 0 &&  pnum < ubi->peb_count);
10912d262c48SKyungmin Park 
1092ff94bc40SHeiko Schocher 	err = self_check_peb_ec_hdr(ubi, pnum);
10932d262c48SKyungmin Park 	if (err)
1094ff94bc40SHeiko Schocher 		return err;
10952d262c48SKyungmin Park 
10962d262c48SKyungmin Park 	vid_hdr->magic = cpu_to_be32(UBI_VID_HDR_MAGIC);
10972d262c48SKyungmin Park 	vid_hdr->version = UBI_VERSION;
10982d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, vid_hdr, UBI_VID_HDR_SIZE_CRC);
10992d262c48SKyungmin Park 	vid_hdr->hdr_crc = cpu_to_be32(crc);
11002d262c48SKyungmin Park 
1101ff94bc40SHeiko Schocher 	err = self_check_vid_hdr(ubi, pnum, vid_hdr);
11022d262c48SKyungmin Park 	if (err)
1103ff94bc40SHeiko Schocher 		return err;
11042d262c48SKyungmin Park 
11050195a7bbSHeiko Schocher 	if (ubi_dbg_power_cut(ubi, POWER_CUT_VID_WRITE))
11060195a7bbSHeiko Schocher 		return -EROFS;
11070195a7bbSHeiko Schocher 
11082d262c48SKyungmin Park 	p = (char *)vid_hdr - ubi->vid_hdr_shift;
11092d262c48SKyungmin Park 	err = ubi_io_write(ubi, p, pnum, ubi->vid_hdr_aloffset,
11102d262c48SKyungmin Park 			   ubi->vid_hdr_alsize);
11112d262c48SKyungmin Park 	return err;
11122d262c48SKyungmin Park }
11132d262c48SKyungmin Park 
11142d262c48SKyungmin Park /**
1115ff94bc40SHeiko Schocher  * self_check_not_bad - ensure that a physical eraseblock is not bad.
11162d262c48SKyungmin Park  * @ubi: UBI device description object
11172d262c48SKyungmin Park  * @pnum: physical eraseblock number to check
11182d262c48SKyungmin Park  *
1119ff94bc40SHeiko Schocher  * This function returns zero if the physical eraseblock is good, %-EINVAL if
1120ff94bc40SHeiko Schocher  * it is bad and a negative error code if an error occurred.
11212d262c48SKyungmin Park  */
self_check_not_bad(const struct ubi_device * ubi,int pnum)1122ff94bc40SHeiko Schocher static int self_check_not_bad(const struct ubi_device *ubi, int pnum)
11232d262c48SKyungmin Park {
11242d262c48SKyungmin Park 	int err;
11252d262c48SKyungmin Park 
1126ff94bc40SHeiko Schocher 	if (!ubi_dbg_chk_io(ubi))
1127ff94bc40SHeiko Schocher 		return 0;
1128ff94bc40SHeiko Schocher 
11292d262c48SKyungmin Park 	err = ubi_io_is_bad(ubi, pnum);
11302d262c48SKyungmin Park 	if (!err)
11312d262c48SKyungmin Park 		return err;
11322d262c48SKyungmin Park 
11330195a7bbSHeiko Schocher 	ubi_err(ubi, "self-check failed for PEB %d", pnum);
1134ff94bc40SHeiko Schocher 	dump_stack();
1135ff94bc40SHeiko Schocher 	return err > 0 ? -EINVAL : err;
11362d262c48SKyungmin Park }
11372d262c48SKyungmin Park 
11382d262c48SKyungmin Park /**
1139ff94bc40SHeiko Schocher  * self_check_ec_hdr - check if an erase counter header is all right.
11402d262c48SKyungmin Park  * @ubi: UBI device description object
11412d262c48SKyungmin Park  * @pnum: physical eraseblock number the erase counter header belongs to
11422d262c48SKyungmin Park  * @ec_hdr: the erase counter header to check
11432d262c48SKyungmin Park  *
11442d262c48SKyungmin Park  * This function returns zero if the erase counter header contains valid
1145ff94bc40SHeiko Schocher  * values, and %-EINVAL if not.
11462d262c48SKyungmin Park  */
self_check_ec_hdr(const struct ubi_device * ubi,int pnum,const struct ubi_ec_hdr * ec_hdr)1147ff94bc40SHeiko Schocher static int self_check_ec_hdr(const struct ubi_device *ubi, int pnum,
11482d262c48SKyungmin Park 			     const struct ubi_ec_hdr *ec_hdr)
11492d262c48SKyungmin Park {
11502d262c48SKyungmin Park 	int err;
11512d262c48SKyungmin Park 	uint32_t magic;
11522d262c48SKyungmin Park 
1153ff94bc40SHeiko Schocher 	if (!ubi_dbg_chk_io(ubi))
1154ff94bc40SHeiko Schocher 		return 0;
1155ff94bc40SHeiko Schocher 
11562d262c48SKyungmin Park 	magic = be32_to_cpu(ec_hdr->magic);
11572d262c48SKyungmin Park 	if (magic != UBI_EC_HDR_MAGIC) {
11580195a7bbSHeiko Schocher 		ubi_err(ubi, "bad magic %#08x, must be %#08x",
11592d262c48SKyungmin Park 			magic, UBI_EC_HDR_MAGIC);
11602d262c48SKyungmin Park 		goto fail;
11612d262c48SKyungmin Park 	}
11622d262c48SKyungmin Park 
11632d262c48SKyungmin Park 	err = validate_ec_hdr(ubi, ec_hdr);
11642d262c48SKyungmin Park 	if (err) {
11650195a7bbSHeiko Schocher 		ubi_err(ubi, "self-check failed for PEB %d", pnum);
11662d262c48SKyungmin Park 		goto fail;
11672d262c48SKyungmin Park 	}
11682d262c48SKyungmin Park 
11692d262c48SKyungmin Park 	return 0;
11702d262c48SKyungmin Park 
11712d262c48SKyungmin Park fail:
1172ff94bc40SHeiko Schocher 	ubi_dump_ec_hdr(ec_hdr);
1173ff94bc40SHeiko Schocher 	dump_stack();
1174ff94bc40SHeiko Schocher 	return -EINVAL;
11752d262c48SKyungmin Park }
11762d262c48SKyungmin Park 
11772d262c48SKyungmin Park /**
1178ff94bc40SHeiko Schocher  * self_check_peb_ec_hdr - check erase counter header.
11792d262c48SKyungmin Park  * @ubi: UBI device description object
11802d262c48SKyungmin Park  * @pnum: the physical eraseblock number to check
11812d262c48SKyungmin Park  *
1182ff94bc40SHeiko Schocher  * This function returns zero if the erase counter header is all right and and
1183ff94bc40SHeiko Schocher  * a negative error code if not or if an error occurred.
11842d262c48SKyungmin Park  */
self_check_peb_ec_hdr(const struct ubi_device * ubi,int pnum)1185ff94bc40SHeiko Schocher static int self_check_peb_ec_hdr(const struct ubi_device *ubi, int pnum)
11862d262c48SKyungmin Park {
11872d262c48SKyungmin Park 	int err;
11882d262c48SKyungmin Park 	uint32_t crc, hdr_crc;
11892d262c48SKyungmin Park 	struct ubi_ec_hdr *ec_hdr;
11902d262c48SKyungmin Park 
1191ff94bc40SHeiko Schocher 	if (!ubi_dbg_chk_io(ubi))
1192ff94bc40SHeiko Schocher 		return 0;
1193ff94bc40SHeiko Schocher 
11942d262c48SKyungmin Park 	ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_NOFS);
11952d262c48SKyungmin Park 	if (!ec_hdr)
11962d262c48SKyungmin Park 		return -ENOMEM;
11972d262c48SKyungmin Park 
11982d262c48SKyungmin Park 	err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE);
1199ff94bc40SHeiko Schocher 	if (err && err != UBI_IO_BITFLIPS && !mtd_is_eccerr(err))
12002d262c48SKyungmin Park 		goto exit;
12012d262c48SKyungmin Park 
12022d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, ec_hdr, UBI_EC_HDR_SIZE_CRC);
12032d262c48SKyungmin Park 	hdr_crc = be32_to_cpu(ec_hdr->hdr_crc);
12042d262c48SKyungmin Park 	if (hdr_crc != crc) {
12050195a7bbSHeiko Schocher 		ubi_err(ubi, "bad CRC, calculated %#08x, read %#08x",
12060195a7bbSHeiko Schocher 			crc, hdr_crc);
12070195a7bbSHeiko Schocher 		ubi_err(ubi, "self-check failed for PEB %d", pnum);
1208ff94bc40SHeiko Schocher 		ubi_dump_ec_hdr(ec_hdr);
1209ff94bc40SHeiko Schocher 		dump_stack();
1210ff94bc40SHeiko Schocher 		err = -EINVAL;
12112d262c48SKyungmin Park 		goto exit;
12122d262c48SKyungmin Park 	}
12132d262c48SKyungmin Park 
1214ff94bc40SHeiko Schocher 	err = self_check_ec_hdr(ubi, pnum, ec_hdr);
12152d262c48SKyungmin Park 
12162d262c48SKyungmin Park exit:
12172d262c48SKyungmin Park 	kfree(ec_hdr);
12182d262c48SKyungmin Park 	return err;
12192d262c48SKyungmin Park }
12202d262c48SKyungmin Park 
12212d262c48SKyungmin Park /**
1222ff94bc40SHeiko Schocher  * self_check_vid_hdr - check that a volume identifier header is all right.
12232d262c48SKyungmin Park  * @ubi: UBI device description object
12242d262c48SKyungmin Park  * @pnum: physical eraseblock number the volume identifier header belongs to
12252d262c48SKyungmin Park  * @vid_hdr: the volume identifier header to check
12262d262c48SKyungmin Park  *
12272d262c48SKyungmin Park  * This function returns zero if the volume identifier header is all right, and
1228ff94bc40SHeiko Schocher  * %-EINVAL if not.
12292d262c48SKyungmin Park  */
self_check_vid_hdr(const struct ubi_device * ubi,int pnum,const struct ubi_vid_hdr * vid_hdr)1230ff94bc40SHeiko Schocher static int self_check_vid_hdr(const struct ubi_device *ubi, int pnum,
12312d262c48SKyungmin Park 			      const struct ubi_vid_hdr *vid_hdr)
12322d262c48SKyungmin Park {
12332d262c48SKyungmin Park 	int err;
12342d262c48SKyungmin Park 	uint32_t magic;
12352d262c48SKyungmin Park 
1236ff94bc40SHeiko Schocher 	if (!ubi_dbg_chk_io(ubi))
1237ff94bc40SHeiko Schocher 		return 0;
1238ff94bc40SHeiko Schocher 
12392d262c48SKyungmin Park 	magic = be32_to_cpu(vid_hdr->magic);
12402d262c48SKyungmin Park 	if (magic != UBI_VID_HDR_MAGIC) {
12410195a7bbSHeiko Schocher 		ubi_err(ubi, "bad VID header magic %#08x at PEB %d, must be %#08x",
12422d262c48SKyungmin Park 			magic, pnum, UBI_VID_HDR_MAGIC);
12432d262c48SKyungmin Park 		goto fail;
12442d262c48SKyungmin Park 	}
12452d262c48SKyungmin Park 
12462d262c48SKyungmin Park 	err = validate_vid_hdr(ubi, vid_hdr);
12472d262c48SKyungmin Park 	if (err) {
12480195a7bbSHeiko Schocher 		ubi_err(ubi, "self-check failed for PEB %d", pnum);
12492d262c48SKyungmin Park 		goto fail;
12502d262c48SKyungmin Park 	}
12512d262c48SKyungmin Park 
12522d262c48SKyungmin Park 	return err;
12532d262c48SKyungmin Park 
12542d262c48SKyungmin Park fail:
12550195a7bbSHeiko Schocher 	ubi_err(ubi, "self-check failed for PEB %d", pnum);
1256ff94bc40SHeiko Schocher 	ubi_dump_vid_hdr(vid_hdr);
1257ff94bc40SHeiko Schocher 	dump_stack();
1258ff94bc40SHeiko Schocher 	return -EINVAL;
12592d262c48SKyungmin Park 
12602d262c48SKyungmin Park }
12612d262c48SKyungmin Park 
12622d262c48SKyungmin Park /**
1263ff94bc40SHeiko Schocher  * self_check_peb_vid_hdr - check volume identifier header.
12642d262c48SKyungmin Park  * @ubi: UBI device description object
12652d262c48SKyungmin Park  * @pnum: the physical eraseblock number to check
12662d262c48SKyungmin Park  *
12672d262c48SKyungmin Park  * This function returns zero if the volume identifier header is all right,
1268ff94bc40SHeiko Schocher  * and a negative error code if not or if an error occurred.
12692d262c48SKyungmin Park  */
self_check_peb_vid_hdr(const struct ubi_device * ubi,int pnum)1270ff94bc40SHeiko Schocher static int self_check_peb_vid_hdr(const struct ubi_device *ubi, int pnum)
12712d262c48SKyungmin Park {
12722d262c48SKyungmin Park 	int err;
12732d262c48SKyungmin Park 	uint32_t crc, hdr_crc;
12742d262c48SKyungmin Park 	struct ubi_vid_hdr *vid_hdr;
12752d262c48SKyungmin Park 	void *p;
12762d262c48SKyungmin Park 
1277ff94bc40SHeiko Schocher 	if (!ubi_dbg_chk_io(ubi))
1278ff94bc40SHeiko Schocher 		return 0;
1279ff94bc40SHeiko Schocher 
12802d262c48SKyungmin Park 	vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS);
12812d262c48SKyungmin Park 	if (!vid_hdr)
12822d262c48SKyungmin Park 		return -ENOMEM;
12832d262c48SKyungmin Park 
12842d262c48SKyungmin Park 	p = (char *)vid_hdr - ubi->vid_hdr_shift;
12852d262c48SKyungmin Park 	err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset,
12862d262c48SKyungmin Park 			  ubi->vid_hdr_alsize);
1287ff94bc40SHeiko Schocher 	if (err && err != UBI_IO_BITFLIPS && !mtd_is_eccerr(err))
12882d262c48SKyungmin Park 		goto exit;
12892d262c48SKyungmin Park 
12902d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, vid_hdr, UBI_EC_HDR_SIZE_CRC);
12912d262c48SKyungmin Park 	hdr_crc = be32_to_cpu(vid_hdr->hdr_crc);
12922d262c48SKyungmin Park 	if (hdr_crc != crc) {
12930195a7bbSHeiko Schocher 		ubi_err(ubi, "bad VID header CRC at PEB %d, calculated %#08x, read %#08x",
1294ff94bc40SHeiko Schocher 			pnum, crc, hdr_crc);
12950195a7bbSHeiko Schocher 		ubi_err(ubi, "self-check failed for PEB %d", pnum);
1296ff94bc40SHeiko Schocher 		ubi_dump_vid_hdr(vid_hdr);
1297ff94bc40SHeiko Schocher 		dump_stack();
1298ff94bc40SHeiko Schocher 		err = -EINVAL;
12992d262c48SKyungmin Park 		goto exit;
13002d262c48SKyungmin Park 	}
13012d262c48SKyungmin Park 
1302ff94bc40SHeiko Schocher 	err = self_check_vid_hdr(ubi, pnum, vid_hdr);
13032d262c48SKyungmin Park 
13042d262c48SKyungmin Park exit:
13052d262c48SKyungmin Park 	ubi_free_vid_hdr(ubi, vid_hdr);
13062d262c48SKyungmin Park 	return err;
13072d262c48SKyungmin Park }
13082d262c48SKyungmin Park 
13092d262c48SKyungmin Park /**
1310ff94bc40SHeiko Schocher  * self_check_write - make sure write succeeded.
1311ff94bc40SHeiko Schocher  * @ubi: UBI device description object
1312ff94bc40SHeiko Schocher  * @buf: buffer with data which were written
1313ff94bc40SHeiko Schocher  * @pnum: physical eraseblock number the data were written to
1314ff94bc40SHeiko Schocher  * @offset: offset within the physical eraseblock the data were written to
1315ff94bc40SHeiko Schocher  * @len: how many bytes were written
1316ff94bc40SHeiko Schocher  *
1317ff94bc40SHeiko Schocher  * This functions reads data which were recently written and compares it with
1318ff94bc40SHeiko Schocher  * the original data buffer - the data have to match. Returns zero if the data
1319ff94bc40SHeiko Schocher  * match and a negative error code if not or in case of failure.
1320ff94bc40SHeiko Schocher  */
self_check_write(struct ubi_device * ubi,const void * buf,int pnum,int offset,int len)1321ff94bc40SHeiko Schocher static int self_check_write(struct ubi_device *ubi, const void *buf, int pnum,
1322ff94bc40SHeiko Schocher 			    int offset, int len)
1323ff94bc40SHeiko Schocher {
1324ff94bc40SHeiko Schocher 	int err, i;
1325ff94bc40SHeiko Schocher 	size_t read;
1326ff94bc40SHeiko Schocher 	void *buf1;
1327ff94bc40SHeiko Schocher 	loff_t addr = (loff_t)pnum * ubi->peb_size + offset;
1328ff94bc40SHeiko Schocher 
1329ff94bc40SHeiko Schocher 	if (!ubi_dbg_chk_io(ubi))
1330ff94bc40SHeiko Schocher 		return 0;
1331ff94bc40SHeiko Schocher 
1332ff94bc40SHeiko Schocher 	buf1 = __vmalloc(len, GFP_NOFS, PAGE_KERNEL);
1333ff94bc40SHeiko Schocher 	if (!buf1) {
13340195a7bbSHeiko Schocher 		ubi_err(ubi, "cannot allocate memory to check writes");
1335ff94bc40SHeiko Schocher 		return 0;
1336ff94bc40SHeiko Schocher 	}
1337ff94bc40SHeiko Schocher 
1338ff94bc40SHeiko Schocher 	err = mtd_read(ubi->mtd, addr, len, &read, buf1);
1339ff94bc40SHeiko Schocher 	if (err && !mtd_is_bitflip(err))
1340ff94bc40SHeiko Schocher 		goto out_free;
1341ff94bc40SHeiko Schocher 
1342ff94bc40SHeiko Schocher 	for (i = 0; i < len; i++) {
1343ff94bc40SHeiko Schocher 		uint8_t c = ((uint8_t *)buf)[i];
1344ff94bc40SHeiko Schocher 		uint8_t c1 = ((uint8_t *)buf1)[i];
1345ff94bc40SHeiko Schocher #if !defined(CONFIG_UBI_SILENCE_MSG)
1346ff94bc40SHeiko Schocher 		int dump_len = max_t(int, 128, len - i);
1347ff94bc40SHeiko Schocher #endif
1348ff94bc40SHeiko Schocher 
1349ff94bc40SHeiko Schocher 		if (c == c1)
1350ff94bc40SHeiko Schocher 			continue;
1351ff94bc40SHeiko Schocher 
13520195a7bbSHeiko Schocher 		ubi_err(ubi, "self-check failed for PEB %d:%d, len %d",
1353ff94bc40SHeiko Schocher 			pnum, offset, len);
13540195a7bbSHeiko Schocher 		ubi_msg(ubi, "data differ at position %d", i);
13550195a7bbSHeiko Schocher 		ubi_msg(ubi, "hex dump of the original buffer from %d to %d",
1356ff94bc40SHeiko Schocher 			i, i + dump_len);
1357*f8c987f8SAlexey Brodkin 		print_hex_dump("", DUMP_PREFIX_OFFSET, 32, 1,
1358ff94bc40SHeiko Schocher 			       buf + i, dump_len, 1);
13590195a7bbSHeiko Schocher 		ubi_msg(ubi, "hex dump of the read buffer from %d to %d",
1360ff94bc40SHeiko Schocher 			i, i + dump_len);
1361*f8c987f8SAlexey Brodkin 		print_hex_dump("", DUMP_PREFIX_OFFSET, 32, 1,
1362ff94bc40SHeiko Schocher 			       buf1 + i, dump_len, 1);
1363ff94bc40SHeiko Schocher 		dump_stack();
1364ff94bc40SHeiko Schocher 		err = -EINVAL;
1365ff94bc40SHeiko Schocher 		goto out_free;
1366ff94bc40SHeiko Schocher 	}
1367ff94bc40SHeiko Schocher 
1368ff94bc40SHeiko Schocher 	vfree(buf1);
1369ff94bc40SHeiko Schocher 	return 0;
1370ff94bc40SHeiko Schocher 
1371ff94bc40SHeiko Schocher out_free:
1372ff94bc40SHeiko Schocher 	vfree(buf1);
1373ff94bc40SHeiko Schocher 	return err;
1374ff94bc40SHeiko Schocher }
1375ff94bc40SHeiko Schocher 
1376ff94bc40SHeiko Schocher /**
1377ff94bc40SHeiko Schocher  * ubi_self_check_all_ff - check that a region of flash is empty.
13782d262c48SKyungmin Park  * @ubi: UBI device description object
13792d262c48SKyungmin Park  * @pnum: the physical eraseblock number to check
13802d262c48SKyungmin Park  * @offset: the starting offset within the physical eraseblock to check
13812d262c48SKyungmin Park  * @len: the length of the region to check
13822d262c48SKyungmin Park  *
13832d262c48SKyungmin Park  * This function returns zero if only 0xFF bytes are present at offset
1384ff94bc40SHeiko Schocher  * @offset of the physical eraseblock @pnum, and a negative error code if not
1385ff94bc40SHeiko Schocher  * or if an error occurred.
13862d262c48SKyungmin Park  */
ubi_self_check_all_ff(struct ubi_device * ubi,int pnum,int offset,int len)1387ff94bc40SHeiko Schocher int ubi_self_check_all_ff(struct ubi_device *ubi, int pnum, int offset, int len)
13882d262c48SKyungmin Park {
13892d262c48SKyungmin Park 	size_t read;
13902d262c48SKyungmin Park 	int err;
1391ff94bc40SHeiko Schocher 	void *buf;
13922d262c48SKyungmin Park 	loff_t addr = (loff_t)pnum * ubi->peb_size + offset;
13932d262c48SKyungmin Park 
1394ff94bc40SHeiko Schocher 	if (!ubi_dbg_chk_io(ubi))
1395ff94bc40SHeiko Schocher 		return 0;
1396ff94bc40SHeiko Schocher 
1397ff94bc40SHeiko Schocher 	buf = __vmalloc(len, GFP_NOFS, PAGE_KERNEL);
1398ff94bc40SHeiko Schocher 	if (!buf) {
13990195a7bbSHeiko Schocher 		ubi_err(ubi, "cannot allocate memory to check for 0xFFs");
1400ff94bc40SHeiko Schocher 		return 0;
1401ff94bc40SHeiko Schocher 	}
1402ff94bc40SHeiko Schocher 
1403ff94bc40SHeiko Schocher 	err = mtd_read(ubi->mtd, addr, len, &read, buf);
1404ff94bc40SHeiko Schocher 	if (err && !mtd_is_bitflip(err)) {
14050195a7bbSHeiko Schocher 		ubi_err(ubi, "err %d while reading %d bytes from PEB %d:%d, read %zd bytes",
1406ff94bc40SHeiko Schocher 			err, len, pnum, offset, read);
14072d262c48SKyungmin Park 		goto error;
14082d262c48SKyungmin Park 	}
14092d262c48SKyungmin Park 
1410ff94bc40SHeiko Schocher 	err = ubi_check_pattern(buf, 0xFF, len);
14112d262c48SKyungmin Park 	if (err == 0) {
14120195a7bbSHeiko Schocher 		ubi_err(ubi, "flash region at PEB %d:%d, length %d does not contain all 0xFF bytes",
1413ff94bc40SHeiko Schocher 			pnum, offset, len);
14142d262c48SKyungmin Park 		goto fail;
14152d262c48SKyungmin Park 	}
14162d262c48SKyungmin Park 
1417ff94bc40SHeiko Schocher 	vfree(buf);
14182d262c48SKyungmin Park 	return 0;
14192d262c48SKyungmin Park 
14202d262c48SKyungmin Park fail:
14210195a7bbSHeiko Schocher 	ubi_err(ubi, "self-check failed for PEB %d", pnum);
14220195a7bbSHeiko Schocher 	ubi_msg(ubi, "hex dump of the %d-%d region", offset, offset + len);
1423*f8c987f8SAlexey Brodkin 	print_hex_dump("", DUMP_PREFIX_OFFSET, 32, 1, buf, len, 1);
1424ff94bc40SHeiko Schocher 	err = -EINVAL;
14252d262c48SKyungmin Park error:
1426ff94bc40SHeiko Schocher 	dump_stack();
1427ff94bc40SHeiko Schocher 	vfree(buf);
14282d262c48SKyungmin Park 	return err;
14292d262c48SKyungmin Park }
1430