diff options
Diffstat (limited to 'drivers/mtd/onenand/onenand_bbt.c')
-rw-r--r-- | drivers/mtd/onenand/onenand_bbt.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/drivers/mtd/onenand/onenand_bbt.c b/drivers/mtd/onenand/onenand_bbt.c index 98f8fd1c6375..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); | 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,10 +65,11 @@ 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 | ||
71 | len = 1; | 72 | len = 2; |
72 | 73 | ||
73 | /* We need only read few bytes from the OOB area */ | 74 | /* We need only read few bytes from the OOB area */ |
74 | scanlen = ooblen = 0; | 75 | scanlen = ooblen = 0; |
@@ -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]); | ||
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); |
@@ -168,8 +171,8 @@ static int onenand_isbad_bbt(struct mtd_info *mtd, loff_t offs, int allowbbt) | |||
168 | * marked good / bad blocks and writes the bad block table(s) to | 171 | * marked good / bad blocks and writes the bad block table(s) to |
169 | * the selected place. | 172 | * the selected place. |
170 | * | 173 | * |
171 | * The bad block table memory is allocated here. It must be freed | 174 | * The bad block table memory is allocated here. It is freed |
172 | * by calling the onenand_free_bbt function. | 175 | * by the onenand_release function. |
173 | * | 176 | * |
174 | */ | 177 | */ |
175 | int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) | 178 | int onenand_scan_bbt(struct mtd_info *mtd, struct nand_bbt_descr *bd) |