diff options
author | Brian Norris <computersforpeace@gmail.com> | 2013-11-14 17:41:32 -0500 |
---|---|---|
committer | Brian Norris <computersforpeace@gmail.com> | 2014-01-03 14:22:18 -0500 |
commit | 6033a949b2c466a13e84daebd99fdca5960b4db5 (patch) | |
tree | add88ef2dc320e2354ad390e0cb7018a95290e5d | |
parent | 87f5336eef63f0a1d1755cfe9392e2c414605780 (diff) |
mtd: nand: pxa3xx: make ECC configuration checks more explicit
The Armada BCH configuration in this driver uses one of the two
following ECC schemes:
16-bit correction per 2048 bytes
16-bit correction per 1024 bytes
These are sufficient for mapping to the 4-bit per 512-bytes and 8-bit
per 512-bytes (respectively) minimum correctability requirements of many
common NAND.
The current code only checks for the required strength (4-bit or 8-bit)
without checking the ECC step size that is associated with that strength
(and simply assumes it is 512). While that is often a safe assumption to
make, let's make it explicit, since we have that information.
Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Acked-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com>
Tested-by: Daniel Mack <zonque@gmail.com>
-rw-r--r-- | drivers/mtd/nand/pxa3xx_nand.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/drivers/mtd/nand/pxa3xx_nand.c b/drivers/mtd/nand/pxa3xx_nand.c index f00ce27f61d0..8f38abdb3310 100644 --- a/drivers/mtd/nand/pxa3xx_nand.c +++ b/drivers/mtd/nand/pxa3xx_nand.c | |||
@@ -1360,9 +1360,13 @@ static int pxa_ecc_init(struct pxa3xx_nand_info *info, | |||
1360 | 1360 | ||
1361 | static int armada370_ecc_init(struct pxa3xx_nand_info *info, | 1361 | static int armada370_ecc_init(struct pxa3xx_nand_info *info, |
1362 | struct nand_ecc_ctrl *ecc, | 1362 | struct nand_ecc_ctrl *ecc, |
1363 | int strength, int page_size) | 1363 | int strength, int ecc_stepsize, int page_size) |
1364 | { | 1364 | { |
1365 | if (strength == 4 && page_size == 4096) { | 1365 | /* |
1366 | * Required ECC: 4-bit correction per 512 bytes | ||
1367 | * Select: 16-bit correction per 2048 bytes | ||
1368 | */ | ||
1369 | if (strength == 4 && ecc_stepsize == 512 && page_size == 4096) { | ||
1366 | info->ecc_bch = 1; | 1370 | info->ecc_bch = 1; |
1367 | info->chunk_size = 2048; | 1371 | info->chunk_size = 2048; |
1368 | info->spare_size = 32; | 1372 | info->spare_size = 32; |
@@ -1373,7 +1377,11 @@ static int armada370_ecc_init(struct pxa3xx_nand_info *info, | |||
1373 | ecc->strength = 16; | 1377 | ecc->strength = 16; |
1374 | return 1; | 1378 | return 1; |
1375 | 1379 | ||
1376 | } else if (strength == 8 && page_size == 4096) { | 1380 | /* |
1381 | * Required ECC: 8-bit correction per 512 bytes | ||
1382 | * Select: 16-bit correction per 1024 bytes | ||
1383 | */ | ||
1384 | } else if (strength == 8 && ecc_stepsize == 512 && page_size == 4096) { | ||
1377 | info->ecc_bch = 1; | 1385 | info->ecc_bch = 1; |
1378 | info->chunk_size = 1024; | 1386 | info->chunk_size = 1024; |
1379 | info->spare_size = 0; | 1387 | info->spare_size = 0; |
@@ -1481,6 +1489,7 @@ KEEP_CONFIG: | |||
1481 | if (info->variant == PXA3XX_NAND_VARIANT_ARMADA370) | 1489 | if (info->variant == PXA3XX_NAND_VARIANT_ARMADA370) |
1482 | ret = armada370_ecc_init(info, &chip->ecc, | 1490 | ret = armada370_ecc_init(info, &chip->ecc, |
1483 | chip->ecc_strength_ds, | 1491 | chip->ecc_strength_ds, |
1492 | chip->ecc_step_ds, | ||
1484 | mtd->writesize); | 1493 | mtd->writesize); |
1485 | else | 1494 | else |
1486 | ret = pxa_ecc_init(info, &chip->ecc, | 1495 | ret = pxa_ecc_init(info, &chip->ecc, |