|
@@ -118,14 +118,9 @@
|
|
|
|
|
|
#define OMAP24XX_DMA_GPMC 4
|
|
|
|
|
|
-#define BCH8_MAX_ERROR 8 /* upto 8 bit correctable */
|
|
|
-#define BCH4_MAX_ERROR 4 /* upto 4 bit correctable */
|
|
|
-
|
|
|
#define SECTOR_BYTES 512
|
|
|
/* 4 bit padding to make byte aligned, 56 = 52 + 4 */
|
|
|
#define BCH4_BIT_PAD 4
|
|
|
-#define BCH8_ECC_MAX ((SECTOR_BYTES + BCH8_ECC_OOB_BYTES) * 8)
|
|
|
-#define BCH4_ECC_MAX ((SECTOR_BYTES + BCH4_ECC_OOB_BYTES) * 8)
|
|
|
|
|
|
/* GPMC ecc engine settings for read */
|
|
|
#define BCH_WRAPMODE_1 1 /* BCH wrap mode 1 */
|
|
@@ -1356,8 +1351,8 @@ static int omap_elm_correct_data(struct mtd_info *mtd, u_char *data,
|
|
|
u_char *erased_ecc_vec;
|
|
|
u_char *buf;
|
|
|
int bitflip_count;
|
|
|
- enum bch_ecc type;
|
|
|
bool is_error_reported = false;
|
|
|
+ u32 bit_pos, byte_pos, error_max, pos;
|
|
|
|
|
|
switch (info->ecc_opt) {
|
|
|
case OMAP_ECC_BCH4_CODE_HW:
|
|
@@ -1378,12 +1373,6 @@ static int omap_elm_correct_data(struct mtd_info *mtd, u_char *data,
|
|
|
/* Initialize elm error vector to zero */
|
|
|
memset(err_vec, 0, sizeof(err_vec));
|
|
|
|
|
|
- if (info->nand.ecc.strength == BCH8_MAX_ERROR) {
|
|
|
- type = BCH8_ECC;
|
|
|
- } else {
|
|
|
- type = BCH4_ECC;
|
|
|
- }
|
|
|
-
|
|
|
for (i = 0; i < eccsteps ; i++) {
|
|
|
eccflag = 0; /* initialize eccflag */
|
|
|
|
|
@@ -1448,20 +1437,19 @@ static int omap_elm_correct_data(struct mtd_info *mtd, u_char *data,
|
|
|
for (i = 0; i < eccsteps; i++) {
|
|
|
if (err_vec[i].error_reported) {
|
|
|
for (j = 0; j < err_vec[i].error_count; j++) {
|
|
|
- u32 bit_pos, byte_pos, error_max, pos;
|
|
|
-
|
|
|
- if (type == BCH8_ECC)
|
|
|
- error_max = BCH8_ECC_MAX;
|
|
|
- else
|
|
|
- error_max = BCH4_ECC_MAX;
|
|
|
-
|
|
|
- if (info->nand.ecc.strength == BCH8_MAX_ERROR)
|
|
|
- pos = err_vec[i].error_loc[j];
|
|
|
- else
|
|
|
- /* Add 4 to take care 4 bit padding */
|
|
|
+ switch (info->ecc_opt) {
|
|
|
+ case OMAP_ECC_BCH4_CODE_HW:
|
|
|
+ /* Add 4 bits to take care of padding */
|
|
|
pos = err_vec[i].error_loc[j] +
|
|
|
BCH4_BIT_PAD;
|
|
|
-
|
|
|
+ break;
|
|
|
+ case OMAP_ECC_BCH8_CODE_HW:
|
|
|
+ pos = err_vec[i].error_loc[j];
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ error_max = (ecc->size + actual_eccbytes) * 8;
|
|
|
/* Calculate bit position of error */
|
|
|
bit_pos = pos % 8;
|
|
|
|
|
@@ -1483,7 +1471,7 @@ static int omap_elm_correct_data(struct mtd_info *mtd, u_char *data,
|
|
|
stat += err_vec[i].error_count;
|
|
|
|
|
|
/* Update page data with sector size */
|
|
|
- data += info->nand.ecc.size;
|
|
|
+ data += ecc->size;
|
|
|
spare_ecc += ecc->bytes;
|
|
|
}
|
|
|
|