Lines Matching refs:pba
145 static int msb_get_zone_from_pba(int pba) in msb_get_zone_from_pba() argument
147 return pba / MS_BLOCKS_IN_ZONE; in msb_get_zone_from_pba()
172 static void msb_mark_block_used(struct msb_data *msb, int pba) in msb_mark_block_used() argument
174 int zone = msb_get_zone_from_pba(pba); in msb_mark_block_used()
176 if (test_bit(pba, msb->used_blocks_bitmap)) { in msb_mark_block_used()
178 "BUG: attempt to mark already used pba %d as used", pba); in msb_mark_block_used()
187 __set_bit(pba, msb->used_blocks_bitmap); in msb_mark_block_used()
192 static void msb_mark_block_unused(struct msb_data *msb, int pba) in msb_mark_block_unused() argument
194 int zone = msb_get_zone_from_pba(pba); in msb_mark_block_unused()
196 if (!test_bit(pba, msb->used_blocks_bitmap)) { in msb_mark_block_unused()
197 pr_err("BUG: attempt to mark already unused pba %d as unused" , pba); in msb_mark_block_unused()
206 __clear_bit(pba, msb->used_blocks_bitmap); in msb_mark_block_unused()
791 u16 pba, u8 page, u8 flag) in msb_set_overwrite_flag() argument
796 msb->regs.param.block_address = cpu_to_be16(pba); in msb_set_overwrite_flag()
804 flag, pba, page); in msb_set_overwrite_flag()
808 static int msb_mark_bad(struct msb_data *msb, int pba) in msb_mark_bad() argument
810 pr_notice("marking pba %d as bad", pba); in msb_mark_bad()
813 msb, pba, 0, 0xFF & ~MEMSTICK_OVERWRITE_BKST); in msb_mark_bad()
816 static int msb_mark_page_bad(struct msb_data *msb, int pba, int page) in msb_mark_page_bad() argument
818 dbg("marking page %d of pba %d as bad", page, pba); in msb_mark_page_bad()
821 pba, page, ~MEMSTICK_OVERWRITE_PGST0); in msb_mark_page_bad()
825 static int msb_erase_block(struct msb_data *msb, u16 pba) in msb_erase_block() argument
831 dbg_verbose("erasing pba %d", pba); in msb_erase_block()
834 msb->regs.param.block_address = cpu_to_be16(pba); in msb_erase_block()
847 pr_err("erase failed, marking pba %d as bad", pba); in msb_erase_block()
848 msb_mark_bad(msb, pba); in msb_erase_block()
851 dbg_verbose("erase success, marking pba %d as unused", pba); in msb_erase_block()
852 msb_mark_block_unused(msb, pba); in msb_erase_block()
853 __set_bit(pba, msb->erased_blocks_bitmap); in msb_erase_block()
859 u16 pba, u8 page, struct ms_extra_data_register *extra, in msb_read_page() argument
864 if (pba == MS_BLOCK_INVALID) { in msb_read_page()
901 if (pba >= msb->block_count) { in msb_read_page()
902 pr_err("BUG: attempt to read beyond the end of the card at pba %d", pba); in msb_read_page()
907 msb->regs.param.block_address = cpu_to_be16(pba); in msb_read_page()
918 pba, page); in msb_read_page()
933 pba, page); in msb_read_page()
937 msb_mark_page_bad(msb, pba, page); in msb_read_page()
943 pba, page, error); in msb_read_page()
948 static int msb_read_oob(struct msb_data *msb, u16 pba, u16 page, in msb_read_oob() argument
954 msb->regs.param.block_address = cpu_to_be16(pba); in msb_read_oob()
958 if (pba > msb->block_count) { in msb_read_oob()
959 pr_err("BUG: attempt to read beyond the end of card at pba %d", pba); in msb_read_oob()
968 pba, page); in msb_read_oob()
976 static int msb_verify_block(struct msb_data *msb, u16 pba, in msb_verify_block() argument
986 error = msb_read_page(msb, pba, page, in msb_verify_block()
1001 u16 pba, u32 lba, struct scatterlist *sg, int offset) in msb_write_block() argument
1009 if (pba == MS_BLOCK_INVALID) { in msb_write_block()
1015 if (pba >= msb->block_count || lba >= msb->logical_block_count) { in msb_write_block()
1021 if (msb_get_zone_from_lba(lba) != msb_get_zone_from_pba(pba)) { in msb_write_block()
1026 if (pba == msb->boot_block_locations[0] || in msb_write_block()
1027 pba == msb->boot_block_locations[1]) { in msb_write_block()
1039 msb->regs.param.block_address = cpu_to_be16(pba); in msb_write_block()
1058 !test_bit(pba, msb->erased_blocks_bitmap))) in msb_write_block()
1059 error = msb_verify_block(msb, pba, sg, offset); in msb_write_block()
1067 pr_err("write failed, trying to erase the pba %d", pba); in msb_write_block()
1068 error = msb_erase_block(msb, pba); in msb_write_block()
1081 int pba = zone * MS_BLOCKS_IN_ZONE; in msb_get_free_block() local
1097 pba = find_next_zero_bit(msb->used_blocks_bitmap, in msb_get_free_block()
1098 msb->block_count, pba); in msb_get_free_block()
1100 pba = find_next_zero_bit(msb->used_blocks_bitmap, in msb_get_free_block()
1101 msb->block_count, pba + 1); in msb_get_free_block()
1103 dbg_verbose("result of the free blocks scan: pba %d", pba); in msb_get_free_block()
1105 if (pba == msb->block_count || (msb_get_zone_from_pba(pba)) != zone) { in msb_get_free_block()
1111 msb_mark_block_used(msb, pba); in msb_get_free_block()
1112 return pba; in msb_get_free_block()
1118 u16 pba, new_pba; in msb_update_block() local
1121 pba = msb->lba_to_pba_table[lba]; in msb_update_block()
1122 dbg_verbose("start of a block update at lba %d, pba %d", lba, pba); in msb_update_block()
1124 if (pba != MS_BLOCK_INVALID) { in msb_update_block()
1126 msb_set_overwrite_flag(msb, pba, 0, in msb_update_block()
1151 msb_erase_block(msb, pba); in msb_update_block()
1192 int pba = 0; in msb_read_boot_blocks() local
1214 for (pba = 0; pba < MS_BLOCK_MAX_BOOT_ADDR; pba++) { in msb_read_boot_blocks()
1217 if (msb_read_page(msb, pba, 0, &extra, &sg, 0)) { in msb_read_boot_blocks()
1218 dbg("boot scan: can't read pba %d", pba); in msb_read_boot_blocks()
1224 pba); in msb_read_boot_blocks()
1229 dbg("the pba at %d doesn' contain boot block ID", pba); in msb_read_boot_blocks()
1234 msb->boot_block_locations[msb->boot_block_count] = pba; in msb_read_boot_blocks()
1260 u16 pba; in msb_read_bad_block_table() local
1264 pba = msb->boot_block_locations[block_nr]; in msb_read_bad_block_table()
1282 pba, data_offset, data_size); in msb_read_bad_block_table()
1292 error = msb_read_page(msb, pba, page, NULL, &sg, offset); in msb_read_bad_block_table()
1369 u16 pba, lba, other_block; in msb_ftl_scan() local
1379 for (pba = 0; pba < msb->block_count; pba++) { in msb_ftl_scan()
1381 if (pba == msb->boot_block_locations[0] || in msb_ftl_scan()
1382 pba == msb->boot_block_locations[1]) { in msb_ftl_scan()
1383 dbg_verbose("pba %05d -> [boot block]", pba); in msb_ftl_scan()
1384 msb_mark_block_used(msb, pba); in msb_ftl_scan()
1388 if (test_bit(pba, msb->used_blocks_bitmap)) { in msb_ftl_scan()
1389 dbg_verbose("pba %05d -> [factory bad]", pba); in msb_ftl_scan()
1394 error = msb_read_oob(msb, pba, 0, &extra); in msb_ftl_scan()
1399 "oob of pba %d damaged, will try to erase it", pba); in msb_ftl_scan()
1400 msb_mark_block_used(msb, pba); in msb_ftl_scan()
1401 msb_erase_block(msb, pba); in msb_ftl_scan()
1405 error, pba); in msb_ftl_scan()
1414 overwrite_flags[pba] = overwrite_flag; in msb_ftl_scan()
1418 dbg("pba %05d -> [BAD]", pba); in msb_ftl_scan()
1419 msb_mark_block_used(msb, pba); in msb_ftl_scan()
1427 pba, managment_flag); in msb_ftl_scan()
1428 msb_mark_block_used(msb, pba); in msb_ftl_scan()
1434 dbg("pba %05d -> [temp table] - will erase", pba); in msb_ftl_scan()
1436 msb_mark_block_used(msb, pba); in msb_ftl_scan()
1437 msb_erase_block(msb, pba); in msb_ftl_scan()
1442 dbg_verbose("pba %05d -> [free]", pba); in msb_ftl_scan()
1446 msb_mark_block_used(msb, pba); in msb_ftl_scan()
1449 if (msb_get_zone_from_lba(lba) != msb_get_zone_from_pba(pba)) { in msb_ftl_scan()
1451 pba, lba); in msb_ftl_scan()
1452 msb_erase_block(msb, pba); in msb_ftl_scan()
1458 dbg_verbose("pba %05d -> [lba %05d]", pba, lba); in msb_ftl_scan()
1459 msb->lba_to_pba_table[lba] = pba; in msb_ftl_scan()
1467 pba, other_block); in msb_ftl_scan()
1470 pr_notice("pba %d is marked as stable, use it", pba); in msb_ftl_scan()
1472 msb->lba_to_pba_table[lba] = pba; in msb_ftl_scan()
1479 msb_erase_block(msb, pba); in msb_ftl_scan()
1484 pba, other_block, other_block); in msb_ftl_scan()
1487 msb->lba_to_pba_table[lba] = pba; in msb_ftl_scan()
1534 u16 pba, lba; in msb_cache_flush() local
1543 pba = msb->lba_to_pba_table[lba]; in msb_cache_flush()
1546 pba, msb->cache_block_lba); in msb_cache_flush()
1560 error = msb_read_page(msb, pba, page, &extra, &sg, offset); in msb_cache_flush()
1582 pba = msb->lba_to_pba_table[msb->cache_block_lba]; in msb_cache_flush()
1594 pba , page, 0xFF & ~MEMSTICK_OV_PG_NORMAL); in msb_cache_flush()
1646 int pba = msb->lba_to_pba_table[lba]; in msb_cache_read() local
1654 lba, pba, page); in msb_cache_read()
1664 lba, pba, page); in msb_cache_read()
1666 error = msb_read_page(msb, pba, page, NULL, sg, offset); in msb_cache_read()