mtd: add datasheet's ECC information to nand_chip{}

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Fri Aug 30 16:59:02 EDT 2013


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=4cfeca2d58de8292f45351f84e84f657222a4611
Commit:     4cfeca2d58de8292f45351f84e84f657222a4611
Parent:     1fad0e8b9a8889f6ca79be570e06d00785f15aed
Author:     Huang Shijie <b32955 at freescale.com>
AuthorDate: Fri May 17 11:17:25 2013 +0800
Committer:  David Woodhouse <David.Woodhouse at intel.com>
CommitDate: Fri Aug 30 21:34:37 2013 +0100

    mtd: add datasheet's ECC information to nand_chip{}
    
    1.) Why add the ECC information to the nand_chip{} ?
       Each nand chip has its requirement for the ECC correctability, such as
       "4bit ECC for each 512Byte" or "40bit ECC for each 1024Byte".
       This ECC info is very important to the nand controller, such as gpmi.
    
       Take the Micron MT29F64G08CBABA for example, its geometry is
       8KiB page size, 744 bytes oob size and it requires 40bit ECC per 1KiB.
       If we do not provide the ECC info to the gpmi nand driver, it has to
       calculate the ECC correctability itself. The gpmi driver will gets the 56bit
       ECC for per 1KiB which is beyond its BCH's 40bit ecc capibility.
       The gpmi will quits in this case. But in actually, the gpmi can supports
       this nand chip if it can get the right ECC info.
    
    2.) about the new fields.
       The @ecc_strength_ds stands for the ecc bits needed within the @ecc_step_ds.
       The two fields should be set from the nand chip's datasheets.
    
       For example:
    	"4bit ECC for each 512Byte" could be:
    		@ecc_strength_ds = 4, @ecc_step_ds = 512.
    	"40bit ECC for each 1024Byte" could be:
    		@ecc_strength_ds = 40, @ecc_step_ds = 1024.
    
    3.) Why do not re-use the @strength and @size in the nand_ecc_ctrl{}?
       The @strength and @size in nand_ecc_ctrl{} is used by the nand controller
       driver, while the @ecc_strength_ds and @ecc_step_ds are get from the datasheet.
    
    Signed-off-by: Huang Shijie <b32955 at freescale.com>
    Reviewed-and-tested-by: Brian Norris <computersforpeace at gmail.com>
    Signed-off-by: Brian Norris <computersforpeace at gmail.com>
    Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
---
 include/linux/mtd/nand.h | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/include/linux/mtd/nand.h b/include/linux/mtd/nand.h
index 9f7b248..fbf3bba 100644
--- a/include/linux/mtd/nand.h
+++ b/include/linux/mtd/nand.h
@@ -437,6 +437,12 @@ struct nand_buffers {
  *			bad block marker position; i.e., BBM == 11110111b is
  *			not bad when badblockbits == 7
  * @cellinfo:		[INTERN] MLC/multichip data from chip ident
+ * @ecc_strength_ds:	[INTERN] ECC correctability from the datasheet.
+ *			Minimum amount of bit errors per @ecc_step_ds guaranteed
+ *			to be correctable. If unknown, set to zero.
+ * @ecc_step_ds:	[INTERN] ECC step required by the @ecc_strength_ds,
+ *                      also from the datasheet. It is the recommended ECC step
+ *			size, if known; if unknown, set to zero.
  * @numchips:		[INTERN] number of physical chips
  * @chipsize:		[INTERN] the size of one chip for multichip arrays
  * @pagemask:		[INTERN] page number mask = number of (pages / chip) - 1
@@ -513,6 +519,8 @@ struct nand_chip {
 	unsigned int pagebuf_bitflips;
 	int subpagesize;
 	uint8_t cellinfo;
+	uint16_t ecc_strength_ds;
+	uint16_t ecc_step_ds;
 	int badblockpos;
 	int badblockbits;
 



More information about the linux-mtd-cvs mailing list