diff options
-rw-r--r-- | drivers/mtd/nand/atmel_nand.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index 4ce181a35bcd..4f5348fd409c 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c | |||
@@ -861,12 +861,11 @@ static int pmecc_correction(struct mtd_info *mtd, u32 pmecc_stat, uint8_t *buf, | |||
861 | { | 861 | { |
862 | struct nand_chip *nand_chip = mtd->priv; | 862 | struct nand_chip *nand_chip = mtd->priv; |
863 | struct atmel_nand_host *host = nand_chip->priv; | 863 | struct atmel_nand_host *host = nand_chip->priv; |
864 | int i, err_nbr, eccbytes; | 864 | int i, err_nbr; |
865 | uint8_t *buf_pos; | 865 | uint8_t *buf_pos; |
866 | int total_err = 0; | 866 | int total_err = 0; |
867 | 867 | ||
868 | eccbytes = nand_chip->ecc.bytes; | 868 | for (i = 0; i < nand_chip->ecc.total; i++) |
869 | for (i = 0; i < eccbytes; i++) | ||
870 | if (ecc[i] != 0xff) | 869 | if (ecc[i] != 0xff) |
871 | goto normal_check; | 870 | goto normal_check; |
872 | /* Erased page, return OK */ | 871 | /* Erased page, return OK */ |
@@ -928,7 +927,7 @@ static int atmel_nand_pmecc_read_page(struct mtd_info *mtd, | |||
928 | struct nand_chip *chip, uint8_t *buf, int oob_required, int page) | 927 | struct nand_chip *chip, uint8_t *buf, int oob_required, int page) |
929 | { | 928 | { |
930 | struct atmel_nand_host *host = chip->priv; | 929 | struct atmel_nand_host *host = chip->priv; |
931 | int eccsize = chip->ecc.size; | 930 | int eccsize = chip->ecc.size * chip->ecc.steps; |
932 | uint8_t *oob = chip->oob_poi; | 931 | uint8_t *oob = chip->oob_poi; |
933 | uint32_t *eccpos = chip->ecc.layout->eccpos; | 932 | uint32_t *eccpos = chip->ecc.layout->eccpos; |
934 | uint32_t stat; | 933 | uint32_t stat; |
@@ -1169,8 +1168,7 @@ static int atmel_pmecc_nand_init_params(struct platform_device *pdev, | |||
1169 | goto err; | 1168 | goto err; |
1170 | } | 1169 | } |
1171 | 1170 | ||
1172 | /* ECC is calculated for the whole page (1 step) */ | 1171 | nand_chip->ecc.size = sector_size; |
1173 | nand_chip->ecc.size = mtd->writesize; | ||
1174 | 1172 | ||
1175 | /* set ECC page size and oob layout */ | 1173 | /* set ECC page size and oob layout */ |
1176 | switch (mtd->writesize) { | 1174 | switch (mtd->writesize) { |
@@ -1185,18 +1183,20 @@ static int atmel_pmecc_nand_init_params(struct platform_device *pdev, | |||
1185 | host->pmecc_index_of = host->pmecc_rom_base + | 1183 | host->pmecc_index_of = host->pmecc_rom_base + |
1186 | host->pmecc_lookup_table_offset; | 1184 | host->pmecc_lookup_table_offset; |
1187 | 1185 | ||
1188 | nand_chip->ecc.steps = 1; | 1186 | nand_chip->ecc.steps = host->pmecc_sector_number; |
1189 | nand_chip->ecc.strength = cap; | 1187 | nand_chip->ecc.strength = cap; |
1190 | nand_chip->ecc.bytes = host->pmecc_bytes_per_sector * | 1188 | nand_chip->ecc.bytes = host->pmecc_bytes_per_sector; |
1189 | nand_chip->ecc.total = host->pmecc_bytes_per_sector * | ||
1191 | host->pmecc_sector_number; | 1190 | host->pmecc_sector_number; |
1192 | if (nand_chip->ecc.bytes > mtd->oobsize - 2) { | 1191 | if (nand_chip->ecc.total > mtd->oobsize - 2) { |
1193 | dev_err(host->dev, "No room for ECC bytes\n"); | 1192 | dev_err(host->dev, "No room for ECC bytes\n"); |
1194 | err_no = -EINVAL; | 1193 | err_no = -EINVAL; |
1195 | goto err; | 1194 | goto err; |
1196 | } | 1195 | } |
1197 | pmecc_config_ecc_layout(&atmel_pmecc_oobinfo, | 1196 | pmecc_config_ecc_layout(&atmel_pmecc_oobinfo, |
1198 | mtd->oobsize, | 1197 | mtd->oobsize, |
1199 | nand_chip->ecc.bytes); | 1198 | nand_chip->ecc.total); |
1199 | |||
1200 | nand_chip->ecc.layout = &atmel_pmecc_oobinfo; | 1200 | nand_chip->ecc.layout = &atmel_pmecc_oobinfo; |
1201 | break; | 1201 | break; |
1202 | case 512: | 1202 | case 512: |