diff options
author | Kyungmin Park <kyungmin.park@samsung.com> | 2007-02-06 22:15:01 -0500 |
---|---|---|
committer | Kyungmin Park <kyungmin.park@samsung.com> | 2007-02-06 22:15:01 -0500 |
commit | 211ac75f5e867ab7a54811a514814149caca42c3 (patch) | |
tree | f73ec68bb5969aa0f522aa05a71737aa69626513 /drivers/mtd/onenand/onenand_bbt.c | |
parent | 81f38e11233dae671c0673bbdcea01194b75d68f (diff) |
[MTD] OneNAND: Error message printing and bad block scan erros
Provide the bad block scan with its own read function so that important error
messages that are not from the the bad block scan, can always be printed.
Signed-off-by: Adrian Hunter <ext-adrian.hunter@nokia.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Diffstat (limited to 'drivers/mtd/onenand/onenand_bbt.c')
-rw-r--r-- | drivers/mtd/onenand/onenand_bbt.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/mtd/onenand/onenand_bbt.c b/drivers/mtd/onenand/onenand_bbt.c index acea9a1a7297..aecdd50a1781 100644 --- a/drivers/mtd/onenand/onenand_bbt.c +++ b/drivers/mtd/onenand/onenand_bbt.c | |||
@@ -17,8 +17,8 @@ | |||
17 | #include <linux/mtd/onenand.h> | 17 | #include <linux/mtd/onenand.h> |
18 | #include <linux/mtd/compatmac.h> | 18 | #include <linux/mtd/compatmac.h> |
19 | 19 | ||
20 | extern int onenand_do_read_oob(struct mtd_info *mtd, loff_t from, size_t len, | 20 | extern int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from, |
21 | size_t *retlen, u_char *buf, mtd_oob_mode_t mode); | 21 | struct mtd_oob_ops *ops); |
22 | 22 | ||
23 | /** | 23 | /** |
24 | * check_short_pattern - [GENERIC] check if a pattern is in the buffer | 24 | * check_short_pattern - [GENERIC] check if a pattern is in the buffer |
@@ -65,6 +65,7 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr | |||
65 | int startblock; | 65 | int startblock; |
66 | loff_t from; | 66 | loff_t from; |
67 | size_t readlen, ooblen; | 67 | size_t readlen, ooblen; |
68 | struct mtd_oob_ops ops; | ||
68 | 69 | ||
69 | printk(KERN_INFO "Scanning device for bad blocks\n"); | 70 | printk(KERN_INFO "Scanning device for bad blocks\n"); |
70 | 71 | ||
@@ -82,22 +83,24 @@ static int create_bbt(struct mtd_info *mtd, uint8_t *buf, struct nand_bbt_descr | |||
82 | startblock = 0; | 83 | startblock = 0; |
83 | from = 0; | 84 | from = 0; |
84 | 85 | ||
86 | ops.mode = MTD_OOB_PLACE; | ||
87 | ops.ooblen = readlen; | ||
88 | ops.oobbuf = buf; | ||
89 | ops.len = ops.ooboffs = ops.retlen = ops.oobretlen = 0; | ||
90 | |||
85 | for (i = startblock; i < numblocks; ) { | 91 | for (i = startblock; i < numblocks; ) { |
86 | int ret; | 92 | int ret; |
87 | 93 | ||
88 | for (j = 0; j < len; j++) { | 94 | for (j = 0; j < len; j++) { |
89 | size_t retlen; | ||
90 | |||
91 | /* No need to read pages fully, | 95 | /* No need to read pages fully, |
92 | * just read required OOB bytes */ | 96 | * just read required OOB bytes */ |
93 | ret = onenand_do_read_oob(mtd, from + j * mtd->writesize + bd->offs, | 97 | ret = onenand_bbt_read_oob(mtd, from + j * mtd->writesize + bd->offs, &ops); |
94 | readlen, &retlen, &buf[0], MTD_OOB_PLACE); | ||
95 | 98 | ||
96 | /* If it is a initial bad block, just ignore it */ | 99 | /* If it is a initial bad block, just ignore it */ |
97 | if (ret && !(ret & ONENAND_CTRL_LOAD)) | 100 | if (ret == ONENAND_BBT_READ_FATAL_ERROR) |
98 | return ret; | 101 | return -EIO; |
99 | 102 | ||
100 | if (check_short_pattern(&buf[j * scanlen], scanlen, mtd->writesize, bd)) { | 103 | if (ret || check_short_pattern(&buf[j * scanlen], scanlen, mtd->writesize, bd)) { |
101 | bbm->bbt[i >> 3] |= 0x03 << (i & 0x6); | 104 | bbm->bbt[i >> 3] |= 0x03 << (i & 0x6); |
102 | printk(KERN_WARNING "Bad eraseblock %d at 0x%08x\n", | 105 | printk(KERN_WARNING "Bad eraseblock %d at 0x%08x\n", |
103 | i >> 1, (unsigned int) from); | 106 | i >> 1, (unsigned int) from); |