All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andrew McKay <amckay@iders.ca>
To: linux-mtd@lists.infradead.org
Subject: ECC not appearing in OOB
Date: Tue, 04 Aug 2009 16:26:07 -0500	[thread overview]
Message-ID: <4A78A76F.4080702@iders.ca> (raw)

I'm having some issues with a YAFFS2 filesystem on a Micron NAND part 
(MT29F16G08DAA).  The NAND part has 4K pages and 128bit spare area.  My kernel 
version is 2.6.20.4 which didn't support 4K page NAND ports.  I had patch in 
changes for 4K parts.

Since I was having errors with the filesystem I went back to testing the NAND 
part with raw binary accesses.  Neither writing nandwrite (in mtd-utils) or dd 
seems to add ECC information in the OOB block.  I copied a section of a large 
binary file with the following command:

dd if=../nand_testing/binblob of=/dev/mtdblock12 bs=1024 count=10240

When I dump the nand with nanddump, it prints out the following for the first page:

/mnt/zen/mtd-utils # ./nanddump -p /dev/mtd12
ECC failed: 0
ECC corrected: 0
Number of bad blocks: 10
Number of bbt blocks: 0
Block size 262144, page size 4096, OOB size 128
Dumping data starting at 0x00000000 and ending at 0x80000000...
0x00000000: 92 89 30 f4 b4 67 4f e7 48 d1 1f d9 00 d6 f9 22
0x00000010: a2 62 e2 5e 72 91 fa 11 15 64 35 27 f4 fe 2c 49
0x00000020: 4d 5c 78 82 dd 98 d3 9c 1e 2d 3b fd 8e 31 ee 7c
0x00000030: ec 3c 18 65 1c 01 ae a0 0a 19 32 e6 92 67 6c 2e
0x00000040: 92 e2 bb 4f 71 e3 00 ec a2 be 6a fa 6c 51 45 b9
0x00000050: 00 ef 0f df 44 9e a8 c1 3d 83 16 1e 05 bd e5 6d
0x00000060: 55 3c 79 e7 24 1f 2e 7f 60 cc 43 ed 43 30 c8 fb
0x00000070: ae a6 d3 dd 90 2e 01 a1 27 d2 b5 26 58 4c 7b 65
0x00000080: 8c 83 3a a0 a1 01 78 15 07 44 4f 48 4a db af a1
0x00000090: 32 3e 12 08 00 cf 98 86 65 c8 bc c0 5a 05 78 1c
0x000000a0: 79 af 88 63 c3 e4 e2 eb 90 2d 2a aa 53 16 bf 22
0x000000b0: 2f 81 00 fd 33 b4 4f 58 7d c2 fd 09 0d 94 9d 42
0x000000c0: be ee 85 69 2f 83 e0 fc 15 43 36 52 c4 5c 9d 58
0x000000d0: 02 ec 0c b4 d9 ac c7 16 e7 dc 7d c8 3d d2 43 a0
0x000000e0: 62 12 c8 af 1f bb ff e8 44 e6 8a 7c 04 54 b7 d7
0x000000f0: ca 32 2e 4d bc 54 21 a4 00 e6 bf 1c d3 b0 c9 8d
...[trim]...
0x00000f10: 0b 9c cb d4 e1 f6 cb 62 f6 93 9f 48 8d cc af 53
0x00000f20: b0 ae 99 e6 0b 99 65 1e 0c e0 6f 06 5d 64 75 16
0x00000f30: 82 eb 09 0a 7d 39 a5 23 ae 71 56 1a d2 0e 59 20
0x00000f40: f3 48 bf 6c ea 00 9d 7a 10 e3 16 b8 d6 5f d9 2f
0x00000f50: 28 f8 28 1d 0e df 41 05 32 5b 0f 02 28 ea 5f 8f
0x00000f60: a6 80 da 34 1c 3f a3 09 90 dc 95 e2 fe 5d 56 12
0x00000f70: d0 6e 59 5f 75 81 43 72 99 d9 44 fb 3e 15 09 da
0x00000f80: 8d 17 c1 90 56 22 6b c2 b9 47 11 c3 f0 ad 32 63
0x00000f90: a4 a5 45 8b e6 f6 81 4a 2b d5 e2 6f ae a0 d5 c7
0x00000fa0: 76 9c f4 f2 4c 70 7a 48 bb 6a 5e 8a ad 8f 0f 82
0x00000fb0: c0 4f 47 74 4d 01 cb 1e d1 f0 19 3a fa 91 5a e0
0x00000fc0: 63 d8 7e 95 27 04 79 99 15 6b 50 d1 39 9d 30 3c
0x00000fd0: d5 82 8a f5 ec 59 d0 41 4f 1b 1c 68 b4 1e 40 de
0x00000fe0: 9b e5 31 16 f3 01 e7 a7 c4 9f 48 24 67 61 76 4e
0x00000ff0: 9a bc ba 63 74 39 56 c6 6b d4 c2 ce 4e 43 e6 1d
   OOB Data: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
   OOB Data: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
   OOB Data: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
   OOB Data: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
   OOB Data: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
   OOB Data: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
   OOB Data: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
   OOB Data: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

