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