Lines Matching full:block
150 * Read LBA associated with block
151 * returns -1, if block is erased
162 /* First test for erased block */ in sm_read_lba()
198 static loff_t sm_mkoffset(struct sm_ftl *ftl, int zone, int block, int boffset) in sm_mkoffset() argument
202 WARN_ON(block >= ftl->zone_size); in sm_mkoffset()
205 if (block == -1) in sm_mkoffset()
208 return (zone * SM_MAX_ZONE_SIZE + block) * ftl->block_size + boffset; in sm_mkoffset()
213 int *zone, int *block, int *boffset) in sm_break_offset() argument
216 *block = do_div(offset, ftl->max_lba); in sm_break_offset()
240 int zone, int block, int boffset, in sm_read_sector() argument
250 if (block == -1) { in sm_read_sector()
270 if (zone == 0 && block == ftl->cis_block && boffset == in sm_read_sector()
281 ret = mtd_read_oob(mtd, sm_mkoffset(ftl, zone, block, boffset), &ops); in sm_read_sector()
285 dbg("read of block %d at zone %d, failed due to error (%d)", in sm_read_sector()
286 block, zone, ret); in sm_read_sector()
303 dbg("read of block %d at zone %d, failed because it is marked" in sm_read_sector()
304 " as bad" , block, zone); in sm_read_sector()
312 dbg("read of block %d at zone %d, failed due to ECC error", in sm_read_sector()
313 block, zone); in sm_read_sector()
322 int zone, int block, int boffset, in sm_write_sector() argument
331 if (zone == 0 && (block == ftl->cis_block || block == 0)) { in sm_write_sector()
346 ret = mtd_write_oob(mtd, sm_mkoffset(ftl, zone, block, boffset), &ops); in sm_write_sector()
352 dbg("write to block %d at zone %d, failed with error %d", in sm_write_sector()
353 block, zone, ret); in sm_write_sector()
366 /* ------------------------ block IO ------------------------------------- */
368 /* Write a block using data and lba, and invalid sector bitmap */
370 int zone, int block, int lba, in sm_write_block() argument
391 sm_printk("sector %d of block at LBA %d of zone %d" in sm_write_block()
405 if (!sm_write_sector(ftl, zone, block, boffset, in sm_write_block()
411 /* If write fails. try to erase the block */ in sm_write_block()
414 This is intended to repair block that are marked in sm_write_block()
417 if (sm_erase_block(ftl, zone, block, 0)) in sm_write_block()
423 sm_mark_block_bad(ftl, zone, block); in sm_write_block()
431 /* Mark whole block at offset 'offs' as bad. */
432 static void sm_mark_block_bad(struct sm_ftl *ftl, int zone, int block) in sm_mark_block_bad() argument
446 sm_printk("marking block %d of zone %d as bad", block, zone); in sm_mark_block_bad()
452 sm_write_sector(ftl, zone, block, boffset, NULL, &oob); in sm_mark_block_bad()
456 * Erase a block within a zone
457 * If erase succeeds, it updates free block fifo, otherwise marks block as bad
459 static int sm_erase_block(struct sm_ftl *ftl, int zone_num, uint16_t block, in sm_erase_block() argument
468 erase.addr = sm_mkoffset(ftl, zone_num, block, 0); in sm_erase_block()
477 if (zone_num == 0 && (block == ftl->cis_block || block == 0)) { in sm_erase_block()
483 sm_printk("erase of block %d in zone %d failed", in sm_erase_block()
484 block, zone_num); in sm_erase_block()
492 sm_printk("erase of block %d in zone %d failed after wait", in sm_erase_block()
493 block, zone_num); in sm_erase_block()
499 (const unsigned char *)&block, sizeof(block)); in sm_erase_block()
503 sm_mark_block_bad(ftl, zone_num, block); in sm_erase_block()
513 /* Thoroughly test that block is valid. */
514 static int sm_check_block(struct sm_ftl *ftl, int zone, int block) in sm_check_block() argument
523 /* First just check that block doesn't look fishy */ in sm_check_block()
530 if (sm_read_sector(ftl, zone, block, boffset, NULL, &oob)) in sm_check_block()
543 /* If the block is sliced (partially erased usually) erase it */ in sm_check_block()
545 sm_erase_block(ftl, zone, block, 1); in sm_check_block()
693 int block, boffset; in sm_find_cis() local
697 /* Search for first valid block */ in sm_find_cis()
698 for (block = 0 ; block < ftl->zone_size - ftl->max_lba ; block++) { in sm_find_cis()
700 if (sm_read_sector(ftl, 0, block, 0, NULL, &oob)) in sm_find_cis()
712 /* Search for first valid sector in this block */ in sm_find_cis()
716 if (sm_read_sector(ftl, 0, block, boffset, NULL, &oob)) in sm_find_cis()
727 ftl->cis_block = block; in sm_find_cis()
739 dbg("CIS block found at offset %x", in sm_find_cis()
740 block * ftl->block_size + in sm_find_cis()
766 uint16_t block; in sm_init_zone() local
788 for (block = 0 ; block < ftl->zone_size ; block++) { in sm_init_zone()
791 if (zone_num == 0 && block <= ftl->cis_block) in sm_init_zone()
795 if (sm_read_sector(ftl, zone_num, block, 0, NULL, &oob)) in sm_init_zone()
798 /* Test to see if block is erased. It is enough to test in sm_init_zone()
802 (unsigned char *)&block, 2); in sm_init_zone()
806 /* If block is marked as bad, skip it */ in sm_init_zone()
808 /* However the way the block valid status is defined, ensures in sm_init_zone()
811 dbg("PH %04d <-> <marked bad>", block); in sm_init_zone()
818 /* Invalid LBA means that block is damaged. */ in sm_init_zone()
822 dbg("PH %04d <-> LBA %04d(bad)", block, lba); in sm_init_zone()
830 dbg_verbose("PH %04d <-> LBA %04d", block, lba); in sm_init_zone()
831 zone->lba_to_phys_table[lba] = block; in sm_init_zone()
837 lba, zone->lba_to_phys_table[lba], block, zone_num); in sm_init_zone()
839 /* Test that this block is valid*/ in sm_init_zone()
840 if (sm_check_block(ftl, zone_num, block)) in sm_init_zone()
843 /* Test now the old block */ in sm_init_zone()
846 zone->lba_to_phys_table[lba] = block; in sm_init_zone()
855 sm_erase_block(ftl, zone_num, block, 1); in sm_init_zone()
868 /* Randomize first block we write to */ in sm_init_zone()
874 (unsigned char *)&block, 2); in sm_init_zone()
876 kfifo_in(&zone->free_sectors, (const unsigned char *)&block, 2); in sm_init_zone()
902 /* Initialize the one block cache */
912 /* Put sector in one block cache */
952 /* Try to read all unread areas of the cache block*/ in sm_cache_flush()
968 /* we could still continue by erasing/writing the current block, in sm_cache_flush()
985 /* Write succesfull, so erase and free the old block */ in sm_cache_flush()
1020 int zone_num, block, boffset; in sm_read() local
1022 sm_break_offset(ftl, sect_no << 9, &zone_num, &block, &boffset); in sm_read()
1033 if (ftl->cache_zone == zone_num && ftl->cache_block == block) { in sm_read()
1039 /* Translate the block and return if doesn't exist in the table */ in sm_read()
1040 block = zone->lba_to_phys_table[block]; in sm_read()
1042 if (block == -1) { in sm_read()
1047 if (sm_read_sector(ftl, zone_num, block, boffset, buf, NULL)) { in sm_read()
1065 int error, zone_num, block, boffset; in sm_write() local
1068 sm_break_offset(ftl, sec_no << 9, &zone_num, &block, &boffset); in sm_write()
1081 if (ftl->cache_block != block || ftl->cache_zone != zone_num) { in sm_write()
1087 ftl->cache_block = block; in sm_write()
1208 dbg("each block consists of %d bytes", in sm_add_mtd()