Shouldn't there be ECC information in the last 48 bytes of the OOB Data section? 
  My NAND driver is setup for NAND_ECC_SOFT.

I'm wondering if I missed some other things to patch at the MTD level.  I 
applied the following changes to the Kernel to support the 4K NAND part.

Index: linux/drivers/mtd/nand/nand_base.c
diff -c linux/drivers/mtd/nand/nand_base.c:1.1.2.2.2.1 
linux/drivers/mtd/nand/nand_base.c:1.1.2.2.2.1.2.1 
                                    *** 
linux/drivers/mtd/nand/nand_base.c:1.1.2.2.2.1  Thu Dec  6 18:25:34 2007 
  --- linux/drivers/mtd/nand/nand_base.c  Wed Jul  8 12:51:53 2009 
        *************** 
              *** 81,86 **** 
                    --- 81,100 ---- 
                                 .length = 38}} 
                                  }; 
 
                                            + static struct nand_ecclayout 
nand_oob_128 = {                                      +   .eccbytes = 48, 
                                                            +   .eccpos = { 
                                                                  +        80, 
81, 82, 83, 84, 85, 86, 87,                                             + 
  88, 89, 90, 91, 92, 93, 94, 95,                                             + 
        96, 97, 98, 99, 100, 101, 102, 103, 
     +        104, 105, 106, 107, 108, 109, 110, 111, 
           +        112, 113, 114, 115, 116, 117, 118, 119, 
                 +        120, 121, 122, 123, 124, 125, 126, 127}, 
                       +   .oobfree = { 
                             +     {.offset = 2, 
                                   +      .length = 78}} 
                                         + }; 
                                               + 
                                                       static int 
nand_get_device(struct nand_chip *chip, struct mtd_info *mtd, 
    int new_state);
 

*************** 
      *** 2403,2408 **** 
            --- 2417,2425 ---- 
                        case 64: 
                                chip->ecc.layout = &nand_oob_64; 
                                      break; 
                                    +     case 128: 
                                          +       chip->ecc.layout = 
&nand_oob_128;                                            +       break; 
                                                                      default:
         printk(KERN_WARNING "No oob scheme defined for "
                "oobsize %d\n", mtd->oobsize);
***************
*** 2518,2523 ****
--- 2535,2541 ----
         break;
       case 4:
       case 8:
+     case 16:
         mtd->subpage_sft = 2;
         break;
       }
Index: linux/include/linux/mtd/nand.h
diff -c linux/include/linux/mtd/nand.h:1.1.8.3 
linux/include/linux/mtd/nand.h:1.1.8.3.4.1
*** linux/include/linux/mtd/nand.h:1.1.8.3  Thu Dec  6 15:43:10 2007
--- linux/include/linux/mtd/nand.h  Wed Jul  8 12:51:53 2009
***************
*** 45,52 ****
    * is supported now. If you add a chip with bigger oobsize/page
    * adjust this accordingly.
    */
! #define NAND_MAX_OOBSIZE  64
! #define NAND_MAX_PAGESIZE 2048

   /*
    * Constants for hardware specific CLE/ALE/NCE function
--- 45,52 ----
    * is supported now. If you add a chip with bigger oobsize/page
    * adjust this accordingly.
    */
! #define NAND_MAX_OOBSIZE  128
! #define NAND_MAX_PAGESIZE 4096

   /*
    * Constants for hardware specific CLE/ALE/NCE function

Thanks,
Andrew
Iders Inc.

                 reply	other threads:[~2009-08-04 21:48 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4A78A76F.4080702@iders.ca \
    --to=amckay@iders.ca \
    --cc=linux-mtd@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.