Commit b3857666 authored by Bo Shen's avatar Bo Shen Committed by Brian Norris

mtd: atmel_nand: make ecc parameters same as definition

If the ecc parameter is not the same as definition, when the
mtd core check these parameters, it will give the error result.

Take the following as an example:

Calculate how many bits can be corrected in one page.
According to the ecc parameters definition,

one page correct bits = (mtd->writesize * ecc->strength) / ecc->size

take the following use case as an example:
mtd->writesize = 2048 bytes
ecc->strength = 4 bytes (for 512 bytes)

before this patch, the ecc->size = 2048, so the result is 4 bytes.
after this patch, the ecc->size = 512, so the result is 16 bytes.

So, align the ecc parameters the same as definition to correct
this kind of error.
Signed-off-by: default avatarBo Shen <voice.shen@atmel.com>
Acked-by: default avatarJosh Wu <josh.wu@atmel.com>
Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
parent 974647ea
...@@ -861,12 +861,11 @@ static int pmecc_correction(struct mtd_info *mtd, u32 pmecc_stat, uint8_t *buf, ...@@ -861,12 +861,11 @@ static int pmecc_correction(struct mtd_info *mtd, u32 pmecc_stat, uint8_t *buf,
{ {
struct nand_chip *nand_chip = mtd->priv; struct nand_chip *nand_chip = mtd->priv;
struct atmel_nand_host *host = nand_chip->priv; struct atmel_nand_host *host = nand_chip->priv;
int i, err_nbr, eccbytes; int i, err_nbr;
uint8_t *buf_pos; uint8_t *buf_pos;
int total_err = 0; int total_err = 0;
eccbytes = nand_chip->ecc.bytes; for (i = 0; i < nand_chip->ecc.total; i++)
for (i = 0; i < eccbytes; i++)
if (ecc[i] != 0xff) if (ecc[i] != 0xff)
goto normal_check; goto normal_check;
/* Erased page, return OK */ /* Erased page, return OK */
...@@ -928,7 +927,7 @@ static int atmel_nand_pmecc_read_page(struct mtd_info *mtd, ...@@ -928,7 +927,7 @@ static int atmel_nand_pmecc_read_page(struct mtd_info *mtd,
struct nand_chip *chip, uint8_t *buf, int oob_required, int page) struct nand_chip *chip, uint8_t *buf, int oob_required, int page)
{ {
struct atmel_nand_host *host = chip->priv; struct atmel_nand_host *host = chip->priv;
int eccsize = chip->ecc.size; int eccsize = chip->ecc.size * chip->ecc.steps;
uint8_t *oob = chip->oob_poi; uint8_t *oob = chip->oob_poi;
uint32_t *eccpos = chip->ecc.layout->eccpos; uint32_t *eccpos = chip->ecc.layout->eccpos;
uint32_t stat; uint32_t stat;
...@@ -1169,8 +1168,7 @@ static int atmel_pmecc_nand_init_params(struct platform_device *pdev, ...@@ -1169,8 +1168,7 @@ static int atmel_pmecc_nand_init_params(struct platform_device *pdev,
goto err; goto err;
} }
/* ECC is calculated for the whole page (1 step) */ nand_chip->ecc.size = sector_size;
nand_chip->ecc.size = mtd->writesize;
/* set ECC page size and oob layout */ /* set ECC page size and oob layout */
switch (mtd->writesize) { switch (mtd->writesize) {
...@@ -1185,18 +1183,20 @@ static int atmel_pmecc_nand_init_params(struct platform_device *pdev, ...@@ -1185,18 +1183,20 @@ static int atmel_pmecc_nand_init_params(struct platform_device *pdev,
host->pmecc_index_of = host->pmecc_rom_base + host->pmecc_index_of = host->pmecc_rom_base +
host->pmecc_lookup_table_offset; host->pmecc_lookup_table_offset;
nand_chip->ecc.steps = 1; nand_chip->ecc.steps = host->pmecc_sector_number;
nand_chip->ecc.strength = cap; nand_chip->ecc.strength = cap;
nand_chip->ecc.bytes = host->pmecc_bytes_per_sector * nand_chip->ecc.bytes = host->pmecc_bytes_per_sector;
nand_chip->ecc.total = host->pmecc_bytes_per_sector *
host->pmecc_sector_number; host->pmecc_sector_number;
if (nand_chip->ecc.bytes > mtd->oobsize - 2) { if (nand_chip->ecc.total > mtd->oobsize - 2) {
dev_err(host->dev, "No room for ECC bytes\n"); dev_err(host->dev, "No room for ECC bytes\n");
err_no = -EINVAL; err_no = -EINVAL;
goto err; goto err;
} }
pmecc_config_ecc_layout(&atmel_pmecc_oobinfo, pmecc_config_ecc_layout(&atmel_pmecc_oobinfo,
mtd->oobsize, mtd->oobsize,
nand_chip->ecc.bytes); nand_chip->ecc.total);
nand_chip->ecc.layout = &atmel_pmecc_oobinfo; nand_chip->ecc.layout = &atmel_pmecc_oobinfo;
break; break;
case 512: case 512:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment