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()
137 nftl->MediaUnit * nftl->EraseSize, block * nftl->EraseSize); in find_boot_record()
146 nftl->SpareMediaUnit = block; in find_boot_record()
149 nftl->ReplUnitTable[block] = BLOCK_RESERVED; in find_boot_record()
173 nftl->EraseSize = nftl->mbd.mtd->erasesize << (0xff - mh->UnitSizeFactor); in find_boot_record()
174 nftl->nb_blocks = (u32)nftl->mbd.mtd->size / nftl->EraseSize; in find_boot_record()
177 nftl->nb_boot_blocks = le16_to_cpu(mh->FirstPhysicalEUN); in find_boot_record()
178 if ((nftl->nb_boot_blocks + 2) >= nftl->nb_blocks) { in find_boot_record()
181 nftl->nb_boot_blocks, nftl->nb_blocks); in find_boot_record()
185 nftl->numvunits = le32_to_cpu(mh->FormattedSize) / nftl->EraseSize; in find_boot_record()
186 if (nftl->numvunits > (nftl->nb_blocks - nftl->nb_boot_blocks - 2)) { in find_boot_record()
189 nftl->numvunits, nftl->nb_blocks, nftl->nb_boot_blocks); in find_boot_record()
193 nftl->mbd.size = nftl->numvunits * (nftl->EraseSize / SECTORSIZE); in find_boot_record()
197 nftl->nb_blocks = le16_to_cpu(mh->NumEraseUnits) + le16_to_cpu(mh->FirstPhysicalEUN); in find_boot_record()
200 nftl->lastEUN = nftl->nb_blocks - 1; in find_boot_record()
203 nftl->EUNtable = kmalloc(nftl->nb_blocks * sizeof(u16), GFP_KERNEL); in find_boot_record()
204 if (!nftl->EUNtable) { in find_boot_record()
209 nftl->ReplUnitTable = kmalloc(nftl->nb_blocks * sizeof(u16), GFP_KERNEL); in find_boot_record()
210 if (!nftl->ReplUnitTable) { in find_boot_record()
211 kfree(nftl->EUNtable); in find_boot_record()
217 for (i = 0; i < nftl->nb_boot_blocks; i++) in find_boot_record()
218 nftl->ReplUnitTable[i] = BLOCK_RESERVED; in find_boot_record()
220 for (; i < nftl->nb_blocks; i++) { in find_boot_record()
221 nftl->ReplUnitTable[i] = BLOCK_NOTEXPLORED; in find_boot_record()
225 nftl->ReplUnitTable[block] = BLOCK_RESERVED; in find_boot_record()
228 for (i = 0; i < nftl->nb_blocks; i++) { in find_boot_record()
233 ret = mtd->read(nftl->mbd.mtd, in find_boot_record()
234 block * nftl->EraseSize + i + in find_boot_record()
240 kfree(nftl->ReplUnitTable); in find_boot_record()
241 kfree(nftl->EUNtable); in find_boot_record()
247 nftl->ReplUnitTable[i] = BLOCK_RESERVED; in find_boot_record()
249 if (mtd_block_isbad(nftl->mbd.mtd, in find_boot_record()
250 i * nftl->EraseSize)) in find_boot_record()
251 nftl->ReplUnitTable[i] = BLOCK_RESERVED; in find_boot_record()
254 nftl->MediaUnit = block; in find_boot_record()
273 static int check_free_sectors(struct NFTLrecord *nftl, unsigned int address, int len, in check_free_sectors() argument
276 u8 buf[SECTORSIZE + nftl->mbd.mtd->oobsize]; in check_free_sectors()
277 struct mtd_info *mtd = nftl->mbd.mtd; in check_free_sectors()
307 int NFTL_formatblock(struct NFTLrecord *nftl, int block) in NFTL_formatblock() argument
312 struct erase_info *instr = &nftl->instr; in NFTL_formatblock()
313 struct mtd_info *mtd = nftl->mbd.mtd; in NFTL_formatblock()
316 if (nftl_read_oob(mtd, block * nftl->EraseSize + SECTORSIZE + 8, in NFTL_formatblock()
331 instr->mtd = nftl->mbd.mtd; in NFTL_formatblock()
332 instr->addr = block * nftl->EraseSize; in NFTL_formatblock()
333 instr->len = nftl->EraseSize; in NFTL_formatblock()
352 if (check_free_sectors(nftl, instr->addr, nftl->EraseSize, 1) != 0) in NFTL_formatblock()
356 if (nftl_write_oob(mtd, block * nftl->EraseSize + SECTORSIZE + in NFTL_formatblock()
363 mtd_block_markbad(nftl->mbd.mtd, instr->addr); in NFTL_formatblock()
376 static void check_sectors_in_chain(struct NFTLrecord *nftl, unsigned int first_block) in check_sectors_in_chain() argument
378 struct mtd_info *mtd = nftl->mbd.mtd; in check_sectors_in_chain()
384 sectors_per_block = nftl->EraseSize / SECTORSIZE; in check_sectors_in_chain()
389 block * nftl->EraseSize + i * SECTORSIZE, in check_sectors_in_chain()
400 check_free_sectors(nftl, block * nftl->EraseSize + i * SECTORSIZE, in check_sectors_in_chain()
410 nftl->EraseSize + in check_sectors_in_chain()
421 block = nftl->ReplUnitTable[block]; in check_sectors_in_chain()
422 if (!(block == BLOCK_NIL || block < nftl->nb_blocks)) in check_sectors_in_chain()
424 if (block == BLOCK_NIL || block >= nftl->nb_blocks) in check_sectors_in_chain()
430 static int calc_chain_length(struct NFTLrecord *nftl, unsigned int first_block) in calc_chain_length() argument
438 if (length >= nftl->nb_blocks) { in calc_chain_length()
443 block = nftl->ReplUnitTable[block]; in calc_chain_length()
444 if (!(block == BLOCK_NIL || block < nftl->nb_blocks)) in calc_chain_length()
446 if (block == BLOCK_NIL || block >= nftl->nb_blocks) in calc_chain_length()
462 static void format_chain(struct NFTLrecord *nftl, unsigned int first_block) in format_chain() argument
469 block1 = nftl->ReplUnitTable[block]; in format_chain()
472 if (NFTL_formatblock(nftl, block) < 0) { in format_chain()
474 nftl->ReplUnitTable[block] = BLOCK_RESERVED; in format_chain()
476 nftl->ReplUnitTable[block] = BLOCK_FREE; in format_chain()
482 if (!(block == BLOCK_NIL || block < nftl->nb_blocks)) in format_chain()
484 if (block == BLOCK_NIL || block >= nftl->nb_blocks) in format_chain()
495 static int check_and_mark_free_block(struct NFTLrecord *nftl, int block) in check_and_mark_free_block() argument
497 struct mtd_info *mtd = nftl->mbd.mtd; in check_and_mark_free_block()
503 if (nftl_read_oob(mtd, block * nftl->EraseSize + SECTORSIZE + 8, 8, in check_and_mark_free_block()
511 if (check_free_sectors (nftl, block * nftl->EraseSize, nftl->EraseSize, 1) != 0) in check_and_mark_free_block()
519 block * nftl->EraseSize + SECTORSIZE + 8, 8, in check_and_mark_free_block()
525 for (i = 0; i < nftl->EraseSize; i += SECTORSIZE) { in check_and_mark_free_block()
527 if (check_free_sectors (nftl, block * nftl->EraseSize + i, in check_and_mark_free_block()
531 if (nftl_read_oob(mtd, block * nftl->EraseSize + i, in check_and_mark_free_block()
556 static int get_fold_mark(struct NFTLrecord *nftl, unsigned int block) in get_fold_mark() argument
558 struct mtd_info *mtd = nftl->mbd.mtd; in get_fold_mark()
562 if (nftl_read_oob(mtd, block * nftl->EraseSize + 2 * SECTORSIZE + 8, in get_fold_mark()