[FRC] [PATCH] MTD: nand_base.c: Enable support for Samsung E-die SLC NAND

Ted Juan ted.juan at gmail.com
Tue Jun 24 23:17:26 PDT 2014


Dear Pekon,

I backup the raw data to data2[] before doing elm_decode_bch_error_page();
Dump  code is as below. The raw data is the same with the correction
data that all more than 8 bit-flips.

The full data log is put as below but include some useless dump data.
https://drive.google.com/file/d/0BwVGpNFs7l22RmZXTHhJWXFYYWs/edit?usp=sharing


The K9F1G08U0E datasheet is also put as below.
https://drive.google.com/file/d/0BwVGpNFs7l22SUwtc3BPYTVyLWM/edit?usp=sharing


The datasheet say ECC requirement : 1 bit / 528bytes but I doubt what it say.



+static char data2[2048];
@@ -1298,12 +1308,17 @@ static int omap_elm_correct_data(struct
mtd_info *mtd, u_char *data,
        enum omap_bch_ecc type;
        bool is_error_reported = false;
        int err,bitflip_count;
+        char read_ecc2[52];
+        char calc_ecc2[52];
+
+        memcpy(read_ecc2, read_ecc, 52);
+        memcpy(calc_ecc2, calc_ecc, 52);
+        memcpy(data2, data, 2048);

@@ -1395,24 +1408,37 @@ static int omap_elm_correct_data(struct
mtd_info *mtd, u_char *data,
        err = 0;
        for (i = 0; i < eccsteps; i++) {
        if (err_vec[i].error_uncorrectable) {

+                          u_char *dat = &data[0];
+                          int k=0;
+                          for (k = 0; k < 512 ; k+=16)
+                                        printk("[0x%04x] 0x%08x
0x%08x 0x%08x 0x%08x \n",
+                                                k, *(int *)&dat[k],
*(int *)&dat[k+4], *(int *)&dat[k+8], *(int *)&dat[k+0xc]);
+
+                          dat = &data2[i*512];
+                          for (k = 0; k < 512 ; k+=16)
+                                        printk("[0x%04x] 0x%08x
0x%08x 0x%08x 0x%08x \n",
+                                                k, *(int *)&dat[k],
*(int *)&dat[k+4], *(int *)&dat[k+8], *(int *)&dat[k+0xc]);
+
                          printk("nand: uncorrectable bit-flips found\n");
                          err = -EBADMSG;
                 } else if (err_vec[i].error_reported) {


========after correction data (data[])

[    5.842346] [0x0000] 0xffffffff 0xffffefbf 0xffffffff 0xffffffff
[    5.848999] [0x0010] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    5.855651] [0x0020] 0xffffffff 0xffffffff 0xffffffff 0xfffffbef
[    5.862274] [0x0030] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    5.868927] [0x0040] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    5.875579] [0x0050] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    5.882232] [0x0060] 0xffffffff 0xffffffff 0xffffffff 0xfffff7ff
[    5.888854] [0x0070] 0xffffffff 0xffffffff 0xfffffffe 0xffffffff
[    5.895507] [0x0080] 0xffffffff 0xfffff7df 0xffffffff 0xffffffff
[    5.902160] [0x0090] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    5.908813] [0x00a0] 0xffffffff 0xffffffff 0xffffffff 0xffffbfff
[    5.915466] [0x00b0] 0xffffffff 0xffffffff 0xfffff7ff 0xffffffff
[    5.922088] [0x00c0] 0xffffffff 0xfffffffe 0xffffffff 0xffffffff
[    5.928741] [0x00d0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    5.935394] [0x00e0] 0xffffffff 0xffffffff 0xffffffff 0xffffffbf
[    5.942016] [0x00f0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    5.948669] [0x0100] 0xffffffff 0xffffffeb 0xffffffff 0xffffffff
[    5.955322] [0x0110] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    5.961975] [0x0120] 0xffffffff 0xffffffff 0xffffffff 0xfffffefd
[    5.968627] [0x0130] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    5.975280] [0x0140] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    5.982025] [0x0150] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    5.988739] [0x0160] 0xffffffff 0xffffffff 0xffffffff 0xffff3fff
[    5.995391] [0x0170] 0xffffffff 0xffffffff 0xffffff7f 0xffffffff
[    6.002014] [0x0180] 0xffffffff 0xfffffdff 0xffffffff 0xffffffff
[    6.008666] [0x0190] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.015319] [0x01a0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.021972] [0x01b0] 0xffffffff 0xffffffff 0xffffefff 0xffffffff
[    6.028625] [0x01c0] 0xffffffff 0xfffffeff 0xefffffff 0xffffffff
[    6.035278] [0x01d0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.041900] [0x01e0] 0xffffffff 0xffffffff 0xffffffff 0xffffff7f
[    6.048553] [0x01f0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff

=======raw data (data2[]) , before correction

[    6.065338] [0x0000] 0xffffffff 0xffffefbf 0xffffffff 0xffffffff
[    6.071960] [0x0010] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.078613] [0x0020] 0xffffffff 0xffffffff 0xffffffff 0xfffffbef
[    6.085266] [0x0030] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.091918] [0x0040] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.098571] [0x0050] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.105224] [0x0060] 0xffffffff 0xffffffff 0xffffffff 0xfffff7ff
[    6.111846] [0x0070] 0xffffffff 0xffffffff 0xfffffffe 0xffffffff
[    6.118499] [0x0080] 0xffffffff 0xfffff7df 0xffffffff 0xffffffff
[    6.125152] [0x0090] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.131774] [0x00a0] 0xffffffff 0xffffffff 0xffffffff 0xffffbfff
[    6.138427] [0x00b0] 0xffffffff 0xffffffff 0xfffff7ff 0xffffffff
[    6.145080] [0x00c0] 0xffffffff 0xfffffffe 0xffffffff 0xffffffff
[    6.151763] [0x00d0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.158416] [0x00e0] 0xffffffff 0xffffffff 0xffffffff 0xffffffbf
[    6.165069] [0x00f0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.171691] [0x0100] 0xffffffff 0xffffffeb 0xffffffff 0xffffffff
[    6.178375] [0x0110] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.185028] [0x0120] 0xffffffff 0xffffffff 0xffffffff 0xfffffefd
[    6.191680] [0x0130] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.198364] [0x0140] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.205017] [0x0150] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.211639] [0x0160] 0xffffffff 0xffffffff 0xffffffff 0xffff3fff
[    6.218292] [0x0170] 0xffffffff 0xffffffff 0xffffff7f 0xffffffff
[    6.224945] [0x0180] 0xffffffff 0xfffffdff 0xffffffff 0xffffffff
[    6.231597] [0x0190] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.238250] [0x01a0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.244873] [0x01b0] 0xffffffff 0xffffffff 0xffffefff 0xffffffff
[    6.251525] [0x01c0] 0xffffffff 0xfffffeff 0xefffffff 0xffffffff
[    6.258178] [0x01d0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
[    6.264831] [0x01e0] 0xffffffff 0xffffffff 0xffffffff 0xffffff7f
[    6.271453] [0x01f0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff

2014-06-23 16:15 GMT+08:00 Ted Juan <ted.juan at gmail.com>:
> Dear Pekon,
>
> Thanks help me to debug the issue.
>
> I need some time to reproduce the problem again since the NAND flash
> data have been covered.
>
> I add the test code to dump the data, so the data should be not the raw data.
> The dump data of last mail is erase page since I confirmed the value
> of the read_ecc2[].
> The problem not only happen in erase page, but also in some data page.
> The erase page is easily to observed for me.
> I'll try to read the raw data next time to verify the issue. Thanks much.
>
>
> @@ -1298,12 +1307,16 @@ static int omap_elm_correct_data(struct
> mtd_info *mtd, u_char *data,
>         enum omap_bch_ecc type;
>         bool is_error_reported = false;
>         int err,bitflip_count;
> +        char read_ecc2[52];
> +        char calc_ecc2[52];
> +
> +        memcpy(read_ecc2, read_ecc, 52);
> +        memcpy(calc_ecc2, calc_ecc, 52);
>
> @@ -1395,24 +1406,31 @@ static int omap_elm_correct_data(struct
> mtd_info *mtd, u_char *data,
>         err = 0;
>         for (i = 0; i < eccsteps; i++) {
>         if (err_vec[i].error_uncorrectable) {
> +#if 1 // debug
> +                          u_char *dat = &data[0];
> +                          int k=0;
> +                          for (k = 0; k < 512 ; k+=16)
> +                                        printk("[0x%04x] 0x%08x
> 0x%08x 0x%08x 0x%08x \n",
> +                                                k, *(int *)&dat[k],
> *(int *)&dat[k+4], *(int *)&dat[k+8], *(int *)&dat[k+0xc]);
> +
> +                                printk("i=%d read_ecc2=0x%08x 0x%08x
> 0x%08x calc_ecc2=0x%08x 0x%08x 0x%08x\n",
> +                                        i, *(int
> *)&read_ecc2[i*0xc+0], *(int *)&read_ecc2[i*0xc+4], *(int
> *)&read_ecc2[i*0xc+8],
> +                                        *(int *)&calc_ecc2[i*0xc+0],
> *(int *)&calc_ecc2[i*0xc+4], *(int *)&calc_ecc2[i*0xc+8]);
> +                                printk("nand: uncorrectable bit-flips
> found\n");
> +#endif
>                           err = -EBADMSG;
>                  } else if (err_vec[i].error_reported) {
>
>
> 2014-06-23 12:05 GMT+08:00 Gupta, Pekon <pekon at ti.com>:
>> Hi Ted,
>>
>>>Hi All,
>>>   I recently do the power cut test with this Samsung NAND flash
>>>K9F1G08U0E with TI AM3352 chip.
>>>I have set the NAND_NO_SUBPAGE_WRITE parameter and checked all the
>>>flash timing that are all correct.
>>>But it still happened uncorrectable error that bit-flip more than 8
>>>bits no matter erase page or not.
>>>The below is the wrong data with erase page that bit-flip more than 8 bits .
>>>
>>>Does anyone have the same experience?
>>>
>>>PS. The Samsung D-die SLC NAND is test OK in the same environment. And
>>>the TI driver code is base on the latest l2-mtd git tree.
>>>
>>>regards,
>>>Ted
>>>
>>>
>>>[    7.129791] [0x0000] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.136138] [0x0010] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.142486] [0x0020] 0xfbfdffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.148864] [0x0030] 0xffbfffff 0xffff7fff 0xffffffff 0xffffffff
>>>[    7.155212] [0x0040] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.161590] [0x0050] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.167938] [0x0060] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.174316] [0x0070] 0xf7ffffff 0xfffffcff 0xffffffff 0xffffffff
>>>[    7.180664] [0x0080] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.187042] [0x0090] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.193389] [0x00a0] 0xffbfffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.199737] [0x00b0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.206115] [0x00c0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.212463] [0x00d0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.218841] [0x00e0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.225189] [0x00f0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.231567] [0x0100] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.237915] [0x0110] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.244293] [0x0120] 0xffdfffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.250640] [0x0130] 0xffffffff 0xffff7fff 0xffffffff 0xffffffff
>>>[    7.256988] [0x0140] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.263366] [0x0150] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.269714] [0x0160] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.276092] [0x0170] 0xffffffff 0xffffffdf 0xffffffff 0xffffffff
>>>[    7.282440] [0x0180] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.288818] [0x0190] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.295166] [0x01a0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.301544] [0x01b0] 0xffffffff 0xffffdfff 0xffffffff 0xffffffff
>>>[    7.307891] [0x01c0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.314270] [0x01d0] 0xffffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.320617] [0x01e0] 0xbfffffff 0xffffffff 0xffffffff 0xffffffff
>>>[    7.326995] [0x01f0] 0xffffffff 0xfffff7af 0xffffffff 0xffffffff
>>>
>> Is this the dump of an erased page (with ECC correction),
>> I mean NAND raw read with ECC correction suppressed ?
>> If yes,
>> then if seems that the page was not properly erased, as so many
>> bit-flips should not be seen on a freshly erasing a block. plz check
>> device datasheet for "max possible bit-flips per page or block".
>>
>> If no,
>> Then this can be bit-flips introduced due to incorrect interpretation
>> of ECC syndrome, for that can you plz use below command to
>> dump raw page using below command.
>> nand dump -N -l <page_size> -f <output_file> <device>
>>
>>
>> with regards, pekon



More information about the linux-mtd mailing list