mtd: nand: fix Samsung SLC NAND identification regression

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Wed Nov 21 06:59:02 EST 2012


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=af451af4e0a3a4cd7536843f585c96a9b095a4e8
Commit:     af451af4e0a3a4cd7536843f585c96a9b095a4e8
Parent:     5ffd3412ae5536a4c57469cb8ea31887121dcb2e
Author:     Brian Norris <computersforpeace at gmail.com>
AuthorDate: Tue Oct 9 23:26:06 2012 -0700
Committer:  Artem Bityutskiy <artem.bityutskiy at linux.intel.com>
CommitDate: Thu Nov 15 15:37:16 2012 +0200

    mtd: nand: fix Samsung SLC NAND identification regression
    
    A combination of the following two commits caused a regression in 3.7-rc1
    when identifying some Samsung NAND, so that some previously working NAND
    were no longer detected properly:
    
        commit e3b88bd604283ef83ae6e8f53622d5b1ffe9d43a
        mtd: nand: add generic READ ID length calculation functions
    
        commit e2d3a35ee427aaba99b6c68a56609ce276c51270
        mtd: nand: detect Samsung K9GBG08U0A, K9GAG08U0F ID
    
    Particularly, a regression was seen on Samsung K9F2G08U0B, with the
    following full 8-byte READ ID string:
    
        ec da 10 95 44 00 ec da
    
    The basic problem is that Samsung manufactures both SLC and MLC NAND
    that use a non-standard decoding table for deriving information from
    their IDs. I have heuristically determined that all the chips that use
    the new table have ID strings which wrap around after the 6th byte.
    Unfortunately, I overlooked the fact that some older Samsung SLC (which
    use a different decoding table) have "5 byte ID strings" which also wrap
    around after the 6th byte.
    
    This patch re-introduces a distinction between these old and new Samsung
    NAND by checking that the 6th byte is non-zero, allowing both old and
    new Samsung NAND to be detected properly.
    
    Signed-off-by: Brian Norris <computersforpeace at gmail.com>
    Tested-by: Brian Norris <computersforpeace at gmail.com>
    Reported-by: Marek Vasut <marex at denx.de>
    Tested-by: Marek Vasut <marex at denx.de>
    Signed-off-by: Artem Bityutskiy <artem.bityutskiy at linux.intel.com>
---
 drivers/mtd/nand/nand_base.c |    9 +++++----
 1 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index ec6841d..d5ece6e 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -2983,13 +2983,14 @@ static void nand_decode_ext_id(struct mtd_info *mtd, struct nand_chip *chip,
 	/*
 	 * Field definitions are in the following datasheets:
 	 * Old style (4,5 byte ID): Samsung K9GAG08U0M (p.32)
-	 * New style   (6 byte ID): Samsung K9GAG08U0F (p.44)
+	 * New Samsung (6 byte ID): Samsung K9GAG08U0F (p.44)
 	 * Hynix MLC   (6 byte ID): Hynix H27UBG8T2B (p.22)
 	 *
-	 * Check for ID length, cell type, and Hynix/Samsung ID to decide what
-	 * to do.
+	 * Check for ID length, non-zero 6th byte, cell type, and Hynix/Samsung
+	 * ID to decide what to do.
 	 */
-	if (id_len == 6 && id_data[0] == NAND_MFR_SAMSUNG) {
+	if (id_len == 6 && id_data[0] == NAND_MFR_SAMSUNG &&
+			id_data[5] != 0x00) {
 		/* Calc pagesize */
 		mtd->writesize = 2048 << (extid & 0x03);
 		extid >>= 2;



More information about the linux-mtd-cvs mailing list