Lines Matching refs:ubi

94 static int self_check_not_bad(const struct ubi_device *ubi, int pnum);
95 static int self_check_peb_ec_hdr(const struct ubi_device *ubi, int pnum);
96 static int self_check_ec_hdr(const struct ubi_device *ubi, int pnum,
98 static int self_check_peb_vid_hdr(const struct ubi_device *ubi, int pnum);
99 static int self_check_vid_hdr(const struct ubi_device *ubi, int pnum,
101 static int self_check_write(struct ubi_device *ubi, const void *buf, int pnum,
126 int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset, in ubi_io_read() argument
135 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); in ubi_io_read()
136 ubi_assert(offset >= 0 && offset + len <= ubi->peb_size); in ubi_io_read()
139 err = self_check_not_bad(ubi, pnum); in ubi_io_read()
165 addr = (loff_t)pnum * ubi->peb_size + offset; in ubi_io_read()
167 err = mtd_read(ubi->mtd, addr, len, &read, buf); in ubi_io_read()
180 ubi_msg(ubi, "fixable bit-flip detected at PEB %d", in ubi_io_read()
187 ubi_warn(ubi, "error %d%s while reading %d bytes from PEB %d:%d, read only %zd bytes, retry", in ubi_io_read()
193 ubi_err(ubi, "error %d%s while reading %d bytes from PEB %d:%d, read %zd bytes", in ubi_io_read()
209 if (ubi_dbg_is_bitflip(ubi)) { in ubi_io_read()
235 int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset, in ubi_io_write() argument
244 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); in ubi_io_write()
245 ubi_assert(offset >= 0 && offset + len <= ubi->peb_size); in ubi_io_write()
246 ubi_assert(offset % ubi->hdrs_min_io_size == 0); in ubi_io_write()
247 ubi_assert(len > 0 && len % ubi->hdrs_min_io_size == 0); in ubi_io_write()
249 if (ubi->ro_mode) { in ubi_io_write()
250 ubi_err(ubi, "read-only mode"); in ubi_io_write()
254 err = self_check_not_bad(ubi, pnum); in ubi_io_write()
259 err = ubi_self_check_all_ff(ubi, pnum, offset, len); in ubi_io_write()
263 if (offset >= ubi->leb_start) { in ubi_io_write()
268 err = self_check_peb_ec_hdr(ubi, pnum); in ubi_io_write()
271 err = self_check_peb_vid_hdr(ubi, pnum); in ubi_io_write()
276 if (ubi_dbg_is_write_failure(ubi)) { in ubi_io_write()
277 ubi_err(ubi, "cannot write %d bytes to PEB %d:%d (emulated)", in ubi_io_write()
283 addr = (loff_t)pnum * ubi->peb_size + offset; in ubi_io_write()
284 err = mtd_write(ubi->mtd, addr, len, &written, buf); in ubi_io_write()
286 ubi_err(ubi, "error %d while writing %d bytes to PEB %d:%d, written %zd bytes", in ubi_io_write()
289 ubi_dump_flash(ubi, pnum, offset, len); in ubi_io_write()
294 err = self_check_write(ubi, buf, pnum, offset, len); in ubi_io_write()
303 len = ubi->peb_size - offset; in ubi_io_write()
305 err = ubi_self_check_all_ff(ubi, pnum, offset, len); in ubi_io_write()
332 static int do_sync_erase(struct ubi_device *ubi, int pnum) in do_sync_erase() argument
339 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); in do_sync_erase()
341 if (ubi->ro_mode) { in do_sync_erase()
342 ubi_err(ubi, "read-only mode"); in do_sync_erase()
350 ei.mtd = ubi->mtd; in do_sync_erase()
351 ei.addr = (loff_t)pnum * ubi->peb_size; in do_sync_erase()
352 ei.len = ubi->peb_size; in do_sync_erase()
356 err = mtd_erase(ubi->mtd, &ei); in do_sync_erase()
359 ubi_warn(ubi, "error %d while erasing PEB %d, retry", in do_sync_erase()
364 ubi_err(ubi, "cannot erase PEB %d, error %d", pnum, err); in do_sync_erase()
372 ubi_err(ubi, "interrupted PEB %d erasure", pnum); in do_sync_erase()
378 ubi_warn(ubi, "error while erasing PEB %d, retry", in do_sync_erase()
383 ubi_err(ubi, "cannot erase PEB %d", pnum); in do_sync_erase()
388 err = ubi_self_check_all_ff(ubi, pnum, 0, ubi->peb_size); in do_sync_erase()
392 if (ubi_dbg_is_erase_failure(ubi)) { in do_sync_erase()
393 ubi_err(ubi, "cannot erase PEB %d (emulated)", pnum); in do_sync_erase()
412 static int torture_peb(struct ubi_device *ubi, int pnum) in torture_peb() argument
416 ubi_msg(ubi, "run torture test for PEB %d", pnum); in torture_peb()
420 mutex_lock(&ubi->buf_mutex); in torture_peb()
422 err = do_sync_erase(ubi, pnum); in torture_peb()
427 err = ubi_io_read(ubi, ubi->peb_buf, pnum, 0, ubi->peb_size); in torture_peb()
431 err = ubi_check_pattern(ubi->peb_buf, 0xFF, ubi->peb_size); in torture_peb()
433 ubi_err(ubi, "erased PEB %d, but a non-0xFF byte found", in torture_peb()
440 memset(ubi->peb_buf, patterns[i], ubi->peb_size); in torture_peb()
441 err = ubi_io_write(ubi, ubi->peb_buf, pnum, 0, ubi->peb_size); in torture_peb()
445 memset(ubi->peb_buf, ~patterns[i], ubi->peb_size); in torture_peb()
446 err = ubi_io_read(ubi, ubi->peb_buf, pnum, 0, ubi->peb_size); in torture_peb()
450 err = ubi_check_pattern(ubi->peb_buf, patterns[i], in torture_peb()
451 ubi->peb_size); in torture_peb()
453 ubi_err(ubi, "pattern %x checking failed for PEB %d", in torture_peb()
461 ubi_msg(ubi, "PEB %d passed torture test, do not mark it as bad", pnum); in torture_peb()
464 mutex_unlock(&ubi->buf_mutex); in torture_peb()
471 ubi_err(ubi, "read problems on freshly erased PEB %d, must be bad", in torture_peb()
498 static int nor_erase_prepare(struct ubi_device *ubi, int pnum) in nor_erase_prepare() argument
522 addr = (loff_t)pnum * ubi->peb_size; in nor_erase_prepare()
523 err = ubi_io_read_ec_hdr(ubi, pnum, &ec_hdr, 0); in nor_erase_prepare()
526 err = mtd_write(ubi->mtd, addr, 4, &written, (void *)&data); in nor_erase_prepare()
531 err = ubi_io_read_vid_hdr(ubi, pnum, &vid_hdr, 0); in nor_erase_prepare()
534 addr += ubi->vid_hdr_aloffset; in nor_erase_prepare()
535 err = mtd_write(ubi->mtd, addr, 4, &written, (void *)&data); in nor_erase_prepare()
547 ubi_err(ubi, "cannot invalidate PEB %d, write returned %d", pnum, err); in nor_erase_prepare()
548 ubi_dump_flash(ubi, pnum, 0, ubi->peb_size); in nor_erase_prepare()
568 int ubi_io_sync_erase(struct ubi_device *ubi, int pnum, int torture) in ubi_io_sync_erase() argument
572 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); in ubi_io_sync_erase()
574 err = self_check_not_bad(ubi, pnum); in ubi_io_sync_erase()
578 if (ubi->ro_mode) { in ubi_io_sync_erase()
579 ubi_err(ubi, "read-only mode"); in ubi_io_sync_erase()
583 if (ubi->nor_flash) { in ubi_io_sync_erase()
584 err = nor_erase_prepare(ubi, pnum); in ubi_io_sync_erase()
590 ret = torture_peb(ubi, pnum); in ubi_io_sync_erase()
595 err = do_sync_erase(ubi, pnum); in ubi_io_sync_erase()
610 int ubi_io_is_bad(const struct ubi_device *ubi, int pnum) in ubi_io_is_bad() argument
612 struct mtd_info *mtd = ubi->mtd; in ubi_io_is_bad()
614 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); in ubi_io_is_bad()
616 if (ubi->bad_allowed) { in ubi_io_is_bad()
619 ret = mtd_block_isbad(mtd, (loff_t)pnum * ubi->peb_size); in ubi_io_is_bad()
621 ubi_err(ubi, "error %d while checking if PEB %d is bad", in ubi_io_is_bad()
639 int ubi_io_mark_bad(const struct ubi_device *ubi, int pnum) in ubi_io_mark_bad() argument
642 struct mtd_info *mtd = ubi->mtd; in ubi_io_mark_bad()
644 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); in ubi_io_mark_bad()
646 if (ubi->ro_mode) { in ubi_io_mark_bad()
647 ubi_err(ubi, "read-only mode"); in ubi_io_mark_bad()
651 if (!ubi->bad_allowed) in ubi_io_mark_bad()
654 err = mtd_block_markbad(mtd, (loff_t)pnum * ubi->peb_size); in ubi_io_mark_bad()
656 ubi_err(ubi, "cannot mark PEB %d bad, error %d", pnum, err); in ubi_io_mark_bad()
668 static int validate_ec_hdr(const struct ubi_device *ubi, in validate_ec_hdr() argument
679 …ubi_err(ubi, "node with incompatible UBI version found: this UBI version is %d, image version is %… in validate_ec_hdr()
684 if (vid_hdr_offset != ubi->vid_hdr_offset) { in validate_ec_hdr()
685 ubi_err(ubi, "bad VID header offset %d, expected %d", in validate_ec_hdr()
686 vid_hdr_offset, ubi->vid_hdr_offset); in validate_ec_hdr()
690 if (leb_start != ubi->leb_start) { in validate_ec_hdr()
691 ubi_err(ubi, "bad data offset %d, expected %d", in validate_ec_hdr()
692 leb_start, ubi->leb_start); in validate_ec_hdr()
697 ubi_err(ubi, "bad erase counter %lld", ec); in validate_ec_hdr()
704 ubi_err(ubi, "bad EC header"); in validate_ec_hdr()
732 int ubi_io_read_ec_hdr(struct ubi_device *ubi, int pnum, in ubi_io_read_ec_hdr() argument
739 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); in ubi_io_read_ec_hdr()
741 read_err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE); in ubi_io_read_ec_hdr()
770 ubi_warn(ubi, "no EC header found at PEB %d, only 0xFF bytes", in ubi_io_read_ec_hdr()
785 ubi_warn(ubi, "bad magic number at PEB %d: %08x instead of %08x", in ubi_io_read_ec_hdr()
799 ubi_warn(ubi, "bad EC header CRC at PEB %d, calculated %#08x, read %#08x", in ubi_io_read_ec_hdr()
813 err = validate_ec_hdr(ubi, ec_hdr); in ubi_io_read_ec_hdr()
815 ubi_err(ubi, "validation failed for PEB %d", pnum); in ubi_io_read_ec_hdr()
841 int ubi_io_write_ec_hdr(struct ubi_device *ubi, int pnum, in ubi_io_write_ec_hdr() argument
848 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); in ubi_io_write_ec_hdr()
852 ec_hdr->vid_hdr_offset = cpu_to_be32(ubi->vid_hdr_offset); in ubi_io_write_ec_hdr()
853 ec_hdr->data_offset = cpu_to_be32(ubi->leb_start); in ubi_io_write_ec_hdr()
854 ec_hdr->image_seq = cpu_to_be32(ubi->image_seq); in ubi_io_write_ec_hdr()
858 err = self_check_ec_hdr(ubi, pnum, ec_hdr); in ubi_io_write_ec_hdr()
862 if (ubi_dbg_power_cut(ubi, POWER_CUT_EC_WRITE)) in ubi_io_write_ec_hdr()
865 err = ubi_io_write(ubi, ec_hdr, pnum, 0, ubi->ec_hdr_alsize); in ubi_io_write_ec_hdr()
877 static int validate_vid_hdr(const struct ubi_device *ubi, in validate_vid_hdr() argument
889 int usable_leb_size = ubi->leb_size - data_pad; in validate_vid_hdr()
892 ubi_err(ubi, "bad copy_flag"); in validate_vid_hdr()
898 ubi_err(ubi, "negative values"); in validate_vid_hdr()
903 ubi_err(ubi, "bad vol_id"); in validate_vid_hdr()
908 ubi_err(ubi, "bad compat"); in validate_vid_hdr()
915 ubi_err(ubi, "bad compat"); in validate_vid_hdr()
920 ubi_err(ubi, "bad vol_type"); in validate_vid_hdr()
924 if (data_pad >= ubi->leb_size / 2) { in validate_vid_hdr()
925 ubi_err(ubi, "bad data_pad"); in validate_vid_hdr()
929 if (data_size > ubi->leb_size) { in validate_vid_hdr()
930 ubi_err(ubi, "bad data_size"); in validate_vid_hdr()
942 ubi_err(ubi, "zero used_ebs"); in validate_vid_hdr()
946 ubi_err(ubi, "zero data_size"); in validate_vid_hdr()
951 ubi_err(ubi, "bad data_size"); in validate_vid_hdr()
956 ubi_err(ubi, "bad data_size at last LEB"); in validate_vid_hdr()
960 ubi_err(ubi, "too high lnum"); in validate_vid_hdr()
966 ubi_err(ubi, "non-zero data CRC"); in validate_vid_hdr()
970 ubi_err(ubi, "non-zero data_size"); in validate_vid_hdr()
975 ubi_err(ubi, "zero data_size of copy"); in validate_vid_hdr()
980 ubi_err(ubi, "bad used_ebs"); in validate_vid_hdr()
988 ubi_err(ubi, "bad VID header"); in validate_vid_hdr()
1010 int ubi_io_read_vid_hdr(struct ubi_device *ubi, int pnum, in ubi_io_read_vid_hdr() argument
1018 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); in ubi_io_read_vid_hdr()
1020 p = (char *)vid_hdr - ubi->vid_hdr_shift; in ubi_io_read_vid_hdr()
1021 read_err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset, in ubi_io_read_vid_hdr()
1022 ubi->vid_hdr_alsize); in ubi_io_read_vid_hdr()
1033 ubi_warn(ubi, "no VID header found at PEB %d, only 0xFF bytes", in ubi_io_read_vid_hdr()
1044 ubi_warn(ubi, "bad magic number at PEB %d: %08x instead of %08x", in ubi_io_read_vid_hdr()
1058 ubi_warn(ubi, "bad CRC at PEB %d, calculated %#08x, read %#08x", in ubi_io_read_vid_hdr()
1070 err = validate_vid_hdr(ubi, vid_hdr); in ubi_io_read_vid_hdr()
1072 ubi_err(ubi, "validation failed for PEB %d", pnum); in ubi_io_read_vid_hdr()
1094 int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum, in ubi_io_write_vid_hdr() argument
1102 ubi_assert(pnum >= 0 && pnum < ubi->peb_count); in ubi_io_write_vid_hdr()
1104 err = self_check_peb_ec_hdr(ubi, pnum); in ubi_io_write_vid_hdr()
1113 err = self_check_vid_hdr(ubi, pnum, vid_hdr); in ubi_io_write_vid_hdr()
1117 if (ubi_dbg_power_cut(ubi, POWER_CUT_VID_WRITE)) in ubi_io_write_vid_hdr()
1120 p = (char *)vid_hdr - ubi->vid_hdr_shift; in ubi_io_write_vid_hdr()
1121 err = ubi_io_write(ubi, p, pnum, ubi->vid_hdr_aloffset, in ubi_io_write_vid_hdr()
1122 ubi->vid_hdr_alsize); in ubi_io_write_vid_hdr()
1134 static int self_check_not_bad(const struct ubi_device *ubi, int pnum) in self_check_not_bad() argument
1138 if (!ubi_dbg_chk_io(ubi)) in self_check_not_bad()
1141 err = ubi_io_is_bad(ubi, pnum); in self_check_not_bad()
1145 ubi_err(ubi, "self-check failed for PEB %d", pnum); in self_check_not_bad()
1159 static int self_check_ec_hdr(const struct ubi_device *ubi, int pnum, in self_check_ec_hdr() argument
1165 if (!ubi_dbg_chk_io(ubi)) in self_check_ec_hdr()
1170 ubi_err(ubi, "bad magic %#08x, must be %#08x", in self_check_ec_hdr()
1175 err = validate_ec_hdr(ubi, ec_hdr); in self_check_ec_hdr()
1177 ubi_err(ubi, "self-check failed for PEB %d", pnum); in self_check_ec_hdr()
1197 static int self_check_peb_ec_hdr(const struct ubi_device *ubi, int pnum) in self_check_peb_ec_hdr() argument
1203 if (!ubi_dbg_chk_io(ubi)) in self_check_peb_ec_hdr()
1206 ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_NOFS); in self_check_peb_ec_hdr()
1210 err = ubi_io_read(ubi, ec_hdr, pnum, 0, UBI_EC_HDR_SIZE); in self_check_peb_ec_hdr()
1217 ubi_err(ubi, "bad CRC, calculated %#08x, read %#08x", in self_check_peb_ec_hdr()
1219 ubi_err(ubi, "self-check failed for PEB %d", pnum); in self_check_peb_ec_hdr()
1226 err = self_check_ec_hdr(ubi, pnum, ec_hdr); in self_check_peb_ec_hdr()
1242 static int self_check_vid_hdr(const struct ubi_device *ubi, int pnum, in self_check_vid_hdr() argument
1248 if (!ubi_dbg_chk_io(ubi)) in self_check_vid_hdr()
1253 ubi_err(ubi, "bad VID header magic %#08x at PEB %d, must be %#08x", in self_check_vid_hdr()
1258 err = validate_vid_hdr(ubi, vid_hdr); in self_check_vid_hdr()
1260 ubi_err(ubi, "self-check failed for PEB %d", pnum); in self_check_vid_hdr()
1267 ubi_err(ubi, "self-check failed for PEB %d", pnum); in self_check_vid_hdr()
1282 static int self_check_peb_vid_hdr(const struct ubi_device *ubi, int pnum) in self_check_peb_vid_hdr() argument
1289 if (!ubi_dbg_chk_io(ubi)) in self_check_peb_vid_hdr()
1292 vid_hdr = ubi_zalloc_vid_hdr(ubi, GFP_NOFS); in self_check_peb_vid_hdr()
1296 p = (char *)vid_hdr - ubi->vid_hdr_shift; in self_check_peb_vid_hdr()
1297 err = ubi_io_read(ubi, p, pnum, ubi->vid_hdr_aloffset, in self_check_peb_vid_hdr()
1298 ubi->vid_hdr_alsize); in self_check_peb_vid_hdr()
1305 ubi_err(ubi, "bad VID header CRC at PEB %d, calculated %#08x, read %#08x", in self_check_peb_vid_hdr()
1307 ubi_err(ubi, "self-check failed for PEB %d", pnum); in self_check_peb_vid_hdr()
1314 err = self_check_vid_hdr(ubi, pnum, vid_hdr); in self_check_peb_vid_hdr()
1317 ubi_free_vid_hdr(ubi, vid_hdr); in self_check_peb_vid_hdr()
1333 static int self_check_write(struct ubi_device *ubi, const void *buf, int pnum, in self_check_write() argument
1339 loff_t addr = (loff_t)pnum * ubi->peb_size + offset; in self_check_write()
1341 if (!ubi_dbg_chk_io(ubi)) in self_check_write()
1346 ubi_err(ubi, "cannot allocate memory to check writes"); in self_check_write()
1350 err = mtd_read(ubi->mtd, addr, len, &read, buf1); in self_check_write()
1362 ubi_err(ubi, "self-check failed for PEB %d:%d, len %d", in self_check_write()
1364 ubi_msg(ubi, "data differ at position %d", i); in self_check_write()
1366 ubi_msg(ubi, "hex dump of the original buffer from %d to %d", in self_check_write()
1370 ubi_msg(ubi, "hex dump of the read buffer from %d to %d", in self_check_write()
1398 int ubi_self_check_all_ff(struct ubi_device *ubi, int pnum, int offset, int len) in ubi_self_check_all_ff() argument
1403 loff_t addr = (loff_t)pnum * ubi->peb_size + offset; in ubi_self_check_all_ff()
1405 if (!ubi_dbg_chk_io(ubi)) in ubi_self_check_all_ff()
1410 ubi_err(ubi, "cannot allocate memory to check for 0xFFs"); in ubi_self_check_all_ff()
1414 err = mtd_read(ubi->mtd, addr, len, &read, buf); in ubi_self_check_all_ff()
1416 ubi_err(ubi, "err %d while reading %d bytes from PEB %d:%d, read %zd bytes", in ubi_self_check_all_ff()
1423 ubi_err(ubi, "flash region at PEB %d:%d, length %d does not contain all 0xFF bytes", in ubi_self_check_all_ff()
1432 ubi_err(ubi, "self-check failed for PEB %d", pnum); in ubi_self_check_all_ff()
1433 ubi_msg(ubi, "hex dump of the %d-%d region", offset, offset + len); in ubi_self_check_all_ff()