提交 8a8f632d 编写于 作者: K Kyungmin Park 提交者: David Woodhouse

mtd: OneNAND: Fix 4KiB pagesize OOB handling

Original 4KiB pagesize chip (SLC) doesn't support OOB operations at Spec.
And it's also same at Flex-OneNAND.

Remove the MLC macro if possible and use 4KiB pagesize macro since MLC has 4KiB pagesize.
Signed-off-by: NKyungmin Park <kyungmin.park@samsung.com>
Signed-off-by: NDavid Woodhouse <David.Woodhouse@intel.com>
上级 b5602e86
...@@ -400,8 +400,7 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t le ...@@ -400,8 +400,7 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t le
value = onenand_bufferram_address(this, block); value = onenand_bufferram_address(this, block);
this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2); this->write_word(value, this->base + ONENAND_REG_START_ADDRESS2);
if (ONENAND_IS_MLC(this) || ONENAND_IS_2PLANE(this) || if (ONENAND_IS_2PLANE(this) || ONENAND_IS_4KB_PAGE(this))
ONENAND_IS_4KB_PAGE(this))
/* It is always BufferRAM0 */ /* It is always BufferRAM0 */
ONENAND_SET_BUFFERRAM0(this); ONENAND_SET_BUFFERRAM0(this);
else else
...@@ -430,7 +429,7 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t le ...@@ -430,7 +429,7 @@ static int onenand_command(struct mtd_info *mtd, int cmd, loff_t addr, size_t le
case FLEXONENAND_CMD_RECOVER_LSB: case FLEXONENAND_CMD_RECOVER_LSB:
case ONENAND_CMD_READ: case ONENAND_CMD_READ:
case ONENAND_CMD_READOOB: case ONENAND_CMD_READOOB:
if (ONENAND_IS_MLC(this) || ONENAND_IS_4KB_PAGE(this)) if (ONENAND_IS_4KB_PAGE(this))
/* It is always BufferRAM0 */ /* It is always BufferRAM0 */
dataram = ONENAND_SET_BUFFERRAM0(this); dataram = ONENAND_SET_BUFFERRAM0(this);
else else
...@@ -1353,7 +1352,7 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from, ...@@ -1353,7 +1352,7 @@ static int onenand_read_oob_nolock(struct mtd_info *mtd, loff_t from,
stats = mtd->ecc_stats; stats = mtd->ecc_stats;
readcmd = ONENAND_IS_MLC(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
while (read < len) { while (read < len) {
cond_resched(); cond_resched();
...@@ -1429,7 +1428,7 @@ static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len, ...@@ -1429,7 +1428,7 @@ static int onenand_read(struct mtd_info *mtd, loff_t from, size_t len,
int ret; int ret;
onenand_get_device(mtd, FL_READING); onenand_get_device(mtd, FL_READING);
ret = ONENAND_IS_MLC(this) || ONENAND_IS_4KB_PAGE(this) ? ret = ONENAND_IS_4KB_PAGE(this) ?
onenand_mlc_read_ops_nolock(mtd, from, &ops) : onenand_mlc_read_ops_nolock(mtd, from, &ops) :
onenand_read_ops_nolock(mtd, from, &ops); onenand_read_ops_nolock(mtd, from, &ops);
onenand_release_device(mtd); onenand_release_device(mtd);
...@@ -1464,7 +1463,7 @@ static int onenand_read_oob(struct mtd_info *mtd, loff_t from, ...@@ -1464,7 +1463,7 @@ static int onenand_read_oob(struct mtd_info *mtd, loff_t from,
onenand_get_device(mtd, FL_READING); onenand_get_device(mtd, FL_READING);
if (ops->datbuf) if (ops->datbuf)
ret = ONENAND_IS_MLC(this) || ONENAND_IS_4KB_PAGE(this) ? ret = ONENAND_IS_4KB_PAGE(this) ?
onenand_mlc_read_ops_nolock(mtd, from, ops) : onenand_mlc_read_ops_nolock(mtd, from, ops) :
onenand_read_ops_nolock(mtd, from, ops); onenand_read_ops_nolock(mtd, from, ops);
else else
...@@ -1558,7 +1557,7 @@ int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from, ...@@ -1558,7 +1557,7 @@ int onenand_bbt_read_oob(struct mtd_info *mtd, loff_t from,
column = from & (mtd->oobsize - 1); column = from & (mtd->oobsize - 1);
readcmd = ONENAND_IS_MLC(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
while (read < len) { while (read < len) {
cond_resched(); cond_resched();
...@@ -1612,7 +1611,7 @@ static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to ...@@ -1612,7 +1611,7 @@ static int onenand_verify_oob(struct mtd_info *mtd, const u_char *buf, loff_t to
u_char *oob_buf = this->oob_buf; u_char *oob_buf = this->oob_buf;
int status, i, readcmd; int status, i, readcmd;
readcmd = ONENAND_IS_MLC(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB; readcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_READ : ONENAND_CMD_READOOB;
this->command(mtd, readcmd, to, mtd->oobsize); this->command(mtd, readcmd, to, mtd->oobsize);
onenand_update_bufferram(mtd, to, 0); onenand_update_bufferram(mtd, to, 0);
...@@ -2079,7 +2078,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to, ...@@ -2079,7 +2078,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
oobbuf = this->oob_buf; oobbuf = this->oob_buf;
oobcmd = ONENAND_IS_MLC(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB; oobcmd = ONENAND_IS_4KB_PAGE(this) ? ONENAND_CMD_PROG : ONENAND_CMD_PROGOOB;
/* Loop until all data write */ /* Loop until all data write */
while (written < len) { while (written < len) {
...@@ -2098,7 +2097,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to, ...@@ -2098,7 +2097,7 @@ static int onenand_write_oob_nolock(struct mtd_info *mtd, loff_t to,
memcpy(oobbuf + column, buf, thislen); memcpy(oobbuf + column, buf, thislen);
this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize); this->write_bufferram(mtd, ONENAND_SPARERAM, oobbuf, 0, mtd->oobsize);
if (ONENAND_IS_MLC(this) || ONENAND_IS_4KB_PAGE(this)) { if (ONENAND_IS_4KB_PAGE(this)) {
/* Set main area of DataRAM to 0xff*/ /* Set main area of DataRAM to 0xff*/
memset(this->page_buf, 0xff, mtd->writesize); memset(this->page_buf, 0xff, mtd->writesize);
this->write_bufferram(mtd, ONENAND_DATARAM, this->write_bufferram(mtd, ONENAND_DATARAM,
...@@ -3041,7 +3040,7 @@ static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len, ...@@ -3041,7 +3040,7 @@ static int do_otp_read(struct mtd_info *mtd, loff_t from, size_t len,
this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0); this->command(mtd, ONENAND_CMD_OTP_ACCESS, 0, 0);
this->wait(mtd, FL_OTPING); this->wait(mtd, FL_OTPING);
ret = ONENAND_IS_MLC(this) || ONENAND_IS_4KB_PAGE(this) ? ret = ONENAND_IS_4KB_PAGE(this) ?
onenand_mlc_read_ops_nolock(mtd, from, &ops) : onenand_mlc_read_ops_nolock(mtd, from, &ops) :
onenand_read_ops_nolock(mtd, from, &ops); onenand_read_ops_nolock(mtd, from, &ops);
...@@ -3413,7 +3412,11 @@ static void onenand_check_features(struct mtd_info *mtd) ...@@ -3413,7 +3412,11 @@ static void onenand_check_features(struct mtd_info *mtd)
break; break;
} }
if (ONENAND_IS_MLC(this) || ONENAND_IS_4KB_PAGE(this)) /* The MLC has 4KiB pagesize. */
if (ONENAND_IS_MLC(this))
this->options |= ONENAND_HAS_4KB_PAGE;
if (ONENAND_IS_4KB_PAGE(this))
this->options &= ~ONENAND_HAS_2PLANE; this->options &= ~ONENAND_HAS_2PLANE;
if (FLEXONENAND(this)) { if (FLEXONENAND(this)) {
...@@ -3847,7 +3850,7 @@ static int onenand_probe(struct mtd_info *mtd) ...@@ -3847,7 +3850,7 @@ static int onenand_probe(struct mtd_info *mtd)
/* The data buffer size is equal to page size */ /* The data buffer size is equal to page size */
mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE); mtd->writesize = this->read_word(this->base + ONENAND_REG_DATA_BUFFER_SIZE);
/* We use the full BufferRAM */ /* We use the full BufferRAM */
if (ONENAND_IS_MLC(this) || ONENAND_IS_4KB_PAGE(this)) if (ONENAND_IS_4KB_PAGE(this))
mtd->writesize <<= 1; mtd->writesize <<= 1;
mtd->oobsize = mtd->writesize >> 5; mtd->oobsize = mtd->writesize >> 5;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册