inftl 37 drivers/mtd/inftlcore.c struct INFTLrecord *inftl; inftl 55 drivers/mtd/inftlcore.c inftl = kzalloc(sizeof(*inftl), GFP_KERNEL); inftl 57 drivers/mtd/inftlcore.c if (!inftl) inftl 60 drivers/mtd/inftlcore.c inftl->mbd.mtd = mtd; inftl 61 drivers/mtd/inftlcore.c inftl->mbd.devnum = -1; inftl 63 drivers/mtd/inftlcore.c inftl->mbd.tr = tr; inftl 65 drivers/mtd/inftlcore.c if (INFTL_mount(inftl) < 0) { inftl 67 drivers/mtd/inftlcore.c kfree(inftl); inftl 74 drivers/mtd/inftlcore.c inftl->cylinders = 1024; inftl 75 drivers/mtd/inftlcore.c inftl->heads = 16; inftl 77 drivers/mtd/inftlcore.c temp = inftl->cylinders * inftl->heads; inftl 78 drivers/mtd/inftlcore.c inftl->sectors = inftl->mbd.size / temp; inftl 79 drivers/mtd/inftlcore.c if (inftl->mbd.size % temp) { inftl 80 drivers/mtd/inftlcore.c inftl->sectors++; inftl 81 drivers/mtd/inftlcore.c temp = inftl->cylinders * inftl->sectors; inftl 82 drivers/mtd/inftlcore.c inftl->heads = inftl->mbd.size / temp; inftl 84 drivers/mtd/inftlcore.c if (inftl->mbd.size % temp) { inftl 85 drivers/mtd/inftlcore.c inftl->heads++; inftl 86 drivers/mtd/inftlcore.c temp = inftl->heads * inftl->sectors; inftl 87 drivers/mtd/inftlcore.c inftl->cylinders = inftl->mbd.size / temp; inftl 91 drivers/mtd/inftlcore.c if (inftl->mbd.size != inftl->heads * inftl->cylinders * inftl->sectors) { inftl 97 drivers/mtd/inftlcore.c "match size of 0x%lx.\n", inftl->mbd.size); inftl 100 drivers/mtd/inftlcore.c inftl->cylinders, inftl->heads , inftl->sectors, inftl 101 drivers/mtd/inftlcore.c (long)inftl->cylinders * (long)inftl->heads * inftl 102 drivers/mtd/inftlcore.c (long)inftl->sectors ); inftl 105 drivers/mtd/inftlcore.c if (add_mtd_blktrans_dev(&inftl->mbd)) { inftl 106 drivers/mtd/inftlcore.c kfree(inftl->PUtable); inftl 107 drivers/mtd/inftlcore.c kfree(inftl->VUtable); inftl 108 drivers/mtd/inftlcore.c kfree(inftl); inftl 112 drivers/mtd/inftlcore.c printk(KERN_INFO "INFTL: Found new inftl%c\n", inftl->mbd.devnum + 'a'); inftl 119 drivers/mtd/inftlcore.c struct INFTLrecord *inftl = (void *)dev; inftl 125 drivers/mtd/inftlcore.c kfree(inftl->PUtable); inftl 126 drivers/mtd/inftlcore.c kfree(inftl->VUtable); inftl 198 drivers/mtd/inftlcore.c static u16 INFTL_findfreeblock(struct INFTLrecord *inftl, int desperate) inftl 200 drivers/mtd/inftlcore.c u16 pot = inftl->LastFreeEUN; inftl 201 drivers/mtd/inftlcore.c int silly = inftl->nb_blocks; inftl 204 drivers/mtd/inftlcore.c inftl, desperate); inftl 210 drivers/mtd/inftlcore.c if (!desperate && inftl->numfreeEUNs < 2) { inftl 212 drivers/mtd/inftlcore.c inftl->numfreeEUNs); inftl 218 drivers/mtd/inftlcore.c if (inftl->PUtable[pot] == BLOCK_FREE) { inftl 219 drivers/mtd/inftlcore.c inftl->LastFreeEUN = pot; inftl 223 drivers/mtd/inftlcore.c if (++pot > inftl->lastEUN) inftl 228 drivers/mtd/inftlcore.c "EUN range = %d - %d\n", 0, inftl->LastFreeEUN); inftl 231 drivers/mtd/inftlcore.c } while (pot != inftl->LastFreeEUN); inftl 236 drivers/mtd/inftlcore.c static u16 INFTL_foldchain(struct INFTLrecord *inftl, unsigned thisVUC, unsigned pendingblock) inftl 241 drivers/mtd/inftlcore.c struct mtd_info *mtd = inftl->mbd.mtd; inftl 248 drivers/mtd/inftlcore.c inftl, thisVUC, pendingblock); inftl 253 drivers/mtd/inftlcore.c thisEUN = targetEUN = inftl->VUtable[thisVUC]; inftl 266 drivers/mtd/inftlcore.c while (thisEUN < inftl->nb_blocks) { inftl 267 drivers/mtd/inftlcore.c for (block = 0; block < inftl->EraseSize/SECTORSIZE; block ++) { inftl 272 drivers/mtd/inftlcore.c if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) inftl 303 drivers/mtd/inftlcore.c thisEUN = inftl->PUtable[thisEUN]; inftl 313 drivers/mtd/inftlcore.c for (block = 0; block < inftl->EraseSize/SECTORSIZE ; block++) { inftl 322 drivers/mtd/inftlcore.c (thisVUC * (inftl->EraseSize / SECTORSIZE) + block))) { inftl 334 drivers/mtd/inftlcore.c (inftl->EraseSize * BlockMap[block]) + (block * SECTORSIZE), inftl 340 drivers/mtd/inftlcore.c (inftl->EraseSize * BlockMap[block]) + (block * SECTORSIZE), inftl 350 drivers/mtd/inftlcore.c inftl_write(inftl->mbd.mtd, (inftl->EraseSize * targetEUN) + inftl 365 drivers/mtd/inftlcore.c thisEUN = inftl->VUtable[thisVUC]; inftl 367 drivers/mtd/inftlcore.c while (inftl->PUtable[thisEUN] != BLOCK_NIL) { inftl 369 drivers/mtd/inftlcore.c thisEUN = inftl->PUtable[thisEUN]; inftl 377 drivers/mtd/inftlcore.c inftl->PUtable[prevEUN] = BLOCK_NIL; inftl 380 drivers/mtd/inftlcore.c if (INFTL_formatblock(inftl, thisEUN) < 0) { inftl 384 drivers/mtd/inftlcore.c inftl->PUtable[thisEUN] = BLOCK_RESERVED; inftl 387 drivers/mtd/inftlcore.c inftl->PUtable[thisEUN] = BLOCK_FREE; inftl 388 drivers/mtd/inftlcore.c inftl->numfreeEUNs++; inftl 395 drivers/mtd/inftlcore.c static u16 INFTL_makefreeblock(struct INFTLrecord *inftl, unsigned pendingblock) inftl 410 drivers/mtd/inftlcore.c "pending=%d)\n", inftl, pendingblock); inftl 412 drivers/mtd/inftlcore.c for (chain = 0; chain < inftl->nb_blocks; chain++) { inftl 413 drivers/mtd/inftlcore.c EUN = inftl->VUtable[chain]; inftl 416 drivers/mtd/inftlcore.c while (EUN <= inftl->lastEUN) { inftl 418 drivers/mtd/inftlcore.c EUN = inftl->PUtable[EUN]; inftl 444 drivers/mtd/inftlcore.c return INFTL_foldchain(inftl, LongestChain, pendingblock); inftl 460 drivers/mtd/inftlcore.c static inline u16 INFTL_findwriteunit(struct INFTLrecord *inftl, unsigned block) inftl 462 drivers/mtd/inftlcore.c unsigned int thisVUC = block / (inftl->EraseSize / SECTORSIZE); inftl 464 drivers/mtd/inftlcore.c unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize -1); inftl 465 drivers/mtd/inftlcore.c struct mtd_info *mtd = inftl->mbd.mtd; inftl 473 drivers/mtd/inftlcore.c inftl, block); inftl 481 drivers/mtd/inftlcore.c thisEUN = inftl->VUtable[thisVUC]; inftl 484 drivers/mtd/inftlcore.c while (thisEUN <= inftl->lastEUN) { inftl 485 drivers/mtd/inftlcore.c inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + inftl 517 drivers/mtd/inftlcore.c thisEUN = inftl->PUtable[thisEUN]; inftl 529 drivers/mtd/inftlcore.c writeEUN = INFTL_findfreeblock(inftl, 0); inftl 537 drivers/mtd/inftlcore.c thisEUN = INFTL_makefreeblock(inftl, block); inftl 546 drivers/mtd/inftlcore.c writeEUN = INFTL_findfreeblock(inftl, 1); inftl 558 drivers/mtd/inftlcore.c INFTL_dumptables(inftl); inftl 559 drivers/mtd/inftlcore.c INFTL_dumpVUchains(inftl); inftl 571 drivers/mtd/inftlcore.c thisEUN = inftl->VUtable[thisVUC]; inftl 573 drivers/mtd/inftlcore.c inftl_read_oob(mtd, thisEUN * inftl->EraseSize inftl 579 drivers/mtd/inftlcore.c prev_block = inftl->VUtable[thisVUC]; inftl 580 drivers/mtd/inftlcore.c if (prev_block < inftl->nb_blocks) inftl 581 drivers/mtd/inftlcore.c prev_block -= inftl->firstEUN; inftl 595 drivers/mtd/inftlcore.c inftl_write_oob(mtd, writeEUN * inftl->EraseSize + 8, 8, inftl 606 drivers/mtd/inftlcore.c inftl_write_oob(mtd, writeEUN * inftl->EraseSize + inftl 609 drivers/mtd/inftlcore.c inftl->PUtable[writeEUN] = inftl->VUtable[thisVUC]; inftl 610 drivers/mtd/inftlcore.c inftl->VUtable[thisVUC] = writeEUN; inftl 612 drivers/mtd/inftlcore.c inftl->numfreeEUNs--; inftl 625 drivers/mtd/inftlcore.c static void INFTL_trydeletechain(struct INFTLrecord *inftl, unsigned thisVUC) inftl 627 drivers/mtd/inftlcore.c struct mtd_info *mtd = inftl->mbd.mtd; inftl 636 drivers/mtd/inftlcore.c "thisVUC=%d)\n", inftl, thisVUC); inftl 641 drivers/mtd/inftlcore.c thisEUN = inftl->VUtable[thisVUC]; inftl 653 drivers/mtd/inftlcore.c while (thisEUN < inftl->nb_blocks) { inftl 654 drivers/mtd/inftlcore.c for (block = 0; block < inftl->EraseSize/SECTORSIZE; block++) { inftl 658 drivers/mtd/inftlcore.c if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) inftl 688 drivers/mtd/inftlcore.c thisEUN = inftl->PUtable[thisEUN]; inftl 691 drivers/mtd/inftlcore.c for (block = 0; block < inftl->EraseSize/SECTORSIZE; block++) inftl 702 drivers/mtd/inftlcore.c u16 *prevEUN = &inftl->VUtable[thisVUC]; inftl 712 drivers/mtd/inftlcore.c while (inftl->PUtable[thisEUN] != BLOCK_NIL) { inftl 713 drivers/mtd/inftlcore.c BUG_ON(thisEUN >= inftl->nb_blocks); inftl 715 drivers/mtd/inftlcore.c prevEUN = &inftl->PUtable[thisEUN]; inftl 722 drivers/mtd/inftlcore.c if (INFTL_formatblock(inftl, thisEUN) < 0) { inftl 726 drivers/mtd/inftlcore.c inftl->PUtable[thisEUN] = BLOCK_RESERVED; inftl 729 drivers/mtd/inftlcore.c inftl->PUtable[thisEUN] = BLOCK_FREE; inftl 730 drivers/mtd/inftlcore.c inftl->numfreeEUNs++; inftl 742 drivers/mtd/inftlcore.c inftl->VUtable[thisVUC] = BLOCK_NIL; inftl 745 drivers/mtd/inftlcore.c static int INFTL_deleteblock(struct INFTLrecord *inftl, unsigned block) inftl 747 drivers/mtd/inftlcore.c unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; inftl 748 drivers/mtd/inftlcore.c unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); inftl 749 drivers/mtd/inftlcore.c struct mtd_info *mtd = inftl->mbd.mtd; inftl 756 drivers/mtd/inftlcore.c "block=%d)\n", inftl, block); inftl 758 drivers/mtd/inftlcore.c while (thisEUN < inftl->nb_blocks) { inftl 759 drivers/mtd/inftlcore.c if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + inftl 784 drivers/mtd/inftlcore.c block / (inftl->EraseSize / SECTORSIZE)); inftl 787 drivers/mtd/inftlcore.c thisEUN = inftl->PUtable[thisEUN]; inftl 792 drivers/mtd/inftlcore.c loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; inftl 799 drivers/mtd/inftlcore.c INFTL_trydeletechain(inftl, block / (inftl->EraseSize / SECTORSIZE)); inftl 807 drivers/mtd/inftlcore.c struct INFTLrecord *inftl = (void *)mbd; inftl 809 drivers/mtd/inftlcore.c unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); inftl 815 drivers/mtd/inftlcore.c "buffer=%p)\n", inftl, block, buffer); inftl 823 drivers/mtd/inftlcore.c writeEUN = INFTL_findwriteunit(inftl, block); inftl 838 drivers/mtd/inftlcore.c inftl_write(inftl->mbd.mtd, (writeEUN * inftl->EraseSize) + inftl 846 drivers/mtd/inftlcore.c INFTL_deleteblock(inftl, block); inftl 855 drivers/mtd/inftlcore.c struct INFTLrecord *inftl = (void *)mbd; inftl 856 drivers/mtd/inftlcore.c unsigned int thisEUN = inftl->VUtable[block / (inftl->EraseSize / SECTORSIZE)]; inftl 857 drivers/mtd/inftlcore.c unsigned long blockofs = (block * SECTORSIZE) & (inftl->EraseSize - 1); inftl 858 drivers/mtd/inftlcore.c struct mtd_info *mtd = inftl->mbd.mtd; inftl 865 drivers/mtd/inftlcore.c "buffer=%p)\n", inftl, block, buffer); inftl 867 drivers/mtd/inftlcore.c while (thisEUN < inftl->nb_blocks) { inftl 868 drivers/mtd/inftlcore.c if (inftl_read_oob(mtd, (thisEUN * inftl->EraseSize) + inftl 893 drivers/mtd/inftlcore.c block / (inftl->EraseSize / SECTORSIZE)); inftl 897 drivers/mtd/inftlcore.c thisEUN = inftl->PUtable[thisEUN]; inftl 906 drivers/mtd/inftlcore.c loff_t ptr = (thisEUN * inftl->EraseSize) + blockofs; inftl 918 drivers/mtd/inftlcore.c struct INFTLrecord *inftl = (void *)dev; inftl 920 drivers/mtd/inftlcore.c geo->heads = inftl->heads; inftl 921 drivers/mtd/inftlcore.c geo->sectors = inftl->sectors; inftl 922 drivers/mtd/inftlcore.c geo->cylinders = inftl->cylinders; inftl 31 drivers/mtd/inftlmount.c static int find_boot_record(struct INFTLrecord *inftl) inftl 37 drivers/mtd/inftlmount.c struct INFTLMediaHeader *mh = &inftl->MediaHdr; inftl 38 drivers/mtd/inftlmount.c struct mtd_info *mtd = inftl->mbd.mtd; inftl 42 drivers/mtd/inftlmount.c pr_debug("INFTL: find_boot_record(inftl=%p)\n", inftl); inftl 49 drivers/mtd/inftlmount.c inftl->EraseSize = inftl->mbd.mtd->erasesize; inftl 50 drivers/mtd/inftlmount.c inftl->nb_blocks = (u32)inftl->mbd.mtd->size / inftl->EraseSize; inftl 52 drivers/mtd/inftlmount.c inftl->MediaUnit = BLOCK_NIL; inftl 55 drivers/mtd/inftlmount.c for (block = 0; block < inftl->nb_blocks; block++) { inftl 62 drivers/mtd/inftlmount.c ret = mtd_read(mtd, block * inftl->EraseSize, SECTORSIZE, inftl 72 drivers/mtd/inftlmount.c block * inftl->EraseSize, inftl 73 drivers/mtd/inftlmount.c inftl->mbd.mtd->index, ret); inftl 89 drivers/mtd/inftlmount.c block * inftl->EraseSize + SECTORSIZE + 8, inftl 94 drivers/mtd/inftlmount.c "(err %d)\n", block * inftl->EraseSize, inftl 95 drivers/mtd/inftlmount.c inftl->mbd.mtd->index, ret); inftl 107 drivers/mtd/inftlmount.c mtd_read(mtd, block * inftl->EraseSize + 4096, SECTORSIZE, inftl 169 drivers/mtd/inftlmount.c inftl->EraseSize = inftl->mbd.mtd->erasesize << inftl 171 drivers/mtd/inftlmount.c inftl->nb_blocks = (u32)inftl->mbd.mtd->size / inftl->EraseSize; inftl 196 drivers/mtd/inftlmount.c struct erase_info *instr = &inftl->instr; inftl 205 drivers/mtd/inftlmount.c instr->addr = ip->Reserved0 * inftl->EraseSize; inftl 206 drivers/mtd/inftlmount.c instr->len = inftl->EraseSize; inftl 236 drivers/mtd/inftlmount.c inftl->nb_boot_blocks = ip->firstUnit; inftl 237 drivers/mtd/inftlmount.c inftl->numvunits = ip->virtualUnits; inftl 238 drivers/mtd/inftlmount.c if (inftl->numvunits > (inftl->nb_blocks - inftl 239 drivers/mtd/inftlmount.c inftl->nb_boot_blocks - 2)) { inftl 243 drivers/mtd/inftlmount.c inftl->numvunits, inftl->nb_blocks, inftl 244 drivers/mtd/inftlmount.c inftl->nb_boot_blocks); inftl 248 drivers/mtd/inftlmount.c inftl->mbd.size = inftl->numvunits * inftl 249 drivers/mtd/inftlmount.c (inftl->EraseSize / SECTORSIZE); inftl 255 drivers/mtd/inftlmount.c inftl->firstEUN = ip->firstUnit; inftl 256 drivers/mtd/inftlmount.c inftl->lastEUN = ip->lastUnit; inftl 257 drivers/mtd/inftlmount.c inftl->nb_blocks = ip->lastUnit + 1; inftl 260 drivers/mtd/inftlmount.c inftl->PUtable = kmalloc_array(inftl->nb_blocks, sizeof(u16), inftl 262 drivers/mtd/inftlmount.c if (!inftl->PUtable) { inftl 265 drivers/mtd/inftlmount.c inftl->nb_blocks * sizeof(u16)); inftl 269 drivers/mtd/inftlmount.c inftl->VUtable = kmalloc_array(inftl->nb_blocks, sizeof(u16), inftl 271 drivers/mtd/inftlmount.c if (!inftl->VUtable) { inftl 272 drivers/mtd/inftlmount.c kfree(inftl->PUtable); inftl 275 drivers/mtd/inftlmount.c inftl->nb_blocks * sizeof(u16)); inftl 280 drivers/mtd/inftlmount.c for (i = 0; i < inftl->nb_boot_blocks; i++) inftl 281 drivers/mtd/inftlmount.c inftl->PUtable[i] = BLOCK_RESERVED; inftl 283 drivers/mtd/inftlmount.c for (; i < inftl->nb_blocks; i++) inftl 284 drivers/mtd/inftlmount.c inftl->PUtable[i] = BLOCK_NOTEXPLORED; inftl 287 drivers/mtd/inftlmount.c inftl->PUtable[block] = BLOCK_RESERVED; inftl 290 drivers/mtd/inftlmount.c for (i = 0; i < inftl->nb_blocks; i++) { inftl 294 drivers/mtd/inftlmount.c for (physblock = 0; physblock < inftl->EraseSize; physblock += inftl->mbd.mtd->erasesize) { inftl 295 drivers/mtd/inftlmount.c if (mtd_block_isbad(inftl->mbd.mtd, inftl 296 drivers/mtd/inftlmount.c i * inftl->EraseSize + physblock)) inftl 297 drivers/mtd/inftlmount.c inftl->PUtable[i] = BLOCK_RESERVED; inftl 301 drivers/mtd/inftlmount.c inftl->MediaUnit = block; inftl 323 drivers/mtd/inftlmount.c static int check_free_sectors(struct INFTLrecord *inftl, unsigned int address, inftl 326 drivers/mtd/inftlmount.c struct mtd_info *mtd = inftl->mbd.mtd; inftl 368 drivers/mtd/inftlmount.c int INFTL_formatblock(struct INFTLrecord *inftl, int block) inftl 372 drivers/mtd/inftlmount.c struct erase_info *instr = &inftl->instr; inftl 373 drivers/mtd/inftlmount.c struct mtd_info *mtd = inftl->mbd.mtd; inftl 376 drivers/mtd/inftlmount.c pr_debug("INFTL: INFTL_formatblock(inftl=%p,block=%d)\n", inftl, block); inftl 384 drivers/mtd/inftlmount.c instr->addr = block * inftl->EraseSize; inftl 385 drivers/mtd/inftlmount.c instr->len = inftl->mbd.mtd->erasesize; inftl 389 drivers/mtd/inftlmount.c for (physblock = 0; physblock < inftl->EraseSize; inftl 393 drivers/mtd/inftlmount.c ret = mtd_erase(inftl->mbd.mtd, instr); inftl 405 drivers/mtd/inftlmount.c if (check_free_sectors(inftl, instr->addr, instr->len, 1) != 0) inftl 415 drivers/mtd/inftlmount.c instr->addr = block * inftl->EraseSize + SECTORSIZE * 2; inftl 422 drivers/mtd/inftlmount.c mtd_block_markbad(inftl->mbd.mtd, instr->addr); inftl 434 drivers/mtd/inftlmount.c static void format_chain(struct INFTLrecord *inftl, unsigned int first_block) inftl 442 drivers/mtd/inftlmount.c block1 = inftl->PUtable[block]; inftl 445 drivers/mtd/inftlmount.c if (INFTL_formatblock(inftl, block) < 0) { inftl 449 drivers/mtd/inftlmount.c inftl->PUtable[block] = BLOCK_RESERVED; inftl 451 drivers/mtd/inftlmount.c inftl->PUtable[block] = BLOCK_FREE; inftl 457 drivers/mtd/inftlmount.c if (block == BLOCK_NIL || block >= inftl->lastEUN)