diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2008-09-03 14:53:26 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2008-09-03 14:53:26 +0200 |
commit | 2f6ccbb9f80153825b85406eaea9e4182db8bf81 (patch) | |
tree | 418a703d4d95f101a7d092972acdcf2c188aaf8d /commands/nand.c | |
parent | f118d1a1037d9f5540fd88763495f3676cab36d1 (diff) | |
download | barebox-2f6ccbb9f80153825b85406eaea9e4182db8bf81.tar.gz barebox-2f6ccbb9f80153825b85406eaea9e4182db8bf81.tar.xz |
NAND: Calculate size of bb devices
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'commands/nand.c')
-rw-r--r-- | commands/nand.c | 26 |
1 files changed, 24 insertions, 2 deletions
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; |