Lines Matching refs:mtd
80 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs);
172 static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num, in read_bbt() argument
176 struct nand_chip *this = mtd_to_nand(mtd); in read_bbt()
199 res = mtd_read(mtd, from, len, &retlen, buf); in read_bbt()
203 from & ~mtd->writesize); in read_bbt()
207 from & ~mtd->writesize); in read_bbt()
228 mtd->ecc_stats.bbtblocks++; in read_bbt()
245 mtd->ecc_stats.badblocks++; in read_bbt()
265 static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip) in read_abs_bbt() argument
267 struct nand_chip *this = mtd_to_nand(mtd); in read_abs_bbt()
274 res = read_bbt(mtd, buf, td->pages[i], in read_abs_bbt()
282 res = read_bbt(mtd, buf, td->pages[0], in read_abs_bbt()
283 mtd->size >> this->bbt_erase_shift, td, 0); in read_abs_bbt()
291 static int scan_read_data(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read_data() argument
301 return mtd_read(mtd, offs, len, &retlen, buf); in scan_read_data()
315 static int scan_read_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read_oob() argument
323 ops.ooblen = mtd->oobsize; in scan_read_oob()
327 ops.len = min(len, (size_t)mtd->writesize); in scan_read_oob()
330 res = mtd_read_oob(mtd, offs, &ops); in scan_read_oob()
338 buf += mtd->oobsize + mtd->writesize; in scan_read_oob()
339 len -= mtd->writesize; in scan_read_oob()
340 offs += mtd->writesize; in scan_read_oob()
345 static int scan_read(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read() argument
349 return scan_read_data(mtd, buf, offs, td); in scan_read()
351 return scan_read_oob(mtd, buf, offs, len); in scan_read()
355 static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len, in scan_write_bbt() argument
362 ops.ooblen = mtd->oobsize; in scan_write_bbt()
367 return mtd_write_oob(mtd, offs, &ops); in scan_write_bbt()
370 static u32 bbt_get_ver_offs(struct mtd_info *mtd, struct nand_bbt_descr *td) in bbt_get_ver_offs() argument
375 ver_offs += mtd->writesize; in bbt_get_ver_offs()
389 static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf, in read_abs_bbts() argument
392 struct nand_chip *this = mtd_to_nand(mtd); in read_abs_bbts()
396 scan_read(mtd, buf, (loff_t)td->pages[0] << this->page_shift, in read_abs_bbts()
397 mtd->writesize, td); in read_abs_bbts()
398 td->version[0] = buf[bbt_get_ver_offs(mtd, td)]; in read_abs_bbts()
405 scan_read(mtd, buf, (loff_t)md->pages[0] << this->page_shift, in read_abs_bbts()
406 mtd->writesize, md); in read_abs_bbts()
407 md->version[0] = buf[bbt_get_ver_offs(mtd, md)]; in read_abs_bbts()
414 static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd, in scan_block_fast() argument
420 ops.ooblen = mtd->oobsize; in scan_block_fast()
431 ret = mtd_read_oob(mtd, offs, &ops); in scan_block_fast()
439 offs += mtd->writesize; in scan_block_fast()
455 static int create_bbt(struct mtd_info *mtd, uint8_t *buf, in create_bbt() argument
458 struct nand_chip *this = mtd_to_nand(mtd); in create_bbt()
471 numblocks = mtd->size >> this->bbt_erase_shift; in create_bbt()
487 from += mtd->erasesize - (mtd->writesize * numpages); in create_bbt()
494 ret = scan_block_fast(mtd, bd, from, buf, numpages); in create_bbt()
502 mtd->ecc_stats.badblocks++; in create_bbt()
525 static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td) in search_bbt() argument
527 struct nand_chip *this = mtd_to_nand(mtd); in search_bbt()
530 int scanlen = mtd->writesize + mtd->oobsize; in search_bbt()
536 startblock = (mtd->size >> this->bbt_erase_shift) - 1; in search_bbt()
550 bbtblocks = mtd->size >> this->bbt_erase_shift; in search_bbt()
564 scan_read(mtd, buf, offs, mtd->writesize, td); in search_bbt()
565 if (!check_pattern(buf, scanlen, mtd->writesize, td)) { in search_bbt()
568 offs = bbt_get_ver_offs(mtd, td); in search_bbt()
596 static void search_read_bbts(struct mtd_info *mtd, uint8_t *buf, in search_read_bbts() argument
601 search_bbt(mtd, buf, td); in search_read_bbts()
605 search_bbt(mtd, buf, md); in search_read_bbts()
618 static int write_bbt(struct mtd_info *mtd, uint8_t *buf, in write_bbt() argument
622 struct nand_chip *this = mtd_to_nand(mtd); in write_bbt()
633 ops.ooblen = mtd->oobsize; in write_bbt()
651 numblocks = (int)(mtd->size >> this->bbt_erase_shift); in write_bbt()
723 res = mtd_read(mtd, to, len, &retlen, buf); in write_bbt()
732 ops.ooblen = (len >> this->page_shift) * mtd->oobsize; in write_bbt()
734 res = mtd_read_oob(mtd, to + mtd->writesize, &ops); in write_bbt()
743 ooboffs = len + (pageoffs * mtd->oobsize); in write_bbt()
755 len = ALIGN(len, mtd->writesize); in write_bbt()
764 len = ALIGN(len, mtd->writesize); in write_bbt()
767 (len >> this->page_shift)* mtd->oobsize); in write_bbt()
787 einfo.mtd = mtd; in write_bbt()
790 res = nand_erase_nand(mtd, &einfo, 1); in write_bbt()
794 res = scan_write_bbt(mtd, to, len, buf, in write_bbt()
821 static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) in nand_memory_bbt() argument
823 struct nand_chip *this = mtd_to_nand(mtd); in nand_memory_bbt()
825 return create_bbt(mtd, this->buffers->databuf, bd, -1); in nand_memory_bbt()
839 static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd) in check_create() argument
842 struct nand_chip *this = mtd_to_nand(mtd); in check_create()
899 create_bbt(mtd, buf, bd, chipsel); in check_create()
908 res = read_abs_bbt(mtd, buf, rd, chipsel); in check_create()
919 res2 = read_abs_bbt(mtd, buf, rd2, chipsel); in check_create()
941 res = write_bbt(mtd, buf, td, md, chipsel); in check_create()
948 res = write_bbt(mtd, buf, md, td, chipsel); in check_create()
964 static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td) in mark_bbt_region() argument
966 struct nand_chip *this = mtd_to_nand(mtd); in mark_bbt_region()
976 nrblocks = (int)(mtd->size >> this->bbt_erase_shift); in mark_bbt_region()
989 nand_update_bbt(mtd, (loff_t)block << in mark_bbt_region()
1011 nand_update_bbt(mtd, (loff_t)(block - 1) << in mark_bbt_region()
1024 static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd) in verify_bbt_descr() argument
1026 struct nand_chip *this = mtd_to_nand(mtd); in verify_bbt_descr()
1056 table_size = mtd->size >> this->bbt_erase_shift; in verify_bbt_descr()
1076 static int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) in nand_scan_bbt() argument
1078 struct nand_chip *this = mtd_to_nand(mtd); in nand_scan_bbt()
1084 len = (mtd->size >> (this->bbt_erase_shift + 2)) ? : 1; in nand_scan_bbt()
1098 if ((res = nand_memory_bbt(mtd, bd))) { in nand_scan_bbt()
1104 verify_bbt_descr(mtd, td); in nand_scan_bbt()
1105 verify_bbt_descr(mtd, md); in nand_scan_bbt()
1109 len += (len >> this->page_shift) * mtd->oobsize; in nand_scan_bbt()
1118 read_abs_bbts(mtd, buf, td, md); in nand_scan_bbt()
1121 search_read_bbts(mtd, buf, td, md); in nand_scan_bbt()
1124 res = check_create(mtd, buf, bd); in nand_scan_bbt()
1129 mark_bbt_region(mtd, td); in nand_scan_bbt()
1131 mark_bbt_region(mtd, md); in nand_scan_bbt()
1149 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs) in nand_update_bbt() argument
1151 struct nand_chip *this = mtd_to_nand(mtd); in nand_update_bbt()
1163 len += (len >> this->page_shift) * mtd->oobsize; in nand_update_bbt()
1183 res = write_bbt(mtd, buf, td, md, chipsel); in nand_update_bbt()
1189 res = write_bbt(mtd, buf, md, td, chipsel); in nand_update_bbt()
1283 int nand_default_bbt(struct mtd_info *mtd) in nand_default_bbt() argument
1285 struct nand_chip *this = mtd_to_nand(mtd); in nand_default_bbt()
1311 return nand_scan_bbt(mtd, this->badblock_pattern); in nand_default_bbt()
1319 int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs) in nand_isreserved_bbt() argument
1321 struct nand_chip *this = mtd_to_nand(mtd); in nand_isreserved_bbt()
1334 int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt) in nand_isbad_bbt() argument
1336 struct nand_chip *this = mtd_to_nand(mtd); in nand_isbad_bbt()
1361 int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs) in nand_markbad_bbt() argument
1363 struct nand_chip *this = mtd_to_nand(mtd); in nand_markbad_bbt()
1373 ret = nand_update_bbt(mtd, offs); in nand_markbad_bbt()