Lines Matching refs:td
93 static int check_pattern_no_oob(uint8_t *buf, struct nand_bbt_descr *td) in check_pattern_no_oob() argument
95 if (memcmp(buf, td->pattern, td->len)) in check_pattern_no_oob()
110 static int check_pattern(uint8_t *buf, int len, int paglen, struct nand_bbt_descr *td) in check_pattern() argument
112 if (td->options & NAND_BBT_NO_OOB) in check_pattern()
113 return check_pattern_no_oob(buf, td); in check_pattern()
116 if (memcmp(buf + paglen + td->offs, td->pattern, td->len)) in check_pattern()
131 static int check_short_pattern(uint8_t *buf, struct nand_bbt_descr *td) in check_short_pattern() argument
134 if (memcmp(buf + td->offs, td->pattern, td->len)) in check_short_pattern()
145 static u32 add_marker_len(struct nand_bbt_descr *td) in add_marker_len() argument
149 if (!(td->options & NAND_BBT_NO_OOB)) in add_marker_len()
152 len = td->len; in add_marker_len()
153 if (td->options & NAND_BBT_VERSION) in add_marker_len()
170 struct nand_bbt_descr *td, int offs) in read_bbt() argument
176 int bits = td->options & NAND_BBT_NRBITS_MSK; in read_bbt()
179 int reserved_block_code = td->reserved_block_code; in read_bbt()
182 marker_len = add_marker_len(td); 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
267 if (td->options & NAND_BBT_PERCHIP) { in read_abs_bbt()
271 res = read_bbt(mtd, buf, td->pages[i], in read_abs_bbt()
273 td, offs); 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()
289 struct nand_bbt_descr *td) in scan_read_data() argument
294 len = td->len; in scan_read_data()
295 if (td->options & NAND_BBT_VERSION) in scan_read_data()
343 size_t len, struct nand_bbt_descr *td) in scan_read() argument
345 if (td->options & NAND_BBT_NO_OOB) in scan_read()
346 return scan_read_data(mtd, buf, offs, td); in scan_read()
367 static u32 bbt_get_ver_offs(struct mtd_info *mtd, struct nand_bbt_descr *td) in bbt_get_ver_offs() argument
369 u32 ver_offs = td->veroffs; in bbt_get_ver_offs()
371 if (!(td->options & NAND_BBT_NO_OOB)) in bbt_get_ver_offs()
387 struct nand_bbt_descr *td, struct nand_bbt_descr *md) in read_abs_bbts() argument
392 if (td->options & NAND_BBT_VERSION) { 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()
397 td->pages[0], td->version[0]); in read_abs_bbts()
524 static int search_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr *td) in search_bbt() argument
534 if (td->options & NAND_BBT_LASTBLOCK) { in search_bbt()
543 if (td->options & NAND_BBT_PERCHIP) { in search_bbt()
554 td->version[i] = 0; in search_bbt()
555 td->pages[i] = -1; in search_bbt()
557 for (block = 0; block < td->maxblocks; block++) { 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()
565 td->pages[i] = actblock << blocktopage; in search_bbt()
566 if (td->options & NAND_BBT_VERSION) { in search_bbt()
567 offs = bbt_get_ver_offs(mtd, td); in search_bbt()
568 td->version[i] = buf[offs]; in search_bbt()
577 if (td->pages[i] == -1) in search_bbt()
581 td->pages[i], td->version[i]); in search_bbt()
596 struct nand_bbt_descr *td, in search_read_bbts() argument
600 search_bbt(mtd, buf, td); in search_read_bbts()
618 struct nand_bbt_descr *td, struct nand_bbt_descr *md, in write_bbt() argument
627 uint8_t rcode = td->reserved_block_code; in write_bbt()
640 if (td->options & NAND_BBT_PERCHIP) { in write_bbt()
661 if (td->pages[chip] != -1) { in write_bbt()
662 page = td->pages[chip]; in write_bbt()
670 if (td->options & NAND_BBT_LASTBLOCK) { in write_bbt()
678 for (i = 0; i < td->maxblocks; i++) { in write_bbt()
697 bits = td->options & NAND_BBT_NRBITS_MSK; in write_bbt()
718 if (td->options & NAND_BBT_SAVECONTENT) { in write_bbt()
744 } else if (td->options & NAND_BBT_NO_OOB) { in write_bbt()
746 offs = td->len; in write_bbt()
748 if (td->options & NAND_BBT_VERSION) in write_bbt()
758 memcpy(buf, td->pattern, td->len); in write_bbt()
770 memcpy(&buf[ooboffs + td->offs], td->pattern, td->len); in write_bbt()
773 if (td->options & NAND_BBT_VERSION) in write_bbt()
774 buf[ooboffs + td->veroffs] = td->version[chip]; in write_bbt()
794 td->options & NAND_BBT_NO_OOB ? NULL : in write_bbt()
800 (unsigned long long)to, td->version[chip]); in write_bbt()
803 td->pages[chip] = page; in write_bbt()
842 struct nand_bbt_descr *td = this->bbt_td; in check_create() local
847 if (td->options & NAND_BBT_PERCHIP) in check_create()
859 chipsel = (td->options & NAND_BBT_PERCHIP) ? i : -1; in check_create()
862 if (td->pages[i] == -1 && md->pages[i] == -1) { in check_create()
865 } else if (td->pages[i] == -1) { in check_create()
869 rd = td; in check_create()
871 } else if (td->version[i] == md->version[i]) { in check_create()
872 rd = td; in check_create()
873 if (!(td->options & NAND_BBT_VERSION)) in check_create()
875 } else if (((int8_t)(td->version[i] - md->version[i])) > 0) { in check_create()
876 rd = td; in check_create()
883 if (td->pages[i] == -1) { in check_create()
887 rd = td; in check_create()
893 if (!(td->options & NAND_BBT_CREATE)) in check_create()
900 td->version[i] = 1; in check_create()
934 td->version[i] = max(td->version[i], md->version[i]); in check_create()
935 md->version[i] = td->version[i]; in check_create()
939 if ((writeops & 0x01) && (td->options & NAND_BBT_WRITE)) { 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
970 if (td->options & NAND_BBT_PERCHIP) { in mark_bbt_region()
979 if ((td->options & NAND_BBT_ABSPAGE) || in mark_bbt_region()
980 !(td->options & NAND_BBT_WRITE)) { in mark_bbt_region()
981 if (td->pages[i] == -1) in mark_bbt_region()
983 block = td->pages[i] >> (this->bbt_erase_shift - this->page_shift); in mark_bbt_region()
987 td->reserved_block_code) in mark_bbt_region()
993 if (td->options & NAND_BBT_LASTBLOCK) in mark_bbt_region()
994 block = ((i + 1) * nrblocks) - td->maxblocks; in mark_bbt_region()
997 for (j = 0; j < td->maxblocks; j++) { in mark_bbt_region()
1009 if (update && td->reserved_block_code) in mark_bbt_region()
1080 struct nand_bbt_descr *td = this->bbt_td; in nand_scan_bbt() local
1096 if (!td) { in nand_scan_bbt()
1103 verify_bbt_descr(mtd, td); in nand_scan_bbt()
1116 if (td->options & NAND_BBT_ABSPAGE) { 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()
1128 mark_bbt_region(mtd, td); in nand_scan_bbt()
1154 struct nand_bbt_descr *td = this->bbt_td; in nand_update_bbt() local
1157 if (!this->bbt || !td) in nand_update_bbt()
1168 if (td->options & NAND_BBT_PERCHIP) { in nand_update_bbt()
1176 td->version[chip]++; in nand_update_bbt()
1181 if (td->options & NAND_BBT_WRITE) { 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()