in core/ms_block.c [1192:1253]
static int msb_read_boot_blocks(struct msb_data *msb)
{
int pba = 0;
struct scatterlist sg;
struct ms_extra_data_register extra;
struct ms_boot_page *page;
msb->boot_block_locations[0] = MS_BLOCK_INVALID;
msb->boot_block_locations[1] = MS_BLOCK_INVALID;
msb->boot_block_count = 0;
dbg_verbose("Start of a scan for the boot blocks");
if (!msb->boot_page) {
page = kmalloc_array(2, sizeof(struct ms_boot_page),
GFP_KERNEL);
if (!page)
return -ENOMEM;
msb->boot_page = page;
} else
page = msb->boot_page;
msb->block_count = MS_BLOCK_MAX_BOOT_ADDR;
for (pba = 0; pba < MS_BLOCK_MAX_BOOT_ADDR; pba++) {
sg_init_one(&sg, page, sizeof(*page));
if (msb_read_page(msb, pba, 0, &extra, &sg, 0)) {
dbg("boot scan: can't read pba %d", pba);
continue;
}
if (extra.management_flag & MEMSTICK_MANAGEMENT_SYSFLG) {
dbg("management flag doesn't indicate boot block %d",
pba);
continue;
}
if (be16_to_cpu(page->header.block_id) != MS_BLOCK_BOOT_ID) {
dbg("the pba at %d doesn't contain boot block ID", pba);
continue;
}
msb_fix_boot_page_endianness(page);
msb->boot_block_locations[msb->boot_block_count] = pba;
page++;
msb->boot_block_count++;
if (msb->boot_block_count == 2)
break;
}
if (!msb->boot_block_count) {
pr_err("media doesn't contain master page, aborting");
return -EIO;
}
dbg_verbose("End of scan for boot blocks");
return 0;
}