Lines Matching refs:mtd
79 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs);
171 static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num, in read_bbt() argument
175 struct nand_chip *this = mtd_to_nand(mtd); in read_bbt()
198 res = mtd_read(mtd, from, len, &retlen, buf); in read_bbt()
202 from & ~mtd->writesize); in read_bbt()
206 from & ~mtd->writesize); in read_bbt()
227 mtd->ecc_stats.bbtblocks++; in read_bbt()
244 mtd->ecc_stats.badblocks++; in read_bbt()
264 static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip) in read_abs_bbt() argument
266 struct nand_chip *this = mtd_to_nand(mtd); in read_abs_bbt()
273 res = read_bbt(mtd, buf, td->pages[i], in read_abs_bbt()
281 res = read_bbt(mtd, buf, td->pages[0], in read_abs_bbt()
282 mtd->size >> this->bbt_erase_shift, td, 0); in read_abs_bbt()
290 static int scan_read_data(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read_data() argument
300 return mtd_read(mtd, offs, len, &retlen, buf); in scan_read_data()
314 static int scan_read_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read_oob() argument
322 ops.ooblen = mtd->oobsize; in scan_read_oob()
326 ops.len = min(len, (size_t)mtd->writesize); in scan_read_oob()
329 res = mtd_read_oob(mtd, offs, &ops); in scan_read_oob()
337 buf += mtd->oobsize + mtd->writesize; in scan_read_oob()
338 len -= mtd->writesize; in scan_read_oob()
339 offs += mtd->writesize; in scan_read_oob()
344 static int scan_read(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read() argument
348 return scan_read_data(mtd, buf, offs, td); in scan_read()
350 return scan_read_oob(mtd, buf, offs, len); in scan_read()
354 static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len, in scan_write_bbt() argument
361 ops.ooblen = mtd->oobsize; in scan_write_bbt()
366 return mtd_write_oob(mtd, offs, &ops); in scan_write_bbt()
369 static u32 bbt_get_ver_offs(struct mtd_info *mtd, struct nand_bbt_descr *td) in bbt_get_ver_offs() argument
374 ver_offs += mtd->writesize; in bbt_get_ver_offs()
388 static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf, in read_abs_bbts() argument
391 struct nand_chip *this = mtd_to_nand(mtd); in read_abs_bbts()
395 scan_read(mtd, buf, (loff_t)td->pages[0] << this->page_shift, in read_abs_bbts()
396 mtd->writesize, td); in read_abs_bbts()
397 td->version[0] = buf[bbt_get_ver_offs(mtd, td)]; in read_abs_bbts()
404 scan_read(mtd, buf, (loff_t)md->pages[0] << this->page_shift, in read_abs_bbts()
405 mtd->writesize, md); in read_abs_bbts()
406 md->version[0] = buf[bbt_get_ver_offs(mtd, md)]; in read_abs_bbts()
413 static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd, in scan_block_fast() argument
419 ops.ooblen = mtd->oobsize; in scan_block_fast()
430 ret = mtd_read_oob(mtd, offs, &ops); in scan_block_fast()
438 offs += mtd->writesize; in scan_block_fast()
454 static int create_bbt(struct mtd_info *mtd, uint8_t *buf, in create_bbt() argument
457 struct nand_chip *this = mtd_to_nand(mtd); in create_bbt()
470 numblocks = mtd->size >> this->bbt_erase_shift; in create_bbt()
486 from += mtd->erasesize - (mtd->writesize * numpages); 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()
686 struct mtd_info *mtd = nand_to_mtd(this); in mark_bbt_block_bad() local
693 res = this->block_markbad(mtd, to); in mark_bbt_block_bad()
711 static int write_bbt(struct mtd_info *mtd, uint8_t *buf, in write_bbt() argument
715 struct nand_chip *this = mtd_to_nand(mtd); in write_bbt()
726 ops.ooblen = mtd->oobsize; in write_bbt()
744 numblocks = (int)(mtd->size >> this->bbt_erase_shift); in write_bbt()
791 res = mtd_read(mtd, to, len, &retlen, buf); in write_bbt()
800 ops.ooblen = (len >> this->page_shift) * mtd->oobsize; in write_bbt()
802 res = mtd_read_oob(mtd, to + mtd->writesize, &ops); in write_bbt()
811 ooboffs = len + (pageoffs * mtd->oobsize); in write_bbt()
823 len = ALIGN(len, mtd->writesize); in write_bbt()
832 len = ALIGN(len, mtd->writesize); in write_bbt()
835 (len >> this->page_shift)* mtd->oobsize); in write_bbt()
855 einfo.mtd = mtd; in write_bbt()
858 res = nand_erase_nand(mtd, &einfo, 1); in write_bbt()
866 res = scan_write_bbt(mtd, to, len, buf, in write_bbt()
897 static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) in nand_memory_bbt() argument
899 struct nand_chip *this = mtd_to_nand(mtd); in nand_memory_bbt()
901 return create_bbt(mtd, this->buffers->databuf, bd, -1); in nand_memory_bbt()
915 static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd) in check_create() argument
918 struct nand_chip *this = mtd_to_nand(mtd); in check_create()
975 create_bbt(mtd, buf, bd, chipsel); in check_create()
984 res = read_abs_bbt(mtd, buf, rd, chipsel); in check_create()
995 res2 = read_abs_bbt(mtd, buf, rd2, chipsel); in check_create()
1017 res = write_bbt(mtd, buf, td, md, chipsel); in check_create()
1024 res = write_bbt(mtd, buf, md, td, chipsel); in check_create()
1040 static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td) in mark_bbt_region() argument
1042 struct nand_chip *this = mtd_to_nand(mtd); in mark_bbt_region()
1052 nrblocks = (int)(mtd->size >> this->bbt_erase_shift); in mark_bbt_region()
1065 nand_update_bbt(mtd, (loff_t)block << in mark_bbt_region()
1087 nand_update_bbt(mtd, (loff_t)(block - 1) << in mark_bbt_region()
1100 static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd) in verify_bbt_descr() argument
1102 struct nand_chip *this = mtd_to_nand(mtd); in verify_bbt_descr()
1132 table_size = mtd->size >> this->bbt_erase_shift; in verify_bbt_descr()
1152 static int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) in nand_scan_bbt() argument
1154 struct nand_chip *this = mtd_to_nand(mtd); in nand_scan_bbt()
1160 len = (mtd->size >> (this->bbt_erase_shift + 2)) ? : 1; in nand_scan_bbt()
1174 if ((res = nand_memory_bbt(mtd, bd))) { in nand_scan_bbt()
1180 verify_bbt_descr(mtd, td); in nand_scan_bbt()
1181 verify_bbt_descr(mtd, md); in nand_scan_bbt()
1185 len += (len >> this->page_shift) * mtd->oobsize; in nand_scan_bbt()
1194 read_abs_bbts(mtd, buf, td, md); in nand_scan_bbt()
1197 search_read_bbts(mtd, buf, td, md); in nand_scan_bbt()
1200 res = check_create(mtd, buf, bd); in nand_scan_bbt()
1205 mark_bbt_region(mtd, td); in nand_scan_bbt()
1207 mark_bbt_region(mtd, md); in nand_scan_bbt()
1225 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs) in nand_update_bbt() argument
1227 struct nand_chip *this = mtd_to_nand(mtd); in nand_update_bbt()
1239 len += (len >> this->page_shift) * mtd->oobsize; in nand_update_bbt()
1259 res = write_bbt(mtd, buf, td, md, chipsel); in nand_update_bbt()
1265 res = write_bbt(mtd, buf, md, td, chipsel); in nand_update_bbt()
1359 int nand_default_bbt(struct mtd_info *mtd) in nand_default_bbt() argument
1361 struct nand_chip *this = mtd_to_nand(mtd); in nand_default_bbt()
1387 return nand_scan_bbt(mtd, this->badblock_pattern); in nand_default_bbt()
1395 int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs) in nand_isreserved_bbt() argument
1397 struct nand_chip *this = mtd_to_nand(mtd); in nand_isreserved_bbt()
1410 int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt) in nand_isbad_bbt() argument
1412 struct nand_chip *this = mtd_to_nand(mtd); in nand_isbad_bbt()
1437 int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs) in nand_markbad_bbt() argument
1439 struct nand_chip *this = mtd_to_nand(mtd); in nand_markbad_bbt()
1449 ret = nand_update_bbt(mtd, offs); in nand_markbad_bbt()