Lines Matching refs:mtd

77 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs);
169 static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num, in read_bbt() argument
173 struct nand_chip *this = mtd_to_nand(mtd); in read_bbt()
196 res = mtd_read(mtd, from, len, &retlen, buf); in read_bbt()
200 from & ~mtd->writesize); in read_bbt()
204 from & ~mtd->writesize); in read_bbt()
225 mtd->ecc_stats.bbtblocks++; in read_bbt()
242 mtd->ecc_stats.badblocks++; in read_bbt()
262 static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip) in read_abs_bbt() argument
264 struct nand_chip *this = mtd_to_nand(mtd); in read_abs_bbt()
271 res = read_bbt(mtd, buf, td->pages[i], in read_abs_bbt()
279 res = read_bbt(mtd, buf, td->pages[0], in read_abs_bbt()
280 mtd->size >> this->bbt_erase_shift, td, 0); in read_abs_bbt()
288 static int scan_read_data(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read_data() argument
298 return mtd_read(mtd, offs, len, &retlen, buf); in scan_read_data()
312 static int scan_read_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read_oob() argument
320 ops.ooblen = mtd->oobsize; in scan_read_oob()
324 ops.len = min(len, (size_t)mtd->writesize); in scan_read_oob()
327 res = mtd_read_oob(mtd, offs, &ops); in scan_read_oob()
335 buf += mtd->oobsize + mtd->writesize; in scan_read_oob()
336 len -= mtd->writesize; in scan_read_oob()
337 offs += mtd->writesize; in scan_read_oob()
342 static int scan_read(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read() argument
346 return scan_read_data(mtd, buf, offs, td); in scan_read()
348 return scan_read_oob(mtd, buf, offs, len); in scan_read()
352 static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len, in scan_write_bbt() argument
359 ops.ooblen = mtd->oobsize; in scan_write_bbt()
364 return mtd_write_oob(mtd, offs, &ops); in scan_write_bbt()
367 static u32 bbt_get_ver_offs(struct mtd_info *mtd, struct nand_bbt_descr *td) in bbt_get_ver_offs() argument
372 ver_offs += mtd->writesize; in bbt_get_ver_offs()
386 static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf, in read_abs_bbts() argument
389 struct nand_chip *this = mtd_to_nand(mtd); in read_abs_bbts()
393 scan_read(mtd, buf, (loff_t)td->pages[0] << this->page_shift, in read_abs_bbts()
394 mtd->writesize, td); in read_abs_bbts()
395 td->version[0] = buf[bbt_get_ver_offs(mtd, td)]; in read_abs_bbts()
402 scan_read(mtd, buf, (loff_t)md->pages[0] << this->page_shift, in read_abs_bbts()
403 mtd->writesize, md); in read_abs_bbts()
404 md->version[0] = buf[bbt_get_ver_offs(mtd, md)]; in read_abs_bbts()
411 static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd, in scan_block_fast() argument
417 ops.ooblen = mtd->oobsize; in scan_block_fast()
428 ret = mtd_read_oob(mtd, offs, &ops); in scan_block_fast()
436 offs += mtd->writesize; in scan_block_fast()
452 static int create_bbt(struct mtd_info *mtd, uint8_t *buf, in create_bbt() argument
455 struct nand_chip *this = mtd_to_nand(mtd); in create_bbt()
468 numblocks = mtd->size >> this->bbt_erase_shift; in create_bbt()
484 from += mtd->erasesize - (mtd->writesize * numpages); in create_bbt()
491 ret = this->block_bad(mtd, from); in create_bbt()
493 ret = scan_block_fast(mtd, bd, from, buf, numpages); in create_bbt()
501 mtd->ecc_stats.badblocks++; in create_bbt()
524 static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td) in search_bbt() argument
526 struct nand_chip *this = mtd_to_nand(mtd); in search_bbt()
529 int scanlen = mtd->writesize + mtd->oobsize; in search_bbt()
535 startblock = (mtd->size >> this->bbt_erase_shift) - 1; in search_bbt()
549 bbtblocks = mtd->size >> this->bbt_erase_shift; in search_bbt()
563 scan_read(mtd, buf, offs, mtd->writesize, td); in search_bbt()
564 if (!check_pattern(buf, scanlen, mtd->writesize, td)) { in search_bbt()
567 offs = bbt_get_ver_offs(mtd, td); in search_bbt()
595 static void search_read_bbts(struct mtd_info *mtd, uint8_t *buf, in search_read_bbts() argument
600 search_bbt(mtd, buf, td); in search_read_bbts()
604 search_bbt(mtd, buf, md); in search_read_bbts()
617 static int write_bbt(struct mtd_info *mtd, uint8_t *buf, in write_bbt() argument
621 struct nand_chip *this = mtd_to_nand(mtd); in write_bbt()
632 ops.ooblen = mtd->oobsize; in write_bbt()
650 numblocks = (int)(mtd->size >> this->bbt_erase_shift); in write_bbt()
722 res = mtd_read(mtd, to, len, &retlen, buf); in write_bbt()
731 ops.ooblen = (len >> this->page_shift) * mtd->oobsize; in write_bbt()
733 res = mtd_read_oob(mtd, to + mtd->writesize, &ops); in write_bbt()
742 ooboffs = len + (pageoffs * mtd->oobsize); in write_bbt()
754 len = ALIGN(len, mtd->writesize); in write_bbt()
763 len = ALIGN(len, mtd->writesize); in write_bbt()
766 (len >> this->page_shift)* mtd->oobsize); in write_bbt()
786 einfo.mtd = mtd; in write_bbt()
789 res = nand_erase_nand(mtd, &einfo, 1); in write_bbt()
793 res = scan_write_bbt(mtd, to, len, buf, in write_bbt()
820 static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) in nand_memory_bbt() argument
822 struct nand_chip *this = mtd_to_nand(mtd); in nand_memory_bbt()
824 return create_bbt(mtd, this->buffers->databuf, bd, -1); in nand_memory_bbt()
838 static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd) in check_create() argument
841 struct nand_chip *this = mtd_to_nand(mtd); in check_create()
898 create_bbt(mtd, buf, bd, chipsel); in check_create()
907 res = read_abs_bbt(mtd, buf, rd, chipsel); in check_create()
918 res2 = read_abs_bbt(mtd, buf, rd2, chipsel); in check_create()
940 res = write_bbt(mtd, buf, td, md, chipsel); in check_create()
947 res = write_bbt(mtd, buf, md, td, chipsel); in check_create()
963 static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td) in mark_bbt_region() argument
965 struct nand_chip *this = mtd_to_nand(mtd); in mark_bbt_region()
975 nrblocks = (int)(mtd->size >> this->bbt_erase_shift); in mark_bbt_region()
988 nand_update_bbt(mtd, (loff_t)block << in mark_bbt_region()
1010 nand_update_bbt(mtd, (loff_t)(block - 1) << in mark_bbt_region()
1023 static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd) in verify_bbt_descr() argument
1025 struct nand_chip *this = mtd_to_nand(mtd); in verify_bbt_descr()
1055 table_size = mtd->size >> this->bbt_erase_shift; in verify_bbt_descr()
1075 static int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) in nand_scan_bbt() argument
1077 struct nand_chip *this = mtd_to_nand(mtd); in nand_scan_bbt()
1083 len = (mtd->size >> (this->bbt_erase_shift + 2)) ? : 1; in nand_scan_bbt()
1097 if ((res = nand_memory_bbt(mtd, bd))) { in nand_scan_bbt()
1103 verify_bbt_descr(mtd, td); in nand_scan_bbt()
1104 verify_bbt_descr(mtd, md); in nand_scan_bbt()
1108 len += (len >> this->page_shift) * mtd->oobsize; in nand_scan_bbt()
1117 read_abs_bbts(mtd, buf, td, md); in nand_scan_bbt()
1120 search_read_bbts(mtd, buf, td, md); in nand_scan_bbt()
1123 res = check_create(mtd, buf, bd); in nand_scan_bbt()
1128 mark_bbt_region(mtd, td); in nand_scan_bbt()
1130 mark_bbt_region(mtd, md); in nand_scan_bbt()
1148 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs) in nand_update_bbt() argument
1150 struct nand_chip *this = mtd_to_nand(mtd); in nand_update_bbt()
1162 len += (len >> this->page_shift) * mtd->oobsize; in nand_update_bbt()
1182 res = write_bbt(mtd, buf, td, md, chipsel); in nand_update_bbt()
1188 res = write_bbt(mtd, buf, md, td, chipsel); in nand_update_bbt()
1282 int nand_default_bbt(struct mtd_info *mtd) in nand_default_bbt() argument
1284 struct nand_chip *this = mtd_to_nand(mtd); in nand_default_bbt()
1310 return nand_scan_bbt(mtd, this->badblock_pattern); in nand_default_bbt()
1318 int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs) in nand_isreserved_bbt() argument
1320 struct nand_chip *this = mtd_to_nand(mtd); in nand_isreserved_bbt()
1333 int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt) in nand_isbad_bbt() argument
1335 struct nand_chip *this = mtd_to_nand(mtd); in nand_isbad_bbt()
1360 int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs) in nand_markbad_bbt() argument
1362 struct nand_chip *this = mtd_to_nand(mtd); in nand_markbad_bbt()
1372 ret = nand_update_bbt(mtd, offs); in nand_markbad_bbt()