xref: /rk3399_rockchip-uboot/drivers/mtd/ubi/io.c (revision 2d262c4853cb5b6ddce1a28a9641f2de3688d7ea)
1*2d262c48SKyungmin Park /*
2*2d262c48SKyungmin Park  * Copyright (c) International Business Machines Corp., 2006
3*2d262c48SKyungmin Park  * Copyright (c) Nokia Corporation, 2006, 2007
4*2d262c48SKyungmin Park  *
5*2d262c48SKyungmin Park  * This program is free software; you can redistribute it and/or modify
6*2d262c48SKyungmin Park  * it under the terms of the GNU General Public License as published by
7*2d262c48SKyungmin Park  * the Free Software Foundation; either version 2 of the License, or
8*2d262c48SKyungmin Park  * (at your option) any later version.
9*2d262c48SKyungmin Park  *
10*2d262c48SKyungmin Park  * This program is distributed in the hope that it will be useful,
11*2d262c48SKyungmin Park  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12*2d262c48SKyungmin Park  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
13*2d262c48SKyungmin Park  * the GNU General Public License for more details.
14*2d262c48SKyungmin Park  *
15*2d262c48SKyungmin Park  * You should have received a copy of the GNU General Public License
16*2d262c48SKyungmin Park  * along with this program; if not, write to the Free Software
17*2d262c48SKyungmin Park  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18*2d262c48SKyungmin Park  *
19*2d262c48SKyungmin Park  * Author: Artem Bityutskiy (Битюцкий Артём)
20*2d262c48SKyungmin Park  */
21*2d262c48SKyungmin Park 
22*2d262c48SKyungmin Park /*
23*2d262c48SKyungmin Park  * UBI input/output unit.
24*2d262c48SKyungmin Park  *
25*2d262c48SKyungmin Park  * This unit provides a uniform way to work with all kinds of the underlying
26*2d262c48SKyungmin Park  * MTD devices. It also implements handy functions for reading and writing UBI
27*2d262c48SKyungmin Park  * headers.
28*2d262c48SKyungmin Park  *
29*2d262c48SKyungmin Park  * We are trying to have a paranoid mindset and not to trust to what we read
30*2d262c48SKyungmin Park  * from the flash media in order to be more secure and robust. So this unit
31*2d262c48SKyungmin Park  * validates every single header it reads from the flash media.
32*2d262c48SKyungmin Park  *
33*2d262c48SKyungmin Park  * Some words about how the eraseblock headers are stored.
34*2d262c48SKyungmin Park  *
35*2d262c48SKyungmin Park  * The erase counter header is always stored at offset zero. By default, the
36*2d262c48SKyungmin Park  * VID header is stored after the EC header at the closest aligned offset
37*2d262c48SKyungmin Park  * (i.e. aligned to the minimum I/O unit size). Data starts next to the VID
38*2d262c48SKyungmin Park  * header at the closest aligned offset. But this default layout may be
39*2d262c48SKyungmin Park  * changed. For example, for different reasons (e.g., optimization) UBI may be
40*2d262c48SKyungmin Park  * asked to put the VID header at further offset, and even at an unaligned
41*2d262c48SKyungmin Park  * offset. Of course, if the offset of the VID header is unaligned, UBI adds
42*2d262c48SKyungmin Park  * proper padding in front of it. Data offset may also be changed but it has to
43*2d262c48SKyungmin Park  * be aligned.
44*2d262c48SKyungmin Park  *
45*2d262c48SKyungmin Park  * About minimal I/O units. In general, UBI assumes flash device model where
46*2d262c48SKyungmin Park  * there is only one minimal I/O unit size. E.g., in case of NOR flash it is 1,
47*2d262c48SKyungmin Park  * in case of NAND flash it is a NAND page, etc. This is reported by MTD in the
48*2d262c48SKyungmin Park  * @ubi->mtd->writesize field. But as an exception, UBI admits of using another
49*2d262c48SKyungmin Park  * (smaller) minimal I/O unit size for EC and VID headers to make it possible
50*2d262c48SKyungmin Park  * to do different optimizations.
51*2d262c48SKyungmin Park  *
52*2d262c48SKyungmin Park  * This is extremely useful in case of NAND flashes which admit of several
53*2d262c48SKyungmin Park  * write operations to one NAND page. In this case UBI can fit EC and VID
54*2d262c48SKyungmin Park  * headers at one NAND page. Thus, UBI may use "sub-page" size as the minimal
55*2d262c48SKyungmin Park  * I/O unit for the headers (the @ubi->hdrs_min_io_size field). But it still
56*2d262c48SKyungmin Park  * reports NAND page size (@ubi->min_io_size) as a minimal I/O unit for the UBI
57*2d262c48SKyungmin Park  * users.
58*2d262c48SKyungmin Park  *
59*2d262c48SKyungmin Park  * Example: some Samsung NANDs with 2KiB pages allow 4x 512-byte writes, so
60*2d262c48SKyungmin Park  * although the minimal I/O unit is 2K, UBI uses 512 bytes for EC and VID
61*2d262c48SKyungmin Park  * headers.
62*2d262c48SKyungmin Park  *
63*2d262c48SKyungmin Park  * Q: why not just to treat sub-page as a minimal I/O unit of this flash
64*2d262c48SKyungmin Park  * device, e.g., make @ubi->min_io_size = 512 in the example above?
65*2d262c48SKyungmin Park  *
66*2d262c48SKyungmin Park  * A: because when writing a sub-page, MTD still writes a full 2K page but the
67*2d262c48SKyungmin Park  * bytes which are no relevant to the sub-page are 0xFF. So, basically, writing
68*2d262c48SKyungmin Park  * 4x512 sub-pages is 4 times slower then writing one 2KiB NAND page. Thus, we
69*2d262c48SKyungmin Park  * prefer to use sub-pages only for EV and VID headers.
70*2d262c48SKyungmin Park  *
71*2d262c48SKyungmin Park  * As it was noted above, the VID header may start at a non-aligned offset.
72*2d262c48SKyungmin Park  * For example, in case of a 2KiB page NAND flash with a 512 bytes sub-page,
73*2d262c48SKyungmin Park  * the VID header may reside at offset 1984 which is the last 64 bytes of the
74*2d262c48SKyungmin Park  * last sub-page (EC header is always at offset zero). This causes some
75*2d262c48SKyungmin Park  * difficulties when reading and writing VID headers.
76*2d262c48SKyungmin Park  *
77*2d262c48SKyungmin Park  * Suppose we have a 64-byte buffer and we read a VID header at it. We change
78*2d262c48SKyungmin Park  * the data and want to write this VID header out. As we can only write in
79*2d262c48SKyungmin Park  * 512-byte chunks, we have to allocate one more buffer and copy our VID header
80*2d262c48SKyungmin Park  * to offset 448 of this buffer.
81*2d262c48SKyungmin Park  *
82*2d262c48SKyungmin Park  * The I/O unit does the following trick in order to avoid this extra copy.
83*2d262c48SKyungmin Park  * It always allocates a @ubi->vid_hdr_alsize bytes buffer for the VID header
84*2d262c48SKyungmin Park  * and returns a pointer to offset @ubi->vid_hdr_shift of this buffer. When the
85*2d262c48SKyungmin Park  * VID header is being written out, it shifts the VID header pointer back and
86*2d262c48SKyungmin Park  * writes the whole sub-page.
87*2d262c48SKyungmin Park  */
88*2d262c48SKyungmin Park 
89*2d262c48SKyungmin Park #ifdef UBI_LINUX
90*2d262c48SKyungmin Park #include <linux/crc32.h>
91*2d262c48SKyungmin Park #include <linux/err.h>
92*2d262c48SKyungmin Park #endif
93*2d262c48SKyungmin Park 
94*2d262c48SKyungmin Park #include <ubi_uboot.h>
95*2d262c48SKyungmin Park #include "ubi.h"
96*2d262c48SKyungmin Park 
97*2d262c48SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID
98*2d262c48SKyungmin Park static int paranoid_check_not_bad(const struct ubi_device *ubi, int pnum);
99*2d262c48SKyungmin Park static int paranoid_check_peb_ec_hdr(const struct ubi_device *ubi, int pnum);
100*2d262c48SKyungmin Park static int paranoid_check_ec_hdr(const struct ubi_device *ubi, int pnum,
101*2d262c48SKyungmin Park 				 const struct ubi_ec_hdr *ec_hdr);
102*2d262c48SKyungmin Park static int paranoid_check_peb_vid_hdr(const struct ubi_device *ubi, int pnum);
103*2d262c48SKyungmin Park static int paranoid_check_vid_hdr(const struct ubi_device *ubi, int pnum,
104*2d262c48SKyungmin Park 				  const struct ubi_vid_hdr *vid_hdr);
105*2d262c48SKyungmin Park static int paranoid_check_all_ff(struct ubi_device *ubi, int pnum, int offset,
106*2d262c48SKyungmin Park 				 int len);
107*2d262c48SKyungmin Park #else
108*2d262c48SKyungmin Park #define paranoid_check_not_bad(ubi, pnum) 0
109*2d262c48SKyungmin Park #define paranoid_check_peb_ec_hdr(ubi, pnum)  0
110*2d262c48SKyungmin Park #define paranoid_check_ec_hdr(ubi, pnum, ec_hdr)  0
111*2d262c48SKyungmin Park #define paranoid_check_peb_vid_hdr(ubi, pnum) 0
112*2d262c48SKyungmin Park #define paranoid_check_vid_hdr(ubi, pnum, vid_hdr) 0
113*2d262c48SKyungmin Park #define paranoid_check_all_ff(ubi, pnum, offset, len) 0
114*2d262c48SKyungmin Park #endif
115*2d262c48SKyungmin Park 
116*2d262c48SKyungmin Park /**
117*2d262c48SKyungmin Park  * ubi_io_read - read data from a physical eraseblock.
118*2d262c48SKyungmin Park  * @ubi: UBI device description object
119*2d262c48SKyungmin Park  * @buf: buffer where to store the read data
120*2d262c48SKyungmin Park  * @pnum: physical eraseblock number to read from
121*2d262c48SKyungmin Park  * @offset: offset within the physical eraseblock from where to read
122*2d262c48SKyungmin Park  * @len: how many bytes to read
123*2d262c48SKyungmin Park  *
124*2d262c48SKyungmin Park  * This function reads data from offset @offset of physical eraseblock @pnum
125*2d262c48SKyungmin Park  * and stores the read data in the @buf buffer. The following return codes are
126*2d262c48SKyungmin Park  * possible:
127*2d262c48SKyungmin Park  *
128*2d262c48SKyungmin Park  * o %0 if all the requested data were successfully read;
129*2d262c48SKyungmin Park  * o %UBI_IO_BITFLIPS if all the requested data were successfully read, but
130*2d262c48SKyungmin Park  *   correctable bit-flips were detected; this is harmless but may indicate
131*2d262c48SKyungmin Park  *   that this eraseblock may become bad soon (but do not have to);
132*2d262c48SKyungmin Park  * o %-EBADMSG if the MTD subsystem reported about data integrity problems, for
133*2d262c48SKyungmin Park  *   example it can be an ECC error in case of NAND; this most probably means
134*2d262c48SKyungmin Park  *   that the data is corrupted;
135*2d262c48SKyungmin Park  * o %-EIO if some I/O error occurred;
136*2d262c48SKyungmin Park  * o other negative error codes in case of other errors.
137*2d262c48SKyungmin Park  */
138*2d262c48SKyungmin Park int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset,
139*2d262c48SKyungmin Park 		int len)
140*2d262c48SKyungmin Park {
141*2d262c48SKyungmin Park 	int err, retries = 0;
142*2d262c48SKyungmin Park 	size_t read;
143*2d262c48SKyungmin Park 	loff_t addr;
144*2d262c48SKyungmin Park 
145*2d262c48SKyungmin Park 	dbg_io("read %d bytes from PEB %d:%d", len, pnum, offset);
146*2d262c48SKyungmin Park 
147*2d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
148*2d262c48SKyungmin Park 	ubi_assert(offset >= 0 && offset + len <= ubi->peb_size);
149*2d262c48SKyungmin Park 	ubi_assert(len > 0);
150*2d262c48SKyungmin Park 
151*2d262c48SKyungmin Park 	err = paranoid_check_not_bad(ubi, pnum);
152*2d262c48SKyungmin Park 	if (err)
153*2d262c48SKyungmin Park 		return err > 0 ? -EINVAL : err;
154*2d262c48SKyungmin Park 
155*2d262c48SKyungmin Park 	addr = (loff_t)pnum * ubi->peb_size + offset;
156*2d262c48SKyungmin Park retry:
157*2d262c48SKyungmin Park 	err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf);
158*2d262c48SKyungmin Park 	if (err) {
159*2d262c48SKyungmin Park 		if (err == -EUCLEAN) {
160*2d262c48SKyungmin Park 			/*
161*2d262c48SKyungmin Park 			 * -EUCLEAN is reported if there was a bit-flip which
162*2d262c48SKyungmin Park 			 * was corrected, so this is harmless.
163*2d262c48SKyungmin Park 			 */
164*2d262c48SKyungmin Park 			ubi_msg("fixable bit-flip detected at PEB %d", pnum);
165*2d262c48SKyungmin Park 			ubi_assert(len == read);
166*2d262c48SKyungmin Park 			return UBI_IO_BITFLIPS;
167*2d262c48SKyungmin Park 		}
168*2d262c48SKyungmin Park 
169*2d262c48SKyungmin Park 		if (read != len && retries++ < UBI_IO_RETRIES) {
170*2d262c48SKyungmin Park 			dbg_io("error %d while reading %d bytes from PEB %d:%d, "
171*2d262c48SKyungmin Park 			       "read only %zd bytes, retry",
172*2d262c48SKyungmin Park 			       err, len, pnum, offset, read);
173*2d262c48SKyungmin Park 			yield();
174*2d262c48SKyungmin Park 			goto retry;
175*2d262c48SKyungmin Park 		}
176*2d262c48SKyungmin Park 
177*2d262c48SKyungmin Park 		ubi_err("error %d while reading %d bytes from PEB %d:%d, "
178*2d262c48SKyungmin Park 			"read %zd bytes", err, len, pnum, offset, read);
179*2d262c48SKyungmin Park 		ubi_dbg_dump_stack();
180*2d262c48SKyungmin Park 
181*2d262c48SKyungmin Park 		/*
182*2d262c48SKyungmin Park 		 * The driver should never return -EBADMSG if it failed to read
183*2d262c48SKyungmin Park 		 * all the requested data. But some buggy drivers might do
184*2d262c48SKyungmin Park 		 * this, so we change it to -EIO.
185*2d262c48SKyungmin Park 		 */
186*2d262c48SKyungmin Park 		if (read != len && err == -EBADMSG) {
187*2d262c48SKyungmin Park 			ubi_assert(0);
188*2d262c48SKyungmin Park 			printk("%s[%d] not here\n", __func__, __LINE__);
189*2d262c48SKyungmin Park //			err = -EIO;
190*2d262c48SKyungmin Park 		}
191*2d262c48SKyungmin Park 	} else {
192*2d262c48SKyungmin Park 		ubi_assert(len == read);
193*2d262c48SKyungmin Park 
194*2d262c48SKyungmin Park 		if (ubi_dbg_is_bitflip()) {
195*2d262c48SKyungmin Park 			dbg_msg("bit-flip (emulated)");
196*2d262c48SKyungmin Park 			err = UBI_IO_BITFLIPS;
197*2d262c48SKyungmin Park 		}
198*2d262c48SKyungmin Park 	}
199*2d262c48SKyungmin Park 
200*2d262c48SKyungmin Park 	return err;
201*2d262c48SKyungmin Park }
202*2d262c48SKyungmin Park 
203*2d262c48SKyungmin Park /**
204*2d262c48SKyungmin Park  * ubi_io_write - write data to a physical eraseblock.
205*2d262c48SKyungmin Park  * @ubi: UBI device description object
206*2d262c48SKyungmin Park  * @buf: buffer with the data to write
207*2d262c48SKyungmin Park  * @pnum: physical eraseblock number to write to
208*2d262c48SKyungmin Park  * @offset: offset within the physical eraseblock where to write
209*2d262c48SKyungmin Park  * @len: how many bytes to write
210*2d262c48SKyungmin Park  *
211*2d262c48SKyungmin Park  * This function writes @len bytes of data from buffer @buf to offset @offset
212*2d262c48SKyungmin Park  * of physical eraseblock @pnum. If all the data were successfully written,
213*2d262c48SKyungmin Park  * zero is returned. If an error occurred, this function returns a negative
214*2d262c48SKyungmin Park  * error code. If %-EIO is returned, the physical eraseblock most probably went
215*2d262c48SKyungmin Park  * bad.
216*2d262c48SKyungmin Park  *
217*2d262c48SKyungmin Park  * Note, in case of an error, it is possible that something was still written
218*2d262c48SKyungmin Park  * to the flash media, but may be some garbage.
219*2d262c48SKyungmin Park  */
220*2d262c48SKyungmin Park int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset,
221*2d262c48SKyungmin Park 		 int len)
222*2d262c48SKyungmin Park {
223*2d262c48SKyungmin Park 	int err;
224*2d262c48SKyungmin Park 	size_t written;
225*2d262c48SKyungmin Park 	loff_t addr;
226*2d262c48SKyungmin Park 
227*2d262c48SKyungmin Park 	dbg_io("write %d bytes to PEB %d:%d", len, pnum, offset);
228*2d262c48SKyungmin Park 
229*2d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
230*2d262c48SKyungmin Park 	ubi_assert(offset >= 0 && offset + len <= ubi->peb_size);
231*2d262c48SKyungmin Park 	ubi_assert(offset % ubi->hdrs_min_io_size == 0);
232*2d262c48SKyungmin Park 	ubi_assert(len > 0 && len % ubi->hdrs_min_io_size == 0);
233*2d262c48SKyungmin Park 
234*2d262c48SKyungmin Park 	if (ubi->ro_mode) {
235*2d262c48SKyungmin Park 		ubi_err("read-only mode");
236*2d262c48SKyungmin Park 		return -EROFS;
237*2d262c48SKyungmin Park 	}
238*2d262c48SKyungmin Park 
239*2d262c48SKyungmin Park 	/* The below has to be compiled out if paranoid checks are disabled */
240*2d262c48SKyungmin Park 
241*2d262c48SKyungmin Park 	err = paranoid_check_not_bad(ubi, pnum);
242*2d262c48SKyungmin Park 	if (err)
243*2d262c48SKyungmin Park 		return err > 0 ? -EINVAL : err;
244*2d262c48SKyungmin Park 
245*2d262c48SKyungmin Park 	/* The area we are writing to has to contain all 0xFF bytes */
246*2d262c48SKyungmin Park 	err = paranoid_check_all_ff(ubi, pnum, offset, len);
247*2d262c48SKyungmin Park 	if (err)
248*2d262c48SKyungmin Park 		return err > 0 ? -EINVAL : err;
249*2d262c48SKyungmin Park 
250*2d262c48SKyungmin Park 	if (offset >= ubi->leb_start) {
251*2d262c48SKyungmin Park 		/*
252*2d262c48SKyungmin Park 		 * We write to the data area of the physical eraseblock. Make
253*2d262c48SKyungmin Park 		 * sure it has valid EC and VID headers.
254*2d262c48SKyungmin Park 		 */
255*2d262c48SKyungmin Park 		err = paranoid_check_peb_ec_hdr(ubi, pnum);
256*2d262c48SKyungmin Park 		if (err)
257*2d262c48SKyungmin Park 			return err > 0 ? -EINVAL : err;
258*2d262c48SKyungmin Park 		err = paranoid_check_peb_vid_hdr(ubi, pnum);
259*2d262c48SKyungmin Park 		if (err)
260*2d262c48SKyungmin Park 			return err > 0 ? -EINVAL : err;
261*2d262c48SKyungmin Park 	}
262*2d262c48SKyungmin Park 
263*2d262c48SKyungmin Park 	if (ubi_dbg_is_write_failure()) {
264*2d262c48SKyungmin Park 		dbg_err("cannot write %d bytes to PEB %d:%d "
265*2d262c48SKyungmin Park 			"(emulated)", len, pnum, offset);
266*2d262c48SKyungmin Park 		ubi_dbg_dump_stack();
267*2d262c48SKyungmin Park 		return -EIO;
268*2d262c48SKyungmin Park 	}
269*2d262c48SKyungmin Park 
270*2d262c48SKyungmin Park 	addr = (loff_t)pnum * ubi->peb_size + offset;
271*2d262c48SKyungmin Park 	err = ubi->mtd->write(ubi->mtd, addr, len, &written, buf);
272*2d262c48SKyungmin Park 	if (err) {
273*2d262c48SKyungmin Park 		ubi_err("error %d while writing %d bytes to PEB %d:%d, written"
274*2d262c48SKyungmin Park 			" %zd bytes", err, len, pnum, offset, written);
275*2d262c48SKyungmin Park 		ubi_dbg_dump_stack();
276*2d262c48SKyungmin Park 	} else
277*2d262c48SKyungmin Park 		ubi_assert(written == len);
278*2d262c48SKyungmin Park 
279*2d262c48SKyungmin Park 	return err;
280*2d262c48SKyungmin Park }
281*2d262c48SKyungmin Park 
282*2d262c48SKyungmin Park /**
283*2d262c48SKyungmin Park  * erase_callback - MTD erasure call-back.
284*2d262c48SKyungmin Park  * @ei: MTD erase information object.
285*2d262c48SKyungmin Park  *
286*2d262c48SKyungmin Park  * Note, even though MTD erase interface is asynchronous, all the current
287*2d262c48SKyungmin Park  * implementations are synchronous anyway.
288*2d262c48SKyungmin Park  */
289*2d262c48SKyungmin Park static void erase_callback(struct erase_info *ei)
290*2d262c48SKyungmin Park {
291*2d262c48SKyungmin Park 	wake_up_interruptible((wait_queue_head_t *)ei->priv);
292*2d262c48SKyungmin Park }
293*2d262c48SKyungmin Park 
294*2d262c48SKyungmin Park /**
295*2d262c48SKyungmin Park  * do_sync_erase - synchronously erase a physical eraseblock.
296*2d262c48SKyungmin Park  * @ubi: UBI device description object
297*2d262c48SKyungmin Park  * @pnum: the physical eraseblock number to erase
298*2d262c48SKyungmin Park  *
299*2d262c48SKyungmin Park  * This function synchronously erases physical eraseblock @pnum and returns
300*2d262c48SKyungmin Park  * zero in case of success and a negative error code in case of failure. If
301*2d262c48SKyungmin Park  * %-EIO is returned, the physical eraseblock most probably went bad.
302*2d262c48SKyungmin Park  */
303*2d262c48SKyungmin Park static int do_sync_erase(struct ubi_device *ubi, int pnum)
304*2d262c48SKyungmin Park {
305*2d262c48SKyungmin Park 	int err, retries = 0;
306*2d262c48SKyungmin Park 	struct erase_info ei;
307*2d262c48SKyungmin Park 	wait_queue_head_t wq;
308*2d262c48SKyungmin Park 
309*2d262c48SKyungmin Park 	dbg_io("erase PEB %d", pnum);
310*2d262c48SKyungmin Park 
311*2d262c48SKyungmin Park retry:
312*2d262c48SKyungmin Park 	init_waitqueue_head(&wq);
313*2d262c48SKyungmin Park 	memset(&ei, 0, sizeof(struct erase_info));
314*2d262c48SKyungmin Park 
315*2d262c48SKyungmin Park 	ei.mtd      = ubi->mtd;
316*2d262c48SKyungmin Park 	ei.addr     = (loff_t)pnum * ubi->peb_size;
317*2d262c48SKyungmin Park 	ei.len      = ubi->peb_size;
318*2d262c48SKyungmin Park 	ei.callback = erase_callback;
319*2d262c48SKyungmin Park 	ei.priv     = (unsigned long)&wq;
320*2d262c48SKyungmin Park 
321*2d262c48SKyungmin Park 	err = ubi->mtd->erase(ubi->mtd, &ei);
322*2d262c48SKyungmin Park 	if (err) {
323*2d262c48SKyungmin Park 		if (retries++ < UBI_IO_RETRIES) {
324*2d262c48SKyungmin Park 			dbg_io("error %d while erasing PEB %d, retry",
325*2d262c48SKyungmin Park 			       err, pnum);
326*2d262c48SKyungmin Park 			yield();
327*2d262c48SKyungmin Park 			goto retry;
328*2d262c48SKyungmin Park 		}
329*2d262c48SKyungmin Park 		ubi_err("cannot erase PEB %d, error %d", pnum, err);
330*2d262c48SKyungmin Park 		ubi_dbg_dump_stack();
331*2d262c48SKyungmin Park 		return err;
332*2d262c48SKyungmin Park 	}
333*2d262c48SKyungmin Park 
334*2d262c48SKyungmin Park 	err = wait_event_interruptible(wq, ei.state == MTD_ERASE_DONE ||
335*2d262c48SKyungmin Park 					   ei.state == MTD_ERASE_FAILED);
336*2d262c48SKyungmin Park 	if (err) {
337*2d262c48SKyungmin Park 		ubi_err("interrupted PEB %d erasure", pnum);
338*2d262c48SKyungmin Park 		return -EINTR;
339*2d262c48SKyungmin Park 	}
340*2d262c48SKyungmin Park 
341*2d262c48SKyungmin Park 	if (ei.state == MTD_ERASE_FAILED) {
342*2d262c48SKyungmin Park 		if (retries++ < UBI_IO_RETRIES) {
343*2d262c48SKyungmin Park 			dbg_io("error while erasing PEB %d, retry", pnum);
344*2d262c48SKyungmin Park 			yield();
345*2d262c48SKyungmin Park 			goto retry;
346*2d262c48SKyungmin Park 		}
347*2d262c48SKyungmin Park 		ubi_err("cannot erase PEB %d", pnum);
348*2d262c48SKyungmin Park 		ubi_dbg_dump_stack();
349*2d262c48SKyungmin Park 		return -EIO;
350*2d262c48SKyungmin Park 	}
351*2d262c48SKyungmin Park 
352*2d262c48SKyungmin Park 	err = paranoid_check_all_ff(ubi, pnum, 0, ubi->peb_size);
353*2d262c48SKyungmin Park 	if (err)
354*2d262c48SKyungmin Park 		return err > 0 ? -EINVAL : err;
355*2d262c48SKyungmin Park 
356*2d262c48SKyungmin Park 	if (ubi_dbg_is_erase_failure() && !err) {
357*2d262c48SKyungmin Park 		dbg_err("cannot erase PEB %d (emulated)", pnum);
358*2d262c48SKyungmin Park 		return -EIO;
359*2d262c48SKyungmin Park 	}
360*2d262c48SKyungmin Park 
361*2d262c48SKyungmin Park 	return 0;
362*2d262c48SKyungmin Park }
363*2d262c48SKyungmin Park 
364*2d262c48SKyungmin Park /**
365*2d262c48SKyungmin Park  * check_pattern - check if buffer contains only a certain byte pattern.
366*2d262c48SKyungmin Park  * @buf: buffer to check
367*2d262c48SKyungmin Park  * @patt: the pattern to check
368*2d262c48SKyungmin Park  * @size: buffer size in bytes
369*2d262c48SKyungmin Park  *
370*2d262c48SKyungmin Park  * This function returns %1 in there are only @patt bytes in @buf, and %0 if
371*2d262c48SKyungmin Park  * something else was also found.
372*2d262c48SKyungmin Park  */
373*2d262c48SKyungmin Park static int check_pattern(const void *buf, uint8_t patt, int size)
374*2d262c48SKyungmin Park {
375*2d262c48SKyungmin Park 	int i;
376*2d262c48SKyungmin Park 
377*2d262c48SKyungmin Park 	for (i = 0; i < size; i++)
378*2d262c48SKyungmin Park 		if (((const uint8_t *)buf)[i] != patt)
379*2d262c48SKyungmin Park 			return 0;
380*2d262c48SKyungmin Park 	return 1;
381*2d262c48SKyungmin Park }
382*2d262c48SKyungmin Park 
383*2d262c48SKyungmin Park /* Patterns to write to a physical eraseblock when torturing it */
384*2d262c48SKyungmin Park static uint8_t patterns[] = {0xa5, 0x5a, 0x0};
385*2d262c48SKyungmin Park 
386*2d262c48SKyungmin Park /**
387*2d262c48SKyungmin Park  * torture_peb - test a supposedly bad physical eraseblock.
388*2d262c48SKyungmin Park  * @ubi: UBI device description object
389*2d262c48SKyungmin Park  * @pnum: the physical eraseblock number to test
390*2d262c48SKyungmin Park  *
391*2d262c48SKyungmin Park  * This function returns %-EIO if the physical eraseblock did not pass the
392*2d262c48SKyungmin Park  * test, a positive number of erase operations done if the test was
393*2d262c48SKyungmin Park  * successfully passed, and other negative error codes in case of other errors.
394*2d262c48SKyungmin Park  */
395*2d262c48SKyungmin Park static int torture_peb(struct ubi_device *ubi, int pnum)
396*2d262c48SKyungmin Park {
397*2d262c48SKyungmin Park 	int err, i, patt_count;
398*2d262c48SKyungmin Park 
399*2d262c48SKyungmin Park 	patt_count = ARRAY_SIZE(patterns);
400*2d262c48SKyungmin Park 	ubi_assert(patt_count > 0);
401*2d262c48SKyungmin Park 
402*2d262c48SKyungmin Park 	mutex_lock(&ubi->buf_mutex);
403*2d262c48SKyungmin Park 	for (i = 0; i < patt_count; i++) {
404*2d262c48SKyungmin Park 		err = do_sync_erase(ubi, pnum);
405*2d262c48SKyungmin Park 		if (err)
406*2d262c48SKyungmin Park 			goto out;
407*2d262c48SKyungmin Park 
408*2d262c48SKyungmin Park 		/* Make sure the PEB contains only 0xFF bytes */
409*2d262c48SKyungmin Park 		err = ubi_io_read(ubi, ubi->peb_buf1, pnum, 0, ubi->peb_size);
410*2d262c48SKyungmin Park 		if (err)
411*2d262c48SKyungmin Park 			goto out;
412*2d262c48SKyungmin Park 
413*2d262c48SKyungmin Park 		err = check_pattern(ubi->peb_buf1, 0xFF, ubi->peb_size);
414*2d262c48SKyungmin Park 		if (err == 0) {
415*2d262c48SKyungmin Park 			ubi_err("erased PEB %d, but a non-0xFF byte found",
416*2d262c48SKyungmin Park 				pnum);
417*2d262c48SKyungmin Park 			err = -EIO;
418*2d262c48SKyungmin Park 			goto out;
419*2d262c48SKyungmin Park 		}
420*2d262c48SKyungmin Park 
421*2d262c48SKyungmin Park 		/* Write a pattern and check it */
422*2d262c48SKyungmin Park 		memset(ubi->peb_buf1, patterns[i], ubi->peb_size);
423*2d262c48SKyungmin Park 		err = ubi_io_write(ubi, ubi->peb_buf1, pnum, 0, ubi->peb_size);
424*2d262c48SKyungmin Park 		if (err)
425*2d262c48SKyungmin Park 			goto out;
426*2d262c48SKyungmin Park 
427*2d262c48SKyungmin Park 		memset(ubi->peb_buf1, ~patterns[i], ubi->peb_size);
428*2d262c48SKyungmin Park 		err = ubi_io_read(ubi, ubi->peb_buf1, pnum, 0, ubi->peb_size);
429*2d262c48SKyungmin Park 		if (err)
430*2d262c48SKyungmin Park 			goto out;
431*2d262c48SKyungmin Park 
432*2d262c48SKyungmin Park 		err = check_pattern(ubi->peb_buf1, patterns[i], ubi->peb_size);
433*2d262c48SKyungmin Park 		if (err == 0) {
434*2d262c48SKyungmin Park 			ubi_err("pattern %x checking failed for PEB %d",
435*2d262c48SKyungmin Park 				patterns[i], pnum);
436*2d262c48SKyungmin Park 			err = -EIO;
437*2d262c48SKyungmin Park 			goto out;
438*2d262c48SKyungmin Park 		}
439*2d262c48SKyungmin Park 	}
440*2d262c48SKyungmin Park 
441*2d262c48SKyungmin Park 	err = patt_count;
442*2d262c48SKyungmin Park 
443*2d262c48SKyungmin Park out:
444*2d262c48SKyungmin Park 	mutex_unlock(&ubi->buf_mutex);
445*2d262c48SKyungmin Park 	if (err == UBI_IO_BITFLIPS || err == -EBADMSG) {
446*2d262c48SKyungmin Park 		/*
447*2d262c48SKyungmin Park 		 * If a bit-flip or data integrity error was detected, the test
448*2d262c48SKyungmin Park 		 * has not passed because it happened on a freshly erased
449*2d262c48SKyungmin Park 		 * physical eraseblock which means something is wrong with it.
450*2d262c48SKyungmin Park 		 */
451*2d262c48SKyungmin Park 		ubi_err("read problems on freshly erased PEB %d, must be bad",
452*2d262c48SKyungmin Park 			pnum);
453*2d262c48SKyungmin Park 		err = -EIO;
454*2d262c48SKyungmin Park 	}
455*2d262c48SKyungmin Park 	return err;
456*2d262c48SKyungmin Park }
457*2d262c48SKyungmin Park 
458*2d262c48SKyungmin Park /**
459*2d262c48SKyungmin Park  * ubi_io_sync_erase - synchronously erase a physical eraseblock.
460*2d262c48SKyungmin Park  * @ubi: UBI device description object
461*2d262c48SKyungmin Park  * @pnum: physical eraseblock number to erase
462*2d262c48SKyungmin Park  * @torture: if this physical eraseblock has to be tortured
463*2d262c48SKyungmin Park  *
464*2d262c48SKyungmin Park  * This function synchronously erases physical eraseblock @pnum. If @torture
465*2d262c48SKyungmin Park  * flag is not zero, the physical eraseblock is checked by means of writing
466*2d262c48SKyungmin Park  * different patterns to it and reading them back. If the torturing is enabled,
467*2d262c48SKyungmin Park  * the physical eraseblock is erased more then once.
468*2d262c48SKyungmin Park  *
469*2d262c48SKyungmin Park  * This function returns the number of erasures made in case of success, %-EIO
470*2d262c48SKyungmin Park  * if the erasure failed or the torturing test failed, and other negative error
471*2d262c48SKyungmin Park  * codes in case of other errors. Note, %-EIO means that the physical
472*2d262c48SKyungmin Park  * eraseblock is bad.
473*2d262c48SKyungmin Park  */
474*2d262c48SKyungmin Park int ubi_io_sync_erase(struct ubi_device *ubi, int pnum, int torture)
475*2d262c48SKyungmin Park {
476*2d262c48SKyungmin Park 	int err, ret = 0;
477*2d262c48SKyungmin Park 
478*2d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
479*2d262c48SKyungmin Park 
480*2d262c48SKyungmin Park 	err = paranoid_check_not_bad(ubi, pnum);
481*2d262c48SKyungmin Park 	if (err != 0)
482*2d262c48SKyungmin Park 		return err > 0 ? -EINVAL : err;
483*2d262c48SKyungmin Park 
484*2d262c48SKyungmin Park 	if (ubi->ro_mode) {
485*2d262c48SKyungmin Park 		ubi_err("read-only mode");
486*2d262c48SKyungmin Park 		return -EROFS;
487*2d262c48SKyungmin Park 	}
488*2d262c48SKyungmin Park 
489*2d262c48SKyungmin Park 	if (torture) {
490*2d262c48SKyungmin Park 		ret = torture_peb(ubi, pnum);
491*2d262c48SKyungmin Park 		if (ret < 0)
492*2d262c48SKyungmin Park 			return ret;
493*2d262c48SKyungmin Park 	}
494*2d262c48SKyungmin Park 
495*2d262c48SKyungmin Park 	err = do_sync_erase(ubi, pnum);
496*2d262c48SKyungmin Park 	if (err)
497*2d262c48SKyungmin Park 		return err;
498*2d262c48SKyungmin Park 
499*2d262c48SKyungmin Park 	return ret + 1;
500*2d262c48SKyungmin Park }
501*2d262c48SKyungmin Park 
502*2d262c48SKyungmin Park /**
503*2d262c48SKyungmin Park  * ubi_io_is_bad - check if a physical eraseblock is bad.
504*2d262c48SKyungmin Park  * @ubi: UBI device description object
505*2d262c48SKyungmin Park  * @pnum: the physical eraseblock number to check
506*2d262c48SKyungmin Park  *
507*2d262c48SKyungmin Park  * This function returns a positive number if the physical eraseblock is bad,
508*2d262c48SKyungmin Park  * zero if not, and a negative error code if an error occurred.
509*2d262c48SKyungmin Park  */
510*2d262c48SKyungmin Park int ubi_io_is_bad(const struct ubi_device *ubi, int pnum)
511*2d262c48SKyungmin Park {
512*2d262c48SKyungmin Park 	struct mtd_info *mtd = ubi->mtd;
513*2d262c48SKyungmin Park 
514*2d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
515*2d262c48SKyungmin Park 
516*2d262c48SKyungmin Park 	if (ubi->bad_allowed) {
517*2d262c48SKyungmin Park 		int ret;
518*2d262c48SKyungmin Park 
519*2d262c48SKyungmin Park 		ret = mtd->block_isbad(mtd, (loff_t)pnum * ubi->peb_size);
520*2d262c48SKyungmin Park 		if (ret < 0)
521*2d262c48SKyungmin Park 			ubi_err("error %d while checking if PEB %d is bad",
522*2d262c48SKyungmin Park 				ret, pnum);
523*2d262c48SKyungmin Park 		else if (ret)
524*2d262c48SKyungmin Park 			dbg_io("PEB %d is bad", pnum);
525*2d262c48SKyungmin Park 		return ret;
526*2d262c48SKyungmin Park 	}
527*2d262c48SKyungmin Park 
528*2d262c48SKyungmin Park 	return 0;
529*2d262c48SKyungmin Park }
530*2d262c48SKyungmin Park 
531*2d262c48SKyungmin Park /**
532*2d262c48SKyungmin Park  * ubi_io_mark_bad - mark a physical eraseblock as bad.
533*2d262c48SKyungmin Park  * @ubi: UBI device description object
534*2d262c48SKyungmin Park  * @pnum: the physical eraseblock number to mark
535*2d262c48SKyungmin Park  *
536*2d262c48SKyungmin Park  * This function returns zero in case of success and a negative error code in
537*2d262c48SKyungmin Park  * case of failure.
538*2d262c48SKyungmin Park  */
539*2d262c48SKyungmin Park int ubi_io_mark_bad(const struct ubi_device *ubi, int pnum)
540*2d262c48SKyungmin Park {
541*2d262c48SKyungmin Park 	int err;
542*2d262c48SKyungmin Park 	struct mtd_info *mtd = ubi->mtd;
543*2d262c48SKyungmin Park 
544*2d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
545*2d262c48SKyungmin Park 
546*2d262c48SKyungmin Park 	if (ubi->ro_mode) {
547*2d262c48SKyungmin Park 		ubi_err("read-only mode");
548*2d262c48SKyungmin Park 		return -EROFS;
549*2d262c48SKyungmin Park 	}
550*2d262c48SKyungmin Park 
551*2d262c48SKyungmin Park 	if (!ubi->bad_allowed)
552*2d262c48SKyungmin Park 		return 0;
553*2d262c48SKyungmin Park 
554*2d262c48SKyungmin Park 	err = mtd->block_markbad(mtd, (loff_t)pnum * ubi->peb_size);
555*2d262c48SKyungmin Park 	if (err)
556*2d262c48SKyungmin Park 		ubi_err("cannot mark PEB %d bad, error %d", pnum, err);
557*2d262c48SKyungmin Park 	return err;
558*2d262c48SKyungmin Park }
559*2d262c48SKyungmin Park 
560*2d262c48SKyungmin Park /**
561*2d262c48SKyungmin Park  * validate_ec_hdr - validate an erase counter header.
562*2d262c48SKyungmin Park  * @ubi: UBI device description object
563*2d262c48SKyungmin Park  * @ec_hdr: the erase counter header to check
564*2d262c48SKyungmin Park  *
565*2d262c48SKyungmin Park  * This function returns zero if the erase counter header is OK, and %1 if
566*2d262c48SKyungmin Park  * not.
567*2d262c48SKyungmin Park  */
568*2d262c48SKyungmin Park static int validate_ec_hdr(const struct ubi_device *ubi,
569*2d262c48SKyungmin Park 			   const struct ubi_ec_hdr *ec_hdr)
570*2d262c48SKyungmin Park {
571*2d262c48SKyungmin Park 	long long ec;
572*2d262c48SKyungmin Park 	int vid_hdr_offset, leb_start;
573*2d262c48SKyungmin Park 
574*2d262c48SKyungmin Park 	ec = be64_to_cpu(ec_hdr->ec);
575*2d262c48SKyungmin Park 	vid_hdr_offset = be32_to_cpu(ec_hdr->vid_hdr_offset);
576*2d262c48SKyungmin Park 	leb_start = be32_to_cpu(ec_hdr->data_offset);
577*2d262c48SKyungmin Park 
578*2d262c48SKyungmin Park 	if (ec_hdr->version != UBI_VERSION) {
579*2d262c48SKyungmin Park 		ubi_err("node with incompatible UBI version found: "
580*2d262c48SKyungmin Park 			"this UBI version is %d, image version is %d",
581*2d262c48SKyungmin Park 			UBI_VERSION, (int)ec_hdr->version);
582*2d262c48SKyungmin Park 		goto bad;
583*2d262c48SKyungmin Park 	}
584*2d262c48SKyungmin Park 
585*2d262c48SKyungmin Park 	if (vid_hdr_offset != ubi->vid_hdr_offset) {
586*2d262c48SKyungmin Park 		ubi_err("bad VID header offset %d, expected %d",
587*2d262c48SKyungmin Park 			vid_hdr_offset, ubi->vid_hdr_offset);
588*2d262c48SKyungmin Park 		goto bad;
589*2d262c48SKyungmin Park 	}
590*2d262c48SKyungmin Park 
591*2d262c48SKyungmin Park 	if (leb_start != ubi->leb_start) {
592*2d262c48SKyungmin Park 		ubi_err("bad data offset %d, expected %d",
593*2d262c48SKyungmin Park 			leb_start, ubi->leb_start);
594*2d262c48SKyungmin Park 		goto bad;
595*2d262c48SKyungmin Park 	}
596*2d262c48SKyungmin Park 
597*2d262c48SKyungmin Park 	if (ec < 0 || ec > UBI_MAX_ERASECOUNTER) {
598*2d262c48SKyungmin Park 		ubi_err("bad erase counter %lld", ec);
599*2d262c48SKyungmin Park 		goto bad;
600*2d262c48SKyungmin Park 	}
601*2d262c48SKyungmin Park 
602*2d262c48SKyungmin Park 	return 0;
603*2d262c48SKyungmin Park 
604*2d262c48SKyungmin Park bad:
605*2d262c48SKyungmin Park 	ubi_err("bad EC header");
606*2d262c48SKyungmin Park 	ubi_dbg_dump_ec_hdr(ec_hdr);
607*2d262c48SKyungmin Park 	ubi_dbg_dump_stack();
608*2d262c48SKyungmin Park 	return 1;
609*2d262c48SKyungmin Park }
610*2d262c48SKyungmin Park 
611*2d262c48SKyungmin Park /**
612*2d262c48SKyungmin Park  * ubi_io_read_ec_hdr - read and check an erase counter header.
613*2d262c48SKyungmin Park  * @ubi: UBI device description object
614*2d262c48SKyungmin Park  * @pnum: physical eraseblock to read from
615*2d262c48SKyungmin Park  * @ec_hdr: a &struct ubi_ec_hdr object where to store the read erase counter
616*2d262c48SKyungmin Park  * header
617*2d262c48SKyungmin Park  * @verbose: be verbose if the header is corrupted or was not found
618*2d262c48SKyungmin Park  *
619*2d262c48SKyungmin Park  * This function reads erase counter header from physical eraseblock @pnum and
620*2d262c48SKyungmin Park  * stores it in @ec_hdr. This function also checks CRC checksum of the read
621*2d262c48SKyungmin Park  * erase counter header. The following codes may be returned:
622*2d262c48SKyungmin Park  *
623*2d262c48SKyungmin Park  * o %0 if the CRC checksum is correct and the header was successfully read;
624*2d262c48SKyungmin Park  * o %UBI_IO_BITFLIPS if the CRC is correct, but bit-flips were detected
625*2d262c48SKyungmin Park  *   and corrected by the flash driver; this is harmless but may indicate that
626*2d262c48SKyungmin Park  *   this eraseblock may become bad soon (but may be not);
627*2d262c48SKyungmin Park  * o %UBI_IO_BAD_EC_HDR if the erase counter header is corrupted (a CRC error);
628*2d262c48SKyungmin Park  * o %UBI_IO_PEB_EMPTY if the physical eraseblock is empty;
629*2d262c48SKyungmin Park  * o a negative error code in case of failure.
630*2d262c48SKyungmin Park  */
631*2d262c48SKyungmin Park int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum,
632*2d262c48SKyungmin Park 		       struct ubi_ec_hdr *ec_hdr, int verbose)
633*2d262c48SKyungmin Park {
634*2d262c48SKyungmin Park 	int err, read_err = 0;
635*2d262c48SKyungmin Park 	uint32_t crc, magic, hdr_crc;
636*2d262c48SKyungmin Park 
637*2d262c48SKyungmin Park 	dbg_io("read EC header from PEB %d", pnum);
638*2d262c48SKyungmin Park 	ubi_assert(pnum >= 0 && pnum < ubi->peb_count);
639*2d262c48SKyungmin Park 	if (UBI_IO_DEBUG)
640*2d262c48SKyungmin Park 		verbose = 1;
641*2d262c48SKyungmin Park 
642*2d262c48SKyungmin Park 	err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE);
643*2d262c48SKyungmin Park 	if (err) {
644*2d262c48SKyungmin Park 		if (err != UBI_IO_BITFLIPS && err != -EBADMSG)
645*2d262c48SKyungmin Park 			return err;
646*2d262c48SKyungmin Park 
647*2d262c48SKyungmin Park 		/*
648*2d262c48SKyungmin Park 		 * We read all the data, but either a correctable bit-flip
649*2d262c48SKyungmin Park 		 * occurred, or MTD reported about some data integrity error,
650*2d262c48SKyungmin Park 		 * like an ECC error in case of NAND. The former is harmless,
651*2d262c48SKyungmin Park 		 * the later may mean that the read data is corrupted. But we
652*2d262c48SKyungmin Park 		 * have a CRC check-sum and we will detect this. If the EC
653*2d262c48SKyungmin Park 		 * header is still OK, we just report this as there was a
654*2d262c48SKyungmin Park 		 * bit-flip.
655*2d262c48SKyungmin Park 		 */
656*2d262c48SKyungmin Park 		read_err = err;
657*2d262c48SKyungmin Park 	}
658*2d262c48SKyungmin Park 
659*2d262c48SKyungmin Park 	magic = be32_to_cpu(ec_hdr->magic);
660*2d262c48SKyungmin Park 	if (magic != UBI_EC_HDR_MAGIC) {
661*2d262c48SKyungmin Park 		/*
662*2d262c48SKyungmin Park 		 * The magic field is wrong. Let's check if we have read all
663*2d262c48SKyungmin Park 		 * 0xFF. If yes, this physical eraseblock is assumed to be
664*2d262c48SKyungmin Park 		 * empty.
665*2d262c48SKyungmin Park 		 *
666*2d262c48SKyungmin Park 		 * But if there was a read error, we do not test it for all
667*2d262c48SKyungmin Park 		 * 0xFFs. Even if it does contain all 0xFFs, this error
668*2d262c48SKyungmin Park 		 * indicates that something is still wrong with this physical
669*2d262c48SKyungmin Park 		 * eraseblock and we anyway cannot treat it as empty.
670*2d262c48SKyungmin Park 		 */
671*2d262c48SKyungmin Park 		if (read_err != -EBADMSG &&
672*2d262c48SKyungmin Park 		    check_pattern(ec_hdr, 0xFF, UBI_EC_HDR_SIZE)) {
673*2d262c48SKyungmin Park 			/* The physical eraseblock is supposedly empty */
674*2d262c48SKyungmin Park 
675*2d262c48SKyungmin Park 			/*
676*2d262c48SKyungmin Park 			 * The below is just a paranoid check, it has to be
677*2d262c48SKyungmin Park 			 * compiled out if paranoid checks are disabled.
678*2d262c48SKyungmin Park 			 */
679*2d262c48SKyungmin Park 			err = paranoid_check_all_ff(ubi, pnum, 0,
680*2d262c48SKyungmin Park 						    ubi->peb_size);
681*2d262c48SKyungmin Park 			if (err)
682*2d262c48SKyungmin Park 				return err > 0 ? UBI_IO_BAD_EC_HDR : err;
683*2d262c48SKyungmin Park 
684*2d262c48SKyungmin Park 			if (verbose)
685*2d262c48SKyungmin Park 				ubi_warn("no EC header found at PEB %d, "
686*2d262c48SKyungmin Park 					 "only 0xFF bytes", pnum);
687*2d262c48SKyungmin Park 			return UBI_IO_PEB_EMPTY;
688*2d262c48SKyungmin Park 		}
689*2d262c48SKyungmin Park 
690*2d262c48SKyungmin Park 		/*
691*2d262c48SKyungmin Park 		 * This is not a valid erase counter header, and these are not
692*2d262c48SKyungmin Park 		 * 0xFF bytes. Report that the header is corrupted.
693*2d262c48SKyungmin Park 		 */
694*2d262c48SKyungmin Park 		if (verbose) {
695*2d262c48SKyungmin Park 			ubi_warn("bad magic number at PEB %d: %08x instead of "
696*2d262c48SKyungmin Park 				 "%08x", pnum, magic, UBI_EC_HDR_MAGIC);
697*2d262c48SKyungmin Park 			ubi_dbg_dump_ec_hdr(ec_hdr);
698*2d262c48SKyungmin Park 		}
699*2d262c48SKyungmin Park 		return UBI_IO_BAD_EC_HDR;
700*2d262c48SKyungmin Park 	}
701*2d262c48SKyungmin Park 
702*2d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, ec_hdr, UBI_EC_HDR_SIZE_CRC);
703*2d262c48SKyungmin Park 	hdr_crc = be32_to_cpu(ec_hdr->hdr_crc);
704*2d262c48SKyungmin Park 
705*2d262c48SKyungmin Park 	if (hdr_crc != crc) {
706*2d262c48SKyungmin Park 		if (verbose) {
707*2d262c48SKyungmin Park 			ubi_warn("bad EC header CRC at PEB %d, calculated %#08x,"
708*2d262c48SKyungmin Park 				 " read %#08x", pnum, crc, hdr_crc);
709*2d262c48SKyungmin Park 			ubi_dbg_dump_ec_hdr(ec_hdr);
710*2d262c48SKyungmin Park 		}
711*2d262c48SKyungmin Park 		return UBI_IO_BAD_EC_HDR;
712*2d262c48SKyungmin Park 	}
713*2d262c48SKyungmin Park 
714*2d262c48SKyungmin Park 	/* And of course validate what has just been read from the media */
715*2d262c48SKyungmin Park 	err = validate_ec_hdr(ubi, ec_hdr);
716*2d262c48SKyungmin Park 	if (err) {
717*2d262c48SKyungmin Park 		ubi_err("validation failed for PEB %d", pnum);
718*2d262c48SKyungmin Park 		return -EINVAL;
719*2d262c48SKyungmin Park 	}
720*2d262c48SKyungmin Park 
721*2d262c48SKyungmin Park 	return read_err ? UBI_IO_BITFLIPS : 0;
722*2d262c48SKyungmin Park }
723*2d262c48SKyungmin Park 
724*2d262c48SKyungmin Park /**
725*2d262c48SKyungmin Park  * ubi_io_write_ec_hdr - write an erase counter header.
726*2d262c48SKyungmin Park  * @ubi: UBI device description object
727*2d262c48SKyungmin Park  * @pnum: physical eraseblock to write to
728*2d262c48SKyungmin Park  * @ec_hdr: the erase counter header to write
729*2d262c48SKyungmin Park  *
730*2d262c48SKyungmin Park  * This function writes erase counter header described by @ec_hdr to physical
731*2d262c48SKyungmin Park  * eraseblock @pnum. It also fills most fields of @ec_hdr before writing, so
732*2d262c48SKyungmin Park  * the caller do not have to fill them. Callers must only fill the @ec_hdr->ec
733*2d262c48SKyungmin Park  * field.
734*2d262c48SKyungmin Park  *
735*2d262c48SKyungmin Park  * This function returns zero in case of success and a negative error code in
736*2d262c48SKyungmin Park  * case of failure. If %-EIO is returned, the physical eraseblock most probably
737*2d262c48SKyungmin Park  * went bad.
738*2d262c48SKyungmin Park  */
739*2d262c48SKyungmin Park int ubi_io_write_ec_hdr(struct ubi_device *ubi, int pnum,
740*2d262c48SKyungmin Park 			struct ubi_ec_hdr *ec_hdr)
741*2d262c48SKyungmin Park {
742*2d262c48SKyungmin Park 	int err;
743*2d262c48SKyungmin Park 	uint32_t crc;
744*2d262c48SKyungmin Park 
745*2d262c48SKyungmin Park 	dbg_io("write EC header to PEB %d", pnum);
746*2d262c48SKyungmin Park 	ubi_assert(pnum >= 0 &&  pnum < ubi->peb_count);
747*2d262c48SKyungmin Park 
748*2d262c48SKyungmin Park 	ec_hdr->magic = cpu_to_be32(UBI_EC_HDR_MAGIC);
749*2d262c48SKyungmin Park 	ec_hdr->version = UBI_VERSION;
750*2d262c48SKyungmin Park 	ec_hdr->vid_hdr_offset = cpu_to_be32(ubi->vid_hdr_offset);
751*2d262c48SKyungmin Park 	ec_hdr->data_offset = cpu_to_be32(ubi->leb_start);
752*2d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, ec_hdr, UBI_EC_HDR_SIZE_CRC);
753*2d262c48SKyungmin Park 	ec_hdr->hdr_crc = cpu_to_be32(crc);
754*2d262c48SKyungmin Park 
755*2d262c48SKyungmin Park 	err = paranoid_check_ec_hdr(ubi, pnum, ec_hdr);
756*2d262c48SKyungmin Park 	if (err)
757*2d262c48SKyungmin Park 		return -EINVAL;
758*2d262c48SKyungmin Park 
759*2d262c48SKyungmin Park 	err = ubi_io_write(ubi, ec_hdr, pnum, 0, ubi->ec_hdr_alsize);
760*2d262c48SKyungmin Park 	return err;
761*2d262c48SKyungmin Park }
762*2d262c48SKyungmin Park 
763*2d262c48SKyungmin Park /**
764*2d262c48SKyungmin Park  * validate_vid_hdr - validate a volume identifier header.
765*2d262c48SKyungmin Park  * @ubi: UBI device description object
766*2d262c48SKyungmin Park  * @vid_hdr: the volume identifier header to check
767*2d262c48SKyungmin Park  *
768*2d262c48SKyungmin Park  * This function checks that data stored in the volume identifier header
769*2d262c48SKyungmin Park  * @vid_hdr. Returns zero if the VID header is OK and %1 if not.
770*2d262c48SKyungmin Park  */
771*2d262c48SKyungmin Park static int validate_vid_hdr(const struct ubi_device *ubi,
772*2d262c48SKyungmin Park 			    const struct ubi_vid_hdr *vid_hdr)
773*2d262c48SKyungmin Park {
774*2d262c48SKyungmin Park 	int vol_type = vid_hdr->vol_type;
775*2d262c48SKyungmin Park 	int copy_flag = vid_hdr->copy_flag;
776*2d262c48SKyungmin Park 	int vol_id = be32_to_cpu(vid_hdr->vol_id);
777*2d262c48SKyungmin Park 	int lnum = be32_to_cpu(vid_hdr->lnum);
778*2d262c48SKyungmin Park 	int compat = vid_hdr->compat;
779*2d262c48SKyungmin Park 	int data_size = be32_to_cpu(vid_hdr->data_size);
780*2d262c48SKyungmin Park 	int used_ebs = be32_to_cpu(vid_hdr->used_ebs);
781*2d262c48SKyungmin Park 	int data_pad = be32_to_cpu(vid_hdr->data_pad);
782*2d262c48SKyungmin Park 	int data_crc = be32_to_cpu(vid_hdr->data_crc);
783*2d262c48SKyungmin Park 	int usable_leb_size = ubi->leb_size - data_pad;
784*2d262c48SKyungmin Park 
785*2d262c48SKyungmin Park 	if (copy_flag != 0 && copy_flag != 1) {
786*2d262c48SKyungmin Park 		dbg_err("bad copy_flag");
787*2d262c48SKyungmin Park 		goto bad;
788*2d262c48SKyungmin Park 	}
789*2d262c48SKyungmin Park 
790*2d262c48SKyungmin Park 	if (vol_id < 0 || lnum < 0 || data_size < 0 || used_ebs < 0 ||
791*2d262c48SKyungmin Park 	    data_pad < 0) {
792*2d262c48SKyungmin Park 		dbg_err("negative values");
793*2d262c48SKyungmin Park 		goto bad;
794*2d262c48SKyungmin Park 	}
795*2d262c48SKyungmin Park 
796*2d262c48SKyungmin Park 	if (vol_id >= UBI_MAX_VOLUMES && vol_id < UBI_INTERNAL_VOL_START) {
797*2d262c48SKyungmin Park 		dbg_err("bad vol_id");
798*2d262c48SKyungmin Park 		goto bad;
799*2d262c48SKyungmin Park 	}
800*2d262c48SKyungmin Park 
801*2d262c48SKyungmin Park 	if (vol_id < UBI_INTERNAL_VOL_START && compat != 0) {
802*2d262c48SKyungmin Park 		dbg_err("bad compat");
803*2d262c48SKyungmin Park 		goto bad;
804*2d262c48SKyungmin Park 	}
805*2d262c48SKyungmin Park 
806*2d262c48SKyungmin Park 	if (vol_id >= UBI_INTERNAL_VOL_START && compat != UBI_COMPAT_DELETE &&
807*2d262c48SKyungmin Park 	    compat != UBI_COMPAT_RO && compat != UBI_COMPAT_PRESERVE &&
808*2d262c48SKyungmin Park 	    compat != UBI_COMPAT_REJECT) {
809*2d262c48SKyungmin Park 		dbg_err("bad compat");
810*2d262c48SKyungmin Park 		goto bad;
811*2d262c48SKyungmin Park 	}
812*2d262c48SKyungmin Park 
813*2d262c48SKyungmin Park 	if (vol_type != UBI_VID_DYNAMIC && vol_type != UBI_VID_STATIC) {
814*2d262c48SKyungmin Park 		dbg_err("bad vol_type");
815*2d262c48SKyungmin Park 		goto bad;
816*2d262c48SKyungmin Park 	}
817*2d262c48SKyungmin Park 
818*2d262c48SKyungmin Park 	if (data_pad >= ubi->leb_size / 2) {
819*2d262c48SKyungmin Park 		dbg_err("bad data_pad");
820*2d262c48SKyungmin Park 		goto bad;
821*2d262c48SKyungmin Park 	}
822*2d262c48SKyungmin Park 
823*2d262c48SKyungmin Park 	if (vol_type == UBI_VID_STATIC) {
824*2d262c48SKyungmin Park 		/*
825*2d262c48SKyungmin Park 		 * Although from high-level point of view static volumes may
826*2d262c48SKyungmin Park 		 * contain zero bytes of data, but no VID headers can contain
827*2d262c48SKyungmin Park 		 * zero at these fields, because they empty volumes do not have
828*2d262c48SKyungmin Park 		 * mapped logical eraseblocks.
829*2d262c48SKyungmin Park 		 */
830*2d262c48SKyungmin Park 		if (used_ebs == 0) {
831*2d262c48SKyungmin Park 			dbg_err("zero used_ebs");
832*2d262c48SKyungmin Park 			goto bad;
833*2d262c48SKyungmin Park 		}
834*2d262c48SKyungmin Park 		if (data_size == 0) {
835*2d262c48SKyungmin Park 			dbg_err("zero data_size");
836*2d262c48SKyungmin Park 			goto bad;
837*2d262c48SKyungmin Park 		}
838*2d262c48SKyungmin Park 		if (lnum < used_ebs - 1) {
839*2d262c48SKyungmin Park 			if (data_size != usable_leb_size) {
840*2d262c48SKyungmin Park 				dbg_err("bad data_size");
841*2d262c48SKyungmin Park 				goto bad;
842*2d262c48SKyungmin Park 			}
843*2d262c48SKyungmin Park 		} else if (lnum == used_ebs - 1) {
844*2d262c48SKyungmin Park 			if (data_size == 0) {
845*2d262c48SKyungmin Park 				dbg_err("bad data_size at last LEB");
846*2d262c48SKyungmin Park 				goto bad;
847*2d262c48SKyungmin Park 			}
848*2d262c48SKyungmin Park 		} else {
849*2d262c48SKyungmin Park 			dbg_err("too high lnum");
850*2d262c48SKyungmin Park 			goto bad;
851*2d262c48SKyungmin Park 		}
852*2d262c48SKyungmin Park 	} else {
853*2d262c48SKyungmin Park 		if (copy_flag == 0) {
854*2d262c48SKyungmin Park 			if (data_crc != 0) {
855*2d262c48SKyungmin Park 				dbg_err("non-zero data CRC");
856*2d262c48SKyungmin Park 				goto bad;
857*2d262c48SKyungmin Park 			}
858*2d262c48SKyungmin Park 			if (data_size != 0) {
859*2d262c48SKyungmin Park 				dbg_err("non-zero data_size");
860*2d262c48SKyungmin Park 				goto bad;
861*2d262c48SKyungmin Park 			}
862*2d262c48SKyungmin Park 		} else {
863*2d262c48SKyungmin Park 			if (data_size == 0) {
864*2d262c48SKyungmin Park 				dbg_err("zero data_size of copy");
865*2d262c48SKyungmin Park 				goto bad;
866*2d262c48SKyungmin Park 			}
867*2d262c48SKyungmin Park 		}
868*2d262c48SKyungmin Park 		if (used_ebs != 0) {
869*2d262c48SKyungmin Park 			dbg_err("bad used_ebs");
870*2d262c48SKyungmin Park 			goto bad;
871*2d262c48SKyungmin Park 		}
872*2d262c48SKyungmin Park 	}
873*2d262c48SKyungmin Park 
874*2d262c48SKyungmin Park 	return 0;
875*2d262c48SKyungmin Park 
876*2d262c48SKyungmin Park bad:
877*2d262c48SKyungmin Park 	ubi_err("bad VID header");
878*2d262c48SKyungmin Park 	ubi_dbg_dump_vid_hdr(vid_hdr);
879*2d262c48SKyungmin Park 	ubi_dbg_dump_stack();
880*2d262c48SKyungmin Park 	return 1;
881*2d262c48SKyungmin Park }
882*2d262c48SKyungmin Park 
883*2d262c48SKyungmin Park /**
884*2d262c48SKyungmin Park  * ubi_io_read_vid_hdr - read and check a volume identifier header.
885*2d262c48SKyungmin Park  * @ubi: UBI device description object
886*2d262c48SKyungmin Park  * @pnum: physical eraseblock number to read from
887*2d262c48SKyungmin Park  * @vid_hdr: &struct ubi_vid_hdr object where to store the read volume
888*2d262c48SKyungmin Park  * identifier header
889*2d262c48SKyungmin Park  * @verbose: be verbose if the header is corrupted or wasn't found
890*2d262c48SKyungmin Park  *
891*2d262c48SKyungmin Park  * This function reads the volume identifier header from physical eraseblock
892*2d262c48SKyungmin Park  * @pnum and stores it in @vid_hdr. It also checks CRC checksum of the read
893*2d262c48SKyungmin Park  * volume identifier header. The following codes may be returned:
894*2d262c48SKyungmin Park  *
895*2d262c48SKyungmin Park  * o %0 if the CRC checksum is correct and the header was successfully read;
896*2d262c48SKyungmin Park  * o %UBI_IO_BITFLIPS if the CRC is correct, but bit-flips were detected
897*2d262c48SKyungmin Park  *   and corrected by the flash driver; this is harmless but may indicate that
898*2d262c48SKyungmin Park  *   this eraseblock may become bad soon;
899*2d262c48SKyungmin Park  * o %UBI_IO_BAD_VID_HRD if the volume identifier header is corrupted (a CRC
900*2d262c48SKyungmin Park  *   error detected);
901*2d262c48SKyungmin Park  * o %UBI_IO_PEB_FREE if the physical eraseblock is free (i.e., there is no VID
902*2d262c48SKyungmin Park  *   header there);
903*2d262c48SKyungmin Park  * o a negative error code in case of failure.
904*2d262c48SKyungmin Park  */
905*2d262c48SKyungmin Park int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum,
906*2d262c48SKyungmin Park 			struct ubi_vid_hdr *vid_hdr, int verbose)
907*2d262c48SKyungmin Park {
908*2d262c48SKyungmin Park 	int err, read_err = 0;
909*2d262c48SKyungmin Park 	uint32_t crc, magic, hdr_crc;
910*2d262c48SKyungmin Park 	void *p;
911*2d262c48SKyungmin Park 
912*2d262c48SKyungmin Park 	dbg_io("read VID header from PEB %d", pnum);
913*2d262c48SKyungmin Park 	ubi_assert(pnum >= 0 &&  pnum < ubi->peb_count);
914*2d262c48SKyungmin Park 	if (UBI_IO_DEBUG)
915*2d262c48SKyungmin Park 		verbose = 1;
916*2d262c48SKyungmin Park 
917*2d262c48SKyungmin Park 	p = (char *)vid_hdr - ubi->vid_hdr_shift;
918*2d262c48SKyungmin Park 	err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset,
919*2d262c48SKyungmin Park 			  ubi->vid_hdr_alsize);
920*2d262c48SKyungmin Park 	if (err) {
921*2d262c48SKyungmin Park 		if (err != UBI_IO_BITFLIPS && err != -EBADMSG)
922*2d262c48SKyungmin Park 			return err;
923*2d262c48SKyungmin Park 
924*2d262c48SKyungmin Park 		/*
925*2d262c48SKyungmin Park 		 * We read all the data, but either a correctable bit-flip
926*2d262c48SKyungmin Park 		 * occurred, or MTD reported about some data integrity error,
927*2d262c48SKyungmin Park 		 * like an ECC error in case of NAND. The former is harmless,
928*2d262c48SKyungmin Park 		 * the later may mean the read data is corrupted. But we have a
929*2d262c48SKyungmin Park 		 * CRC check-sum and we will identify this. If the VID header is
930*2d262c48SKyungmin Park 		 * still OK, we just report this as there was a bit-flip.
931*2d262c48SKyungmin Park 		 */
932*2d262c48SKyungmin Park 		read_err = err;
933*2d262c48SKyungmin Park 	}
934*2d262c48SKyungmin Park 
935*2d262c48SKyungmin Park 	magic = be32_to_cpu(vid_hdr->magic);
936*2d262c48SKyungmin Park 	if (magic != UBI_VID_HDR_MAGIC) {
937*2d262c48SKyungmin Park 		/*
938*2d262c48SKyungmin Park 		 * If we have read all 0xFF bytes, the VID header probably does
939*2d262c48SKyungmin Park 		 * not exist and the physical eraseblock is assumed to be free.
940*2d262c48SKyungmin Park 		 *
941*2d262c48SKyungmin Park 		 * But if there was a read error, we do not test the data for
942*2d262c48SKyungmin Park 		 * 0xFFs. Even if it does contain all 0xFFs, this error
943*2d262c48SKyungmin Park 		 * indicates that something is still wrong with this physical
944*2d262c48SKyungmin Park 		 * eraseblock and it cannot be regarded as free.
945*2d262c48SKyungmin Park 		 */
946*2d262c48SKyungmin Park 		if (read_err != -EBADMSG &&
947*2d262c48SKyungmin Park 		    check_pattern(vid_hdr, 0xFF, UBI_VID_HDR_SIZE)) {
948*2d262c48SKyungmin Park 			/* The physical eraseblock is supposedly free */
949*2d262c48SKyungmin Park 
950*2d262c48SKyungmin Park 			/*
951*2d262c48SKyungmin Park 			 * The below is just a paranoid check, it has to be
952*2d262c48SKyungmin Park 			 * compiled out if paranoid checks are disabled.
953*2d262c48SKyungmin Park 			 */
954*2d262c48SKyungmin Park 			err = paranoid_check_all_ff(ubi, pnum, ubi->leb_start,
955*2d262c48SKyungmin Park 						    ubi->leb_size);
956*2d262c48SKyungmin Park 			if (err)
957*2d262c48SKyungmin Park 				return err > 0 ? UBI_IO_BAD_VID_HDR : err;
958*2d262c48SKyungmin Park 
959*2d262c48SKyungmin Park 			if (verbose)
960*2d262c48SKyungmin Park 				ubi_warn("no VID header found at PEB %d, "
961*2d262c48SKyungmin Park 					 "only 0xFF bytes", pnum);
962*2d262c48SKyungmin Park 			return UBI_IO_PEB_FREE;
963*2d262c48SKyungmin Park 		}
964*2d262c48SKyungmin Park 
965*2d262c48SKyungmin Park 		/*
966*2d262c48SKyungmin Park 		 * This is not a valid VID header, and these are not 0xFF
967*2d262c48SKyungmin Park 		 * bytes. Report that the header is corrupted.
968*2d262c48SKyungmin Park 		 */
969*2d262c48SKyungmin Park 		if (verbose) {
970*2d262c48SKyungmin Park 			ubi_warn("bad magic number at PEB %d: %08x instead of "
971*2d262c48SKyungmin Park 				 "%08x", pnum, magic, UBI_VID_HDR_MAGIC);
972*2d262c48SKyungmin Park 			ubi_dbg_dump_vid_hdr(vid_hdr);
973*2d262c48SKyungmin Park 		}
974*2d262c48SKyungmin Park 		return UBI_IO_BAD_VID_HDR;
975*2d262c48SKyungmin Park 	}
976*2d262c48SKyungmin Park 
977*2d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, vid_hdr, UBI_VID_HDR_SIZE_CRC);
978*2d262c48SKyungmin Park 	hdr_crc = be32_to_cpu(vid_hdr->hdr_crc);
979*2d262c48SKyungmin Park 
980*2d262c48SKyungmin Park 	if (hdr_crc != crc) {
981*2d262c48SKyungmin Park 		if (verbose) {
982*2d262c48SKyungmin Park 			ubi_warn("bad CRC at PEB %d, calculated %#08x, "
983*2d262c48SKyungmin Park 				 "read %#08x", pnum, crc, hdr_crc);
984*2d262c48SKyungmin Park 			ubi_dbg_dump_vid_hdr(vid_hdr);
985*2d262c48SKyungmin Park 		}
986*2d262c48SKyungmin Park 		return UBI_IO_BAD_VID_HDR;
987*2d262c48SKyungmin Park 	}
988*2d262c48SKyungmin Park 
989*2d262c48SKyungmin Park 	/* Validate the VID header that we have just read */
990*2d262c48SKyungmin Park 	err = validate_vid_hdr(ubi, vid_hdr);
991*2d262c48SKyungmin Park 	if (err) {
992*2d262c48SKyungmin Park 		ubi_err("validation failed for PEB %d", pnum);
993*2d262c48SKyungmin Park 		return -EINVAL;
994*2d262c48SKyungmin Park 	}
995*2d262c48SKyungmin Park 
996*2d262c48SKyungmin Park 	return read_err ? UBI_IO_BITFLIPS : 0;
997*2d262c48SKyungmin Park }
998*2d262c48SKyungmin Park 
999*2d262c48SKyungmin Park /**
1000*2d262c48SKyungmin Park  * ubi_io_write_vid_hdr - write a volume identifier header.
1001*2d262c48SKyungmin Park  * @ubi: UBI device description object
1002*2d262c48SKyungmin Park  * @pnum: the physical eraseblock number to write to
1003*2d262c48SKyungmin Park  * @vid_hdr: the volume identifier header to write
1004*2d262c48SKyungmin Park  *
1005*2d262c48SKyungmin Park  * This function writes the volume identifier header described by @vid_hdr to
1006*2d262c48SKyungmin Park  * physical eraseblock @pnum. This function automatically fills the
1007*2d262c48SKyungmin Park  * @vid_hdr->magic and the @vid_hdr->version fields, as well as calculates
1008*2d262c48SKyungmin Park  * header CRC checksum and stores it at vid_hdr->hdr_crc.
1009*2d262c48SKyungmin Park  *
1010*2d262c48SKyungmin Park  * This function returns zero in case of success and a negative error code in
1011*2d262c48SKyungmin Park  * case of failure. If %-EIO is returned, the physical eraseblock probably went
1012*2d262c48SKyungmin Park  * bad.
1013*2d262c48SKyungmin Park  */
1014*2d262c48SKyungmin Park int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum,
1015*2d262c48SKyungmin Park 			 struct ubi_vid_hdr *vid_hdr)
1016*2d262c48SKyungmin Park {
1017*2d262c48SKyungmin Park 	int err;
1018*2d262c48SKyungmin Park 	uint32_t crc;
1019*2d262c48SKyungmin Park 	void *p;
1020*2d262c48SKyungmin Park 
1021*2d262c48SKyungmin Park 	dbg_io("write VID header to PEB %d", pnum);
1022*2d262c48SKyungmin Park 	ubi_assert(pnum >= 0 &&  pnum < ubi->peb_count);
1023*2d262c48SKyungmin Park 
1024*2d262c48SKyungmin Park 	err = paranoid_check_peb_ec_hdr(ubi, pnum);
1025*2d262c48SKyungmin Park 	if (err)
1026*2d262c48SKyungmin Park 		return err > 0 ? -EINVAL: err;
1027*2d262c48SKyungmin Park 
1028*2d262c48SKyungmin Park 	vid_hdr->magic = cpu_to_be32(UBI_VID_HDR_MAGIC);
1029*2d262c48SKyungmin Park 	vid_hdr->version = UBI_VERSION;
1030*2d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, vid_hdr, UBI_VID_HDR_SIZE_CRC);
1031*2d262c48SKyungmin Park 	vid_hdr->hdr_crc = cpu_to_be32(crc);
1032*2d262c48SKyungmin Park 
1033*2d262c48SKyungmin Park 	err = paranoid_check_vid_hdr(ubi, pnum, vid_hdr);
1034*2d262c48SKyungmin Park 	if (err)
1035*2d262c48SKyungmin Park 		return -EINVAL;
1036*2d262c48SKyungmin Park 
1037*2d262c48SKyungmin Park 	p = (char *)vid_hdr - ubi->vid_hdr_shift;
1038*2d262c48SKyungmin Park 	err = ubi_io_write(ubi, p, pnum, ubi->vid_hdr_aloffset,
1039*2d262c48SKyungmin Park 			   ubi->vid_hdr_alsize);
1040*2d262c48SKyungmin Park 	return err;
1041*2d262c48SKyungmin Park }
1042*2d262c48SKyungmin Park 
1043*2d262c48SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG_PARANOID
1044*2d262c48SKyungmin Park 
1045*2d262c48SKyungmin Park /**
1046*2d262c48SKyungmin Park  * paranoid_check_not_bad - ensure that a physical eraseblock is not bad.
1047*2d262c48SKyungmin Park  * @ubi: UBI device description object
1048*2d262c48SKyungmin Park  * @pnum: physical eraseblock number to check
1049*2d262c48SKyungmin Park  *
1050*2d262c48SKyungmin Park  * This function returns zero if the physical eraseblock is good, a positive
1051*2d262c48SKyungmin Park  * number if it is bad and a negative error code if an error occurred.
1052*2d262c48SKyungmin Park  */
1053*2d262c48SKyungmin Park static int paranoid_check_not_bad(const struct ubi_device *ubi, int pnum)
1054*2d262c48SKyungmin Park {
1055*2d262c48SKyungmin Park 	int err;
1056*2d262c48SKyungmin Park 
1057*2d262c48SKyungmin Park 	err = ubi_io_is_bad(ubi, pnum);
1058*2d262c48SKyungmin Park 	if (!err)
1059*2d262c48SKyungmin Park 		return err;
1060*2d262c48SKyungmin Park 
1061*2d262c48SKyungmin Park 	ubi_err("paranoid check failed for PEB %d", pnum);
1062*2d262c48SKyungmin Park 	ubi_dbg_dump_stack();
1063*2d262c48SKyungmin Park 	return err;
1064*2d262c48SKyungmin Park }
1065*2d262c48SKyungmin Park 
1066*2d262c48SKyungmin Park /**
1067*2d262c48SKyungmin Park  * paranoid_check_ec_hdr - check if an erase counter header is all right.
1068*2d262c48SKyungmin Park  * @ubi: UBI device description object
1069*2d262c48SKyungmin Park  * @pnum: physical eraseblock number the erase counter header belongs to
1070*2d262c48SKyungmin Park  * @ec_hdr: the erase counter header to check
1071*2d262c48SKyungmin Park  *
1072*2d262c48SKyungmin Park  * This function returns zero if the erase counter header contains valid
1073*2d262c48SKyungmin Park  * values, and %1 if not.
1074*2d262c48SKyungmin Park  */
1075*2d262c48SKyungmin Park static int paranoid_check_ec_hdr(const struct ubi_device *ubi, int pnum,
1076*2d262c48SKyungmin Park 				 const struct ubi_ec_hdr *ec_hdr)
1077*2d262c48SKyungmin Park {
1078*2d262c48SKyungmin Park 	int err;
1079*2d262c48SKyungmin Park 	uint32_t magic;
1080*2d262c48SKyungmin Park 
1081*2d262c48SKyungmin Park 	magic = be32_to_cpu(ec_hdr->magic);
1082*2d262c48SKyungmin Park 	if (magic != UBI_EC_HDR_MAGIC) {
1083*2d262c48SKyungmin Park 		ubi_err("bad magic %#08x, must be %#08x",
1084*2d262c48SKyungmin Park 			magic, UBI_EC_HDR_MAGIC);
1085*2d262c48SKyungmin Park 		goto fail;
1086*2d262c48SKyungmin Park 	}
1087*2d262c48SKyungmin Park 
1088*2d262c48SKyungmin Park 	err = validate_ec_hdr(ubi, ec_hdr);
1089*2d262c48SKyungmin Park 	if (err) {
1090*2d262c48SKyungmin Park 		ubi_err("paranoid check failed for PEB %d", pnum);
1091*2d262c48SKyungmin Park 		goto fail;
1092*2d262c48SKyungmin Park 	}
1093*2d262c48SKyungmin Park 
1094*2d262c48SKyungmin Park 	return 0;
1095*2d262c48SKyungmin Park 
1096*2d262c48SKyungmin Park fail:
1097*2d262c48SKyungmin Park 	ubi_dbg_dump_ec_hdr(ec_hdr);
1098*2d262c48SKyungmin Park 	ubi_dbg_dump_stack();
1099*2d262c48SKyungmin Park 	return 1;
1100*2d262c48SKyungmin Park }
1101*2d262c48SKyungmin Park 
1102*2d262c48SKyungmin Park /**
1103*2d262c48SKyungmin Park  * paranoid_check_peb_ec_hdr - check that the erase counter header of a
1104*2d262c48SKyungmin Park  * physical eraseblock is in-place and is all right.
1105*2d262c48SKyungmin Park  * @ubi: UBI device description object
1106*2d262c48SKyungmin Park  * @pnum: the physical eraseblock number to check
1107*2d262c48SKyungmin Park  *
1108*2d262c48SKyungmin Park  * This function returns zero if the erase counter header is all right, %1 if
1109*2d262c48SKyungmin Park  * not, and a negative error code if an error occurred.
1110*2d262c48SKyungmin Park  */
1111*2d262c48SKyungmin Park static int paranoid_check_peb_ec_hdr(const struct ubi_device *ubi, int pnum)
1112*2d262c48SKyungmin Park {
1113*2d262c48SKyungmin Park 	int err;
1114*2d262c48SKyungmin Park 	uint32_t crc, hdr_crc;
1115*2d262c48SKyungmin Park 	struct ubi_ec_hdr *ec_hdr;
1116*2d262c48SKyungmin Park 
1117*2d262c48SKyungmin Park 	ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_NOFS);
1118*2d262c48SKyungmin Park 	if (!ec_hdr)
1119*2d262c48SKyungmin Park 		return -ENOMEM;
1120*2d262c48SKyungmin Park 
1121*2d262c48SKyungmin Park 	err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE);
1122*2d262c48SKyungmin Park 	if (err && err != UBI_IO_BITFLIPS && err != -EBADMSG)
1123*2d262c48SKyungmin Park 		goto exit;
1124*2d262c48SKyungmin Park 
1125*2d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, ec_hdr, UBI_EC_HDR_SIZE_CRC);
1126*2d262c48SKyungmin Park 	hdr_crc = be32_to_cpu(ec_hdr->hdr_crc);
1127*2d262c48SKyungmin Park 	if (hdr_crc != crc) {
1128*2d262c48SKyungmin Park 		ubi_err("bad CRC, calculated %#08x, read %#08x", crc, hdr_crc);
1129*2d262c48SKyungmin Park 		ubi_err("paranoid check failed for PEB %d", pnum);
1130*2d262c48SKyungmin Park 		ubi_dbg_dump_ec_hdr(ec_hdr);
1131*2d262c48SKyungmin Park 		ubi_dbg_dump_stack();
1132*2d262c48SKyungmin Park 		err = 1;
1133*2d262c48SKyungmin Park 		goto exit;
1134*2d262c48SKyungmin Park 	}
1135*2d262c48SKyungmin Park 
1136*2d262c48SKyungmin Park 	err = paranoid_check_ec_hdr(ubi, pnum, ec_hdr);
1137*2d262c48SKyungmin Park 
1138*2d262c48SKyungmin Park exit:
1139*2d262c48SKyungmin Park 	kfree(ec_hdr);
1140*2d262c48SKyungmin Park 	return err;
1141*2d262c48SKyungmin Park }
1142*2d262c48SKyungmin Park 
1143*2d262c48SKyungmin Park /**
1144*2d262c48SKyungmin Park  * paranoid_check_vid_hdr - check that a volume identifier header is all right.
1145*2d262c48SKyungmin Park  * @ubi: UBI device description object
1146*2d262c48SKyungmin Park  * @pnum: physical eraseblock number the volume identifier header belongs to
1147*2d262c48SKyungmin Park  * @vid_hdr: the volume identifier header to check
1148*2d262c48SKyungmin Park  *
1149*2d262c48SKyungmin Park  * This function returns zero if the volume identifier header is all right, and
1150*2d262c48SKyungmin Park  * %1 if not.
1151*2d262c48SKyungmin Park  */
1152*2d262c48SKyungmin Park static int paranoid_check_vid_hdr(const struct ubi_device *ubi, int pnum,
1153*2d262c48SKyungmin Park 				  const struct ubi_vid_hdr *vid_hdr)
1154*2d262c48SKyungmin Park {
1155*2d262c48SKyungmin Park 	int err;
1156*2d262c48SKyungmin Park 	uint32_t magic;
1157*2d262c48SKyungmin Park 
1158*2d262c48SKyungmin Park 	magic = be32_to_cpu(vid_hdr->magic);
1159*2d262c48SKyungmin Park 	if (magic != UBI_VID_HDR_MAGIC) {
1160*2d262c48SKyungmin Park 		ubi_err("bad VID header magic %#08x at PEB %d, must be %#08x",
1161*2d262c48SKyungmin Park 			magic, pnum, UBI_VID_HDR_MAGIC);
1162*2d262c48SKyungmin Park 		goto fail;
1163*2d262c48SKyungmin Park 	}
1164*2d262c48SKyungmin Park 
1165*2d262c48SKyungmin Park 	err = validate_vid_hdr(ubi, vid_hdr);
1166*2d262c48SKyungmin Park 	if (err) {
1167*2d262c48SKyungmin Park 		ubi_err("paranoid check failed for PEB %d", pnum);
1168*2d262c48SKyungmin Park 		goto fail;
1169*2d262c48SKyungmin Park 	}
1170*2d262c48SKyungmin Park 
1171*2d262c48SKyungmin Park 	return err;
1172*2d262c48SKyungmin Park 
1173*2d262c48SKyungmin Park fail:
1174*2d262c48SKyungmin Park 	ubi_err("paranoid check failed for PEB %d", pnum);
1175*2d262c48SKyungmin Park 	ubi_dbg_dump_vid_hdr(vid_hdr);
1176*2d262c48SKyungmin Park 	ubi_dbg_dump_stack();
1177*2d262c48SKyungmin Park 	return 1;
1178*2d262c48SKyungmin Park 
1179*2d262c48SKyungmin Park }
1180*2d262c48SKyungmin Park 
1181*2d262c48SKyungmin Park /**
1182*2d262c48SKyungmin Park  * paranoid_check_peb_vid_hdr - check that the volume identifier header of a
1183*2d262c48SKyungmin Park  * physical eraseblock is in-place and is all right.
1184*2d262c48SKyungmin Park  * @ubi: UBI device description object
1185*2d262c48SKyungmin Park  * @pnum: the physical eraseblock number to check
1186*2d262c48SKyungmin Park  *
1187*2d262c48SKyungmin Park  * This function returns zero if the volume identifier header is all right,
1188*2d262c48SKyungmin Park  * %1 if not, and a negative error code if an error occurred.
1189*2d262c48SKyungmin Park  */
1190*2d262c48SKyungmin Park static int paranoid_check_peb_vid_hdr(const struct ubi_device *ubi, int pnum)
1191*2d262c48SKyungmin Park {
1192*2d262c48SKyungmin Park 	int err;
1193*2d262c48SKyungmin Park 	uint32_t crc, hdr_crc;
1194*2d262c48SKyungmin Park 	struct ubi_vid_hdr *vid_hdr;
1195*2d262c48SKyungmin Park 	void *p;
1196*2d262c48SKyungmin Park 
1197*2d262c48SKyungmin Park 	vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS);
1198*2d262c48SKyungmin Park 	if (!vid_hdr)
1199*2d262c48SKyungmin Park 		return -ENOMEM;
1200*2d262c48SKyungmin Park 
1201*2d262c48SKyungmin Park 	p = (char *)vid_hdr - ubi->vid_hdr_shift;
1202*2d262c48SKyungmin Park 	err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset,
1203*2d262c48SKyungmin Park 			  ubi->vid_hdr_alsize);
1204*2d262c48SKyungmin Park 	if (err && err != UBI_IO_BITFLIPS && err != -EBADMSG)
1205*2d262c48SKyungmin Park 		goto exit;
1206*2d262c48SKyungmin Park 
1207*2d262c48SKyungmin Park 	crc = crc32(UBI_CRC32_INIT, vid_hdr, UBI_EC_HDR_SIZE_CRC);
1208*2d262c48SKyungmin Park 	hdr_crc = be32_to_cpu(vid_hdr->hdr_crc);
1209*2d262c48SKyungmin Park 	if (hdr_crc != crc) {
1210*2d262c48SKyungmin Park 		ubi_err("bad VID header CRC at PEB %d, calculated %#08x, "
1211*2d262c48SKyungmin Park 			"read %#08x", pnum, crc, hdr_crc);
1212*2d262c48SKyungmin Park 		ubi_err("paranoid check failed for PEB %d", pnum);
1213*2d262c48SKyungmin Park 		ubi_dbg_dump_vid_hdr(vid_hdr);
1214*2d262c48SKyungmin Park 		ubi_dbg_dump_stack();
1215*2d262c48SKyungmin Park 		err = 1;
1216*2d262c48SKyungmin Park 		goto exit;
1217*2d262c48SKyungmin Park 	}
1218*2d262c48SKyungmin Park 
1219*2d262c48SKyungmin Park 	err = paranoid_check_vid_hdr(ubi, pnum, vid_hdr);
1220*2d262c48SKyungmin Park 
1221*2d262c48SKyungmin Park exit:
1222*2d262c48SKyungmin Park 	ubi_free_vid_hdr(ubi, vid_hdr);
1223*2d262c48SKyungmin Park 	return err;
1224*2d262c48SKyungmin Park }
1225*2d262c48SKyungmin Park 
1226*2d262c48SKyungmin Park /**
1227*2d262c48SKyungmin Park  * paranoid_check_all_ff - check that a region of flash is empty.
1228*2d262c48SKyungmin Park  * @ubi: UBI device description object
1229*2d262c48SKyungmin Park  * @pnum: the physical eraseblock number to check
1230*2d262c48SKyungmin Park  * @offset: the starting offset within the physical eraseblock to check
1231*2d262c48SKyungmin Park  * @len: the length of the region to check
1232*2d262c48SKyungmin Park  *
1233*2d262c48SKyungmin Park  * This function returns zero if only 0xFF bytes are present at offset
1234*2d262c48SKyungmin Park  * @offset of the physical eraseblock @pnum, %1 if not, and a negative error
1235*2d262c48SKyungmin Park  * code if an error occurred.
1236*2d262c48SKyungmin Park  */
1237*2d262c48SKyungmin Park static int paranoid_check_all_ff(struct ubi_device *ubi, int pnum, int offset,
1238*2d262c48SKyungmin Park 				 int len)
1239*2d262c48SKyungmin Park {
1240*2d262c48SKyungmin Park 	size_t read;
1241*2d262c48SKyungmin Park 	int err;
1242*2d262c48SKyungmin Park 	loff_t addr = (loff_t)pnum * ubi->peb_size + offset;
1243*2d262c48SKyungmin Park 
1244*2d262c48SKyungmin Park 	mutex_lock(&ubi->dbg_buf_mutex);
1245*2d262c48SKyungmin Park 	err = ubi->mtd->read(ubi->mtd, addr, len, &read, ubi->dbg_peb_buf);
1246*2d262c48SKyungmin Park 	if (err && err != -EUCLEAN) {
1247*2d262c48SKyungmin Park 		ubi_err("error %d while reading %d bytes from PEB %d:%d, "
1248*2d262c48SKyungmin Park 			"read %zd bytes", err, len, pnum, offset, read);
1249*2d262c48SKyungmin Park 		goto error;
1250*2d262c48SKyungmin Park 	}
1251*2d262c48SKyungmin Park 
1252*2d262c48SKyungmin Park 	err = check_pattern(ubi->dbg_peb_buf, 0xFF, len);
1253*2d262c48SKyungmin Park 	if (err == 0) {
1254*2d262c48SKyungmin Park 		ubi_err("flash region at PEB %d:%d, length %d does not "
1255*2d262c48SKyungmin Park 			"contain all 0xFF bytes", pnum, offset, len);
1256*2d262c48SKyungmin Park 		goto fail;
1257*2d262c48SKyungmin Park 	}
1258*2d262c48SKyungmin Park 	mutex_unlock(&ubi->dbg_buf_mutex);
1259*2d262c48SKyungmin Park 
1260*2d262c48SKyungmin Park 	return 0;
1261*2d262c48SKyungmin Park 
1262*2d262c48SKyungmin Park fail:
1263*2d262c48SKyungmin Park 	ubi_err("paranoid check failed for PEB %d", pnum);
1264*2d262c48SKyungmin Park 	dbg_msg("hex dump of the %d-%d region", offset, offset + len);
1265*2d262c48SKyungmin Park 	print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1,
1266*2d262c48SKyungmin Park 		       ubi->dbg_peb_buf, len, 1);
1267*2d262c48SKyungmin Park 	err = 1;
1268*2d262c48SKyungmin Park error:
1269*2d262c48SKyungmin Park 	ubi_dbg_dump_stack();
1270*2d262c48SKyungmin Park 	mutex_unlock(&ubi->dbg_buf_mutex);
1271*2d262c48SKyungmin Park 	return err;
1272*2d262c48SKyungmin Park }
1273*2d262c48SKyungmin Park 
1274*2d262c48SKyungmin Park #endif /* CONFIG_MTD_UBI_DEBUG_PARANOID */
1275