Add NAND_ECC_HW12_2048
Subsystems (2)
PATCH 1/1 Add NAND_ECC_HW12_2048
Hi,
The attached patch adds support for ECC hardware that generates 12 bytes of ECC per 2048 bytes of data.
Please apply.
Cheers,
Juha
===== include/linux/mtd/nand.h 1.6 vs edited =====
include/linux/mtd/nand.h +2 -0
@@ -138,6 +138,8 @@#define NAND_ECC_HW6_512 4/* Hardware ECC 8 byte ECC per 512 Byte data */ #define NAND_ECC_HW8_512 6 +/* Hardware ECC 12 byte ECC per 2048 Byte data */ +#define NAND_ECC_HW12_2048 7/* * Constants for Hardware ECC
===== drivers/mtd/nand/nand_base.c 1.11 vs edited =====
drivers/mtd/nand/nand_base.c +26 -5
@@ -840,7 +840,10 @@ } this->write_buf (mtd, this->data_poi, mtd->oobblock);break ; - + +/* Hardware ECC 12 byte / 2048 byte data */ +case NAND_ECC_HW12_2048 : + eccbytes +=4 ;/* Hardware ecc 8 byte / 512 byte data */ case NAND_ECC_HW8_512 : eccbytes +=2 ;
@@ -1099,6 +1102,9 @@case NAND_ECC_HW8_512 :/* Hardware ECC 8 byte / 512 byte data */ eccbytes =8 ;break ; +case NAND_ECC_HW12_2048 :/* Hardware ECC 8 byte / 512 byte data */ + eccbytes =12 ; +break ;case NAND_ECC_NONE : compareecc =0 ;break ;
@@ -1164,13 +1170,14 @@for (i =0 , datidx =0 ; eccsteps; eccsteps--, i+=3 , datidx += ecc) this->calculate_ecc (mtd, &data_poi[datidx], &ecc_calc[i]);break ; - -case NAND_ECC_HW3_256 :/* Hardware ECC 3 byte /256 byte data */ -case NAND_ECC_HW3_512 :/* Hardware ECC 3 byte /512 byte data */ + +case NAND_ECC_HW12_2048 :/* Hardware ECC 12 byte / 2048 byte data */ +case NAND_ECC_HW3_256 :/* Hardware ECC 3 byte / 256 byte data */ +case NAND_ECC_HW3_512 :/* Hardware ECC 3 byte / 512 byte data */ case NAND_ECC_HW6_512 :/* Hardware ECC 6 byte / 512 byte data */ case NAND_ECC_HW8_512 :/* Hardware ECC 8 byte / 512 byte data */ for (i =0 , datidx =0 ; eccsteps; eccsteps--, i+=eccbytes, datidx += ecc) { - this->enable_hwecc (mtd,NAND_ECC_READ ); + this->enable_hwecc (mtd,NAND_ECC_READ ); this->read_buf (mtd, &data_poi[datidx], ecc);/* HW ecc with syndrome calculation must read the
@@ -2435,6 +2442,17 @@ this->eccsize =256 ;/* set default eccsize */ switch (this->eccmode) { +case NAND_ECC_HW12_2048 : +if (mtd->oobblock <2048 ) { +printk (KERN_WARNING "2048 byte HW ECC not possible on %d byte page size, fallback to SW ECC\n" , + mtd->oobblock); + this->eccmode =NAND_ECC_SOFT ; + this->calculate_ecc = nand_calculate_ecc; + this->correct_data = nand_correct_data; +break ; + }else + this->eccsize =2048 ; +break ;case NAND_ECC_HW3_512 :case NAND_ECC_HW6_512 :
@@ -2473,6 +2491,9 @@/* Set the number of read / write steps for one page to ensure ECC generation */ switch (this->eccmode) { +case NAND_ECC_HW12_2048 : + this->eccsteps = mtd->oobblock /2048 ; +break ;case NAND_ECC_HW3_512 :case NAND_ECC_HW6_512 :case NAND_ECC_HW8_512 :