X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fmtd%2Frfd_ftl.c;fp=drivers%2Fmtd%2Frfd_ftl.c;h=a3e00a4635a5392180290e6d9b41d6bfd2fb07a8;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=fa4362fb4dd8a2b7260b75ae66c0866dcb472233;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/drivers/mtd/rfd_ftl.c b/drivers/mtd/rfd_ftl.c index fa4362fb4..a3e00a463 100644 --- a/drivers/mtd/rfd_ftl.c +++ b/drivers/mtd/rfd_ftl.c @@ -3,7 +3,7 @@ * * Copyright (C) 2005 Sean Young * - * $Id: rfd_ftl.c,v 1.8 2006/01/15 12:51:44 sean Exp $ + * $Id: rfd_ftl.c,v 1.5 2005/11/07 11:14:21 gleixner Exp $ * * This type of flash translation layer (FTL) is used by the Embedded BIOS * by General Software. It is known as the Resident Flash Disk (RFD), see: @@ -61,7 +61,6 @@ struct block { BLOCK_OK, BLOCK_ERASING, BLOCK_ERASED, - BLOCK_UNUSED, BLOCK_FAILED } state; int free_sectors; @@ -100,8 +99,10 @@ static int build_block_map(struct partition *part, int block_no) block->offset = part->block_size * block_no; if (le16_to_cpu(part->header_cache[0]) != RFD_MAGIC) { - block->state = BLOCK_UNUSED; - return -ENOENT; + block->state = BLOCK_ERASED; /* assumption */ + block->free_sectors = part->data_sectors_per_block; + part->reserved_block = block_no; + return 1; } block->state = BLOCK_OK; @@ -123,7 +124,7 @@ static int build_block_map(struct partition *part, int block_no) entry = 0; if (entry >= part->sector_count) { - printk(KERN_WARNING PREFIX + printk(KERN_NOTICE PREFIX "'%s': unit #%d: entry %d corrupt, " "sector %d out of range\n", part->mbd.mtd->name, block_no, i, entry); @@ -131,7 +132,7 @@ static int build_block_map(struct partition *part, int block_no) } if (part->sector_map[entry] != -1) { - printk(KERN_WARNING PREFIX + printk(KERN_NOTICE PREFIX "'%s': more than one entry for sector %d\n", part->mbd.mtd->name, entry); part->errors = 1; @@ -166,7 +167,7 @@ static int scan_header(struct partition *part) /* each erase block has three bytes header, followed by the map */ part->header_sectors_per_block = ((HEADER_MAP_OFFSET + sectors_per_block) * - sizeof(u16) + SECTOR_SIZE - 1) / SECTOR_SIZE; + sizeof(u16) + SECTOR_SIZE - 1) / SECTOR_SIZE; part->data_sectors_per_block = sectors_per_block - part->header_sectors_per_block; @@ -225,7 +226,7 @@ static int scan_header(struct partition *part) } if (part->reserved_block == -1) { - printk(KERN_WARNING PREFIX "'%s': no empty erase unit found\n", + printk(KERN_NOTICE PREFIX "'%s': no empty erase unit found\n", part->mbd.mtd->name); part->errors = 1; @@ -314,7 +315,7 @@ static void erase_callback(struct erase_info *erase) rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "'%s': unable to write RFD " + printk(KERN_NOTICE PREFIX "'%s': unable to write RFD " "header at 0x%lx\n", part->mbd.mtd->name, part->blocks[i].offset); @@ -347,7 +348,7 @@ static int erase_block(struct partition *part, int block) rc = part->mbd.mtd->erase(part->mbd.mtd, erase); if (rc) { - printk(KERN_ERR PREFIX "erase of region %x,%x on '%s' " + printk(KERN_WARNING PREFIX "erase of region %x,%x on '%s' " "failed\n", erase->addr, erase->len, part->mbd.mtd->name); kfree(erase); @@ -382,7 +383,7 @@ static int move_block_contents(struct partition *part, int block_no, u_long *old rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "error reading '%s' at " + printk(KERN_NOTICE PREFIX "error reading '%s' at " "0x%lx\n", part->mbd.mtd->name, part->blocks[block_no].offset); @@ -422,7 +423,7 @@ static int move_block_contents(struct partition *part, int block_no, u_long *old rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "'%s': Unable to " + printk(KERN_NOTICE PREFIX "'%s': Unable to " "read sector for relocation\n", part->mbd.mtd->name); @@ -519,7 +520,7 @@ static int reclaim_block(struct partition *part, u_long *old_sector) * because if we fill that one up first it'll have the most chance of having * the least live sectors at reclaim. */ -static int find_free_block(struct partition *part) +static int find_free_block(const struct partition *part) { int block, stop; @@ -532,9 +533,6 @@ static int find_free_block(struct partition *part) block != part->reserved_block) return block; - if (part->blocks[block].state == BLOCK_UNUSED) - erase_block(part, block); - if (++block >= part->total_blocks) block = 0; @@ -543,7 +541,7 @@ static int find_free_block(struct partition *part) return -1; } -static int find_writable_block(struct partition *part, u_long *old_sector) +static int find_writeable_block(struct partition *part, u_long *old_sector) { int rc, block; size_t retlen; @@ -572,7 +570,7 @@ static int find_writable_block(struct partition *part, u_long *old_sector) rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "'%s': unable to read header at " + printk(KERN_NOTICE PREFIX "'%s': unable to read header at " "0x%lx\n", part->mbd.mtd->name, part->blocks[block].offset); goto err; @@ -604,7 +602,7 @@ static int mark_sector_deleted(struct partition *part, u_long old_addr) rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "error writing '%s' at " + printk(KERN_WARNING PREFIX "error writing '%s' at " "0x%lx\n", part->mbd.mtd->name, addr); if (rc) goto err; @@ -654,7 +652,7 @@ static int do_writesect(struct mtd_blktrans_dev *dev, u_long sector, char *buf, if (part->current_block == -1 || !part->blocks[part->current_block].free_sectors) { - rc = find_writable_block(part, old_addr); + rc = find_writeable_block(part, old_addr); if (rc) goto err; } @@ -677,7 +675,7 @@ static int do_writesect(struct mtd_blktrans_dev *dev, u_long sector, char *buf, rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "error writing '%s' at 0x%lx\n", + printk(KERN_WARNING PREFIX "error writing '%s' at 0x%lx\n", part->mbd.mtd->name, addr); if (rc) goto err; @@ -697,7 +695,7 @@ static int do_writesect(struct mtd_blktrans_dev *dev, u_long sector, char *buf, rc = -EIO; if (rc) { - printk(KERN_ERR PREFIX "error writing '%s' at 0x%lx\n", + printk(KERN_WARNING PREFIX "error writing '%s' at 0x%lx\n", part->mbd.mtd->name, addr); if (rc) goto err; @@ -778,7 +776,7 @@ static void rfd_ftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) part->block_size = block_size; else { if (!mtd->erasesize) { - printk(KERN_WARNING PREFIX "please provide block_size"); + printk(KERN_NOTICE PREFIX "please provide block_size"); return; } else @@ -793,8 +791,8 @@ static void rfd_ftl_add_mtd(struct mtd_blktrans_ops *tr, struct mtd_info *mtd) if (!(mtd->flags & MTD_WRITEABLE)) part->mbd.readonly = 1; else if (part->errors) { - printk(KERN_WARNING PREFIX "'%s': errors found, " - "setting read-only\n", mtd->name); + printk(KERN_NOTICE PREFIX "'%s': errors found, " + "setting read-only", mtd->name); part->mbd.readonly = 1; }