Lines Matching refs:mtd

82 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs);
174 static int read_bbt(struct mtd_info *mtd, uint8_t *buf, int page, int num, in read_bbt() argument
178 struct nand_chip *this = mtd->priv; in read_bbt()
201 res = mtd_read(mtd, from, len, &retlen, buf); in read_bbt()
205 from & ~mtd->writesize); in read_bbt()
209 from & ~mtd->writesize); in read_bbt()
230 mtd->ecc_stats.bbtblocks++; in read_bbt()
247 mtd->ecc_stats.badblocks++; in read_bbt()
267 static int read_abs_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td, int chip) in read_abs_bbt() argument
269 struct nand_chip *this = mtd->priv; in read_abs_bbt()
276 res = read_bbt(mtd, buf, td->pages[i], in read_abs_bbt()
284 res = read_bbt(mtd, buf, td->pages[0], in read_abs_bbt()
285 mtd->size >> this->bbt_erase_shift, td, 0); in read_abs_bbt()
293 static int scan_read_data(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read_data() argument
303 return mtd_read(mtd, offs, len, &retlen, buf); in scan_read_data()
317 static int scan_read_oob(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read_oob() argument
325 ops.ooblen = mtd->oobsize; in scan_read_oob()
329 ops.len = min(len, (size_t)mtd->writesize); in scan_read_oob()
332 res = mtd_read_oob(mtd, offs, &ops); in scan_read_oob()
340 buf += mtd->oobsize + mtd->writesize; in scan_read_oob()
341 len -= mtd->writesize; in scan_read_oob()
342 offs += mtd->writesize; in scan_read_oob()
347 static int scan_read(struct mtd_info *mtd, uint8_t *buf, loff_t offs, in scan_read() argument
351 return scan_read_data(mtd, buf, offs, td); in scan_read()
353 return scan_read_oob(mtd, buf, offs, len); in scan_read()
357 static int scan_write_bbt(struct mtd_info *mtd, loff_t offs, size_t len, in scan_write_bbt() argument
364 ops.ooblen = mtd->oobsize; in scan_write_bbt()
369 return mtd_write_oob(mtd, offs, &ops); in scan_write_bbt()
372 static u32 bbt_get_ver_offs(struct mtd_info *mtd, struct nand_bbt_descr *td) in bbt_get_ver_offs() argument
377 ver_offs += mtd->writesize; in bbt_get_ver_offs()
391 static void read_abs_bbts(struct mtd_info *mtd, uint8_t *buf, in read_abs_bbts() argument
394 struct nand_chip *this = mtd->priv; in read_abs_bbts()
398 scan_read(mtd, buf, (loff_t)td->pages[0] << this->page_shift, in read_abs_bbts()
399 mtd->writesize, td); in read_abs_bbts()
400 td->version[0] = buf[bbt_get_ver_offs(mtd, td)]; in read_abs_bbts()
407 scan_read(mtd, buf, (loff_t)md->pages[0] << this->page_shift, in read_abs_bbts()
408 mtd->writesize, md); in read_abs_bbts()
409 md->version[0] = buf[bbt_get_ver_offs(mtd, md)]; in read_abs_bbts()
416 static int scan_block_fast(struct mtd_info *mtd, struct nand_bbt_descr *bd, in scan_block_fast() argument
422 ops.ooblen = mtd->oobsize; in scan_block_fast()
433 ret = mtd_read_oob(mtd, offs, &ops); in scan_block_fast()
441 offs += mtd->writesize; in scan_block_fast()
457 static int create_bbt(struct mtd_info *mtd, uint8_t *buf, in create_bbt() argument
460 struct nand_chip *this = mtd->priv; in create_bbt()
473 numblocks = mtd->size >> this->bbt_erase_shift; in create_bbt()
489 from += mtd->erasesize - (mtd->writesize * numpages); in create_bbt()
496 ret = scan_block_fast(mtd, bd, from, buf, numpages); in create_bbt()
504 mtd->ecc_stats.badblocks++; in create_bbt()
527 static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td) in search_bbt() argument
529 struct nand_chip *this = mtd->priv; in search_bbt()
532 int scanlen = mtd->writesize + mtd->oobsize; in search_bbt()
538 startblock = (mtd->size >> this->bbt_erase_shift) - 1; in search_bbt()
552 bbtblocks = mtd->size >> this->bbt_erase_shift; in search_bbt()
566 scan_read(mtd, buf, offs, mtd->writesize, td); in search_bbt()
567 if (!check_pattern(buf, scanlen, mtd->writesize, td)) { in search_bbt()
570 offs = bbt_get_ver_offs(mtd, td); in search_bbt()
598 static void search_read_bbts(struct mtd_info *mtd, uint8_t *buf, in search_read_bbts() argument
603 search_bbt(mtd, buf, td); in search_read_bbts()
607 search_bbt(mtd, buf, md); in search_read_bbts()
620 static int write_bbt(struct mtd_info *mtd, uint8_t *buf, in write_bbt() argument
624 struct nand_chip *this = mtd->priv; in write_bbt()
635 ops.ooblen = mtd->oobsize; in write_bbt()
653 numblocks = (int)(mtd->size >> this->bbt_erase_shift); in write_bbt()
725 res = mtd_read(mtd, to, len, &retlen, buf); in write_bbt()
734 ops.ooblen = (len >> this->page_shift) * mtd->oobsize; in write_bbt()
736 res = mtd_read_oob(mtd, to + mtd->writesize, &ops); in write_bbt()
745 ooboffs = len + (pageoffs * mtd->oobsize); in write_bbt()
757 len = ALIGN(len, mtd->writesize); in write_bbt()
766 len = ALIGN(len, mtd->writesize); in write_bbt()
769 (len >> this->page_shift)* mtd->oobsize); in write_bbt()
789 einfo.mtd = mtd; in write_bbt()
792 res = nand_erase_nand(mtd, &einfo, 1); in write_bbt()
796 res = scan_write_bbt(mtd, to, len, buf, in write_bbt()
823 static inline int nand_memory_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) in nand_memory_bbt() argument
825 struct nand_chip *this = mtd->priv; in nand_memory_bbt()
827 return create_bbt(mtd, this->buffers->databuf, bd, -1); in nand_memory_bbt()
841 static int check_create(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *bd) in check_create() argument
844 struct nand_chip *this = mtd->priv; in check_create()
901 create_bbt(mtd, buf, bd, chipsel); in check_create()
910 res = read_abs_bbt(mtd, buf, rd, chipsel); in check_create()
921 res2 = read_abs_bbt(mtd, buf, rd2, chipsel); in check_create()
943 res = write_bbt(mtd, buf, td, md, chipsel); in check_create()
950 res = write_bbt(mtd, buf, md, td, chipsel); in check_create()
966 static void mark_bbt_region(struct mtd_info *mtd, struct nand_bbt_descr *td) in mark_bbt_region() argument
968 struct nand_chip *this = mtd->priv; in mark_bbt_region()
978 nrblocks = (int)(mtd->size >> this->bbt_erase_shift); in mark_bbt_region()
991 nand_update_bbt(mtd, (loff_t)block << in mark_bbt_region()
1013 nand_update_bbt(mtd, (loff_t)(block - 1) << in mark_bbt_region()
1026 static void verify_bbt_descr(struct mtd_info *mtd, struct nand_bbt_descr *bd) in verify_bbt_descr() argument
1028 struct nand_chip *this = mtd->priv; in verify_bbt_descr()
1058 table_size = mtd->size >> this->bbt_erase_shift; in verify_bbt_descr()
1078 int nand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) in nand_scan_bbt() argument
1080 struct nand_chip *this = mtd->priv; in nand_scan_bbt()
1086 len = mtd->size >> (this->bbt_erase_shift + 2); in nand_scan_bbt()
1100 if ((res = nand_memory_bbt(mtd, bd))) { in nand_scan_bbt()
1107 verify_bbt_descr(mtd, td); in nand_scan_bbt()
1108 verify_bbt_descr(mtd, md); in nand_scan_bbt()
1112 len += (len >> this->page_shift) * mtd->oobsize; in nand_scan_bbt()
1122 read_abs_bbts(mtd, buf, td, md); in nand_scan_bbt()
1125 search_read_bbts(mtd, buf, td, md); in nand_scan_bbt()
1128 res = check_create(mtd, buf, bd); in nand_scan_bbt()
1131 mark_bbt_region(mtd, td); in nand_scan_bbt()
1133 mark_bbt_region(mtd, md); in nand_scan_bbt()
1146 static int nand_update_bbt(struct mtd_info *mtd, loff_t offs) in nand_update_bbt() argument
1148 struct nand_chip *this = mtd->priv; in nand_update_bbt()
1160 len += (len >> this->page_shift) * mtd->oobsize; in nand_update_bbt()
1180 res = write_bbt(mtd, buf, td, md, chipsel); in nand_update_bbt()
1186 res = write_bbt(mtd, buf, md, td, chipsel); in nand_update_bbt()
1280 int nand_default_bbt(struct mtd_info *mtd) in nand_default_bbt() argument
1282 struct nand_chip *this = mtd->priv; in nand_default_bbt()
1308 return nand_scan_bbt(mtd, this->badblock_pattern); in nand_default_bbt()
1316 int nand_isreserved_bbt(struct mtd_info *mtd, loff_t offs) in nand_isreserved_bbt() argument
1318 struct nand_chip *this = mtd->priv; in nand_isreserved_bbt()
1331 int nand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt) in nand_isbad_bbt() argument
1333 struct nand_chip *this = mtd->priv; in nand_isbad_bbt()
1358 int nand_markbad_bbt(struct mtd_info *mtd, loff_t offs) in nand_markbad_bbt() argument
1360 struct nand_chip *this = mtd->priv; in nand_markbad_bbt()
1370 ret = nand_update_bbt(mtd, offs); in nand_markbad_bbt()