Lines Matching refs:nftl

38 static int find_boot_record(struct NFTLrecord *nftl)  in find_boot_record()  argument
44 struct NFTLMediaHeader *mh = &nftl->MediaHdr; in find_boot_record()
45 struct mtd_info *mtd = nftl->mbd.mtd; in find_boot_record()
54 nftl->EraseSize = nftl->mbd.mtd->erasesize; in find_boot_record()
55 nftl->nb_blocks = (u32)nftl->mbd.mtd->size / nftl->EraseSize; in find_boot_record()
57 nftl->MediaUnit = BLOCK_NIL; in find_boot_record()
58 nftl->SpareMediaUnit = BLOCK_NIL; in find_boot_record()
61 for (block = 0; block < nftl->nb_blocks; block++) { in find_boot_record()
66 ret = mtd_read(mtd, block * nftl->EraseSize, SECTORSIZE, in find_boot_record()
75 block * nftl->EraseSize, nftl->mbd.mtd->index, ret); in find_boot_record()
86 block * nftl->EraseSize, nftl->mbd.mtd->index); in find_boot_record()
92 ret = nftl_read_oob(mtd, block * nftl->EraseSize + in find_boot_record()
97 block * nftl->EraseSize, nftl->mbd.mtd->index, ret); in find_boot_record()
107 block * nftl->EraseSize, nftl->mbd.mtd->index, in find_boot_record()
113 ret = mtd->read(mtd, block * nftl->EraseSize, SECTORSIZE, in find_boot_record()
117 block * nftl->EraseSize, nftl->mbd.mtd->index, ret); in find_boot_record()
124 block * nftl->EraseSize, nftl->mbd.mtd->index); in find_boot_record()
136 nftl->MediaUnit * nftl->EraseSize, block * nftl->EraseSize); in find_boot_record()
145 nftl->SpareMediaUnit = block; in find_boot_record()
148 nftl->ReplUnitTable[block] = BLOCK_RESERVED; in find_boot_record()
172 nftl->EraseSize = nftl->mbd.mtd->erasesize << (0xff - mh->UnitSizeFactor); in find_boot_record()
173 nftl->nb_blocks = (u32)nftl->mbd.mtd->size / nftl->EraseSize; in find_boot_record()
176 nftl->nb_boot_blocks = le16_to_cpu(mh->FirstPhysicalEUN); in find_boot_record()
177 if ((nftl->nb_boot_blocks + 2) >= nftl->nb_blocks) { in find_boot_record()
180 nftl->nb_boot_blocks, nftl->nb_blocks); in find_boot_record()
184 nftl->numvunits = le32_to_cpu(mh->FormattedSize) / nftl->EraseSize; in find_boot_record()
185 if (nftl->numvunits > (nftl->nb_blocks - nftl->nb_boot_blocks - 2)) { in find_boot_record()
188 nftl->numvunits, nftl->nb_blocks, nftl->nb_boot_blocks); in find_boot_record()
192 nftl->mbd.size = nftl->numvunits * (nftl->EraseSize / SECTORSIZE); in find_boot_record()
196 nftl->nb_blocks = le16_to_cpu(mh->NumEraseUnits) + le16_to_cpu(mh->FirstPhysicalEUN); in find_boot_record()
199 nftl->lastEUN = nftl->nb_blocks - 1; in find_boot_record()
202 nftl->EUNtable = kmalloc_array(nftl->nb_blocks, sizeof(u16), in find_boot_record()
204 if (!nftl->EUNtable) { in find_boot_record()
209 nftl->ReplUnitTable = kmalloc_array(nftl->nb_blocks, in find_boot_record()
212 if (!nftl->ReplUnitTable) { in find_boot_record()
213 kfree(nftl->EUNtable); in find_boot_record()
219 for (i = 0; i < nftl->nb_boot_blocks; i++) in find_boot_record()
220 nftl->ReplUnitTable[i] = BLOCK_RESERVED; in find_boot_record()
222 for (; i < nftl->nb_blocks; i++) { in find_boot_record()
223 nftl->ReplUnitTable[i] = BLOCK_NOTEXPLORED; in find_boot_record()
227 nftl->ReplUnitTable[block] = BLOCK_RESERVED; in find_boot_record()
230 for (i = 0; i < nftl->nb_blocks; i++) { in find_boot_record()
235 ret = mtd->read(nftl->mbd.mtd, in find_boot_record()
236 block * nftl->EraseSize + i + in find_boot_record()
242 kfree(nftl->ReplUnitTable); in find_boot_record()
243 kfree(nftl->EUNtable); in find_boot_record()
249 nftl->ReplUnitTable[i] = BLOCK_RESERVED; in find_boot_record()
251 if (mtd_block_isbad(nftl->mbd.mtd, in find_boot_record()
252 i * nftl->EraseSize)) in find_boot_record()
253 nftl->ReplUnitTable[i] = BLOCK_RESERVED; in find_boot_record()
256 nftl->MediaUnit = block; in find_boot_record()
275 static int check_free_sectors(struct NFTLrecord *nftl, unsigned int address, int len, in check_free_sectors() argument
278 struct mtd_info *mtd = nftl->mbd.mtd; in check_free_sectors()
318 int NFTL_formatblock(struct NFTLrecord *nftl, int block) in NFTL_formatblock() argument
323 struct erase_info *instr = &nftl->instr; in NFTL_formatblock()
324 struct mtd_info *mtd = nftl->mbd.mtd; in NFTL_formatblock()
327 if (nftl_read_oob(mtd, block * nftl->EraseSize + SECTORSIZE + 8, in NFTL_formatblock()
342 instr->addr = block * nftl->EraseSize; in NFTL_formatblock()
343 instr->len = nftl->EraseSize; in NFTL_formatblock()
360 if (check_free_sectors(nftl, instr->addr, nftl->EraseSize, 1) != 0) in NFTL_formatblock()
364 if (nftl_write_oob(mtd, block * nftl->EraseSize + SECTORSIZE + in NFTL_formatblock()
371 mtd_block_markbad(nftl->mbd.mtd, instr->addr); in NFTL_formatblock()
384 static void check_sectors_in_chain(struct NFTLrecord *nftl, unsigned int first_block) in check_sectors_in_chain() argument
386 struct mtd_info *mtd = nftl->mbd.mtd; in check_sectors_in_chain()
392 sectors_per_block = nftl->EraseSize / SECTORSIZE; in check_sectors_in_chain()
397 block * nftl->EraseSize + i * SECTORSIZE, in check_sectors_in_chain()
408 check_free_sectors(nftl, block * nftl->EraseSize + i * SECTORSIZE, in check_sectors_in_chain()
418 nftl->EraseSize + in check_sectors_in_chain()
429 block = nftl->ReplUnitTable[block]; in check_sectors_in_chain()
430 if (!(block == BLOCK_NIL || block < nftl->nb_blocks)) in check_sectors_in_chain()
432 if (block == BLOCK_NIL || block >= nftl->nb_blocks) in check_sectors_in_chain()
438 static int calc_chain_length(struct NFTLrecord *nftl, unsigned int first_block) in calc_chain_length() argument
446 if (length >= nftl->nb_blocks) { in calc_chain_length()
451 block = nftl->ReplUnitTable[block]; in calc_chain_length()
452 if (!(block == BLOCK_NIL || block < nftl->nb_blocks)) in calc_chain_length()
454 if (block == BLOCK_NIL || block >= nftl->nb_blocks) in calc_chain_length()
470 static void format_chain(struct NFTLrecord *nftl, unsigned int first_block) in format_chain() argument
477 block1 = nftl->ReplUnitTable[block]; in format_chain()
480 if (NFTL_formatblock(nftl, block) < 0) { in format_chain()
482 nftl->ReplUnitTable[block] = BLOCK_RESERVED; in format_chain()
484 nftl->ReplUnitTable[block] = BLOCK_FREE; in format_chain()
490 if (!(block == BLOCK_NIL || block < nftl->nb_blocks)) in format_chain()
492 if (block == BLOCK_NIL || block >= nftl->nb_blocks) in format_chain()
503 static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) in check_and_mark_free_block() argument
505 struct mtd_info *mtd = nftl->mbd.mtd; in check_and_mark_free_block()
511 if (nftl_read_oob(mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, in check_and_mark_free_block()
519 if (check_free_sectors (nftl, block * nftl->EraseSize, nftl->EraseSize, 1) != 0) in check_and_mark_free_block()
527 block * nftl->EraseSize + SECTORSIZE + 8, 8, in check_and_mark_free_block()
533 for (i = 0; i < nftl->EraseSize; i += SECTORSIZE) { in check_and_mark_free_block()
535 if (check_free_sectors (nftl, block * nftl->EraseSize + i, in check_and_mark_free_block()
539 if (nftl_read_oob(mtd, block * nftl->EraseSize + i, in check_and_mark_free_block()
564 static int get_fold_mark(struct NFTLrecord *nftl, unsigned int block) in get_fold_mark() argument
566 struct mtd_info *mtd = nftl->mbd.mtd; in get_fold_mark()
570 if (nftl_read_oob(mtd, block * nftl->EraseSize + 2 * SECTORSIZE + 8, in get_fold_mark()