From 2f6ccbb9f80153825b85406eaea9e4182db8bf81 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Wed, 3 Sep 2008 14:53:26 +0200 Subject: NAND: Calculate size of bb devices Signed-off-by: Sascha Hauer --- commands/nand.c | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'commands/nand.c') diff --git a/commands/nand.c b/commands/nand.c index d3f69b801e..fce61d7ecb 100644 --- a/commands/nand.c +++ b/commands/nand.c @@ -142,11 +142,33 @@ static int nand_bb_close(struct device_d *dev, struct filep *f) return 0; } +static int nand_bb_calc_size(struct nand_bb *bb) +{ + ulong pos = 0; + int ret; + + while (pos < bb->physdev->size) { + ret = dev_ioctl(bb->physdev, MEMGETBADBLOCK, (void *)pos); + if (ret < 0) + return ret; + if (!ret) + bb->device.size += bb->info.erasesize; + + pos += bb->info.erasesize; + } + + return 0; +} + static int nand_bb_probe(struct device_d *dev) { struct nand_bb *bb = dev->priv; + int ret; - return dev_ioctl(bb->physdev, MEMGETINFO, &bb->info); + ret = dev_ioctl(bb->physdev, MEMGETINFO, &bb->info); + if (ret) + return ret; + return nand_bb_calc_size(bb); } static int nand_bb_remove(struct device_d *dev) @@ -191,7 +213,7 @@ struct device_d *dev_add_bb_dev(struct device_d *dev, const char *name) sprintf(bb->device.id, "%s.bb", dev->id); strcpy(bb->device.name, "nand_bb"); bb->device.priv = bb; - bb->device.size = dev->size; /* FIXME: Bad blocks? */ + bb->device.size = 0; bb->device.type = DEVICE_TYPE_NAND_BB; bb->physdev = dev; -- cgit v1.2.3