Problems in TI omap2-nand driver OMAP_ECC_BCH8_CODE_HW_DETECTION_SW mode

Gupta, Pekon pekon at ti.com
Mon May 12 23:23:35 PDT 2014


Hi Ted,

From: Ted Juan
>
>Hi All,
>
>Sorry, there is no problem. I got it.
>
>The latest bch.c decode_bch() has XOR read_ecc and calc_ecc in it.
>

And IIRC, this also takes care of filtering out "empty-pages" (OOB=all(0xff)).
because while calculating ECC_BCH8_CODE_HW_DETECTION_SW
resultant GPMC ECC syndrome is XORed with a static bch8_polynomial[]
in omap_calculate_ecc_bch().

So, decode_bch() should handle both the checks implicitly:
- checking for bit-flip errors by matching read_ecc[] and calc_ecc[]
- filtering out "empty-pages" by comparing read_ecc[] with 0xff.

Otherwise you would have started seeing lot of un-correctable errors
while mounting UBIFS.


with regards, pekon

>
>
>2014-05-12 16:08 GMT+08:00 Ted Juan <ted.juan at gmail.com>:
>> Hi All,
>>
>> TI am3517/3505 can use the  OMAP_ECC_BCH8_CODE_HW_DETECTION_SW mode in
>> the latest linux-mtd git tree.
>>
>> I post the latest driver and older driver as below.
>>
>> Wouldn't the latest driver get bad performance since it always do the
>> decode_bch() ?
>>
>> Thanks,
>> regards,
>>
>> Ted
>>
>>
>> ==========the latest omap2.c driver==========
>>
>> int nand_bch_correct_data(struct mtd_info *mtd, unsigned char *buf,
>>                           unsigned char *read_ecc, unsigned char *calc_ecc)
>> {
>>         const struct nand_chip *chip = mtd->priv;
>>         struct nand_bch_control *nbc = chip->ecc.priv;
>>         unsigned int *errloc = nbc->errloc;
>>         int i, count;
>>
>>         count = decode_bch(nbc->bch, NULL, chip->ecc.size, read_ecc, calc_ecc,
>>                            NULL, errloc);
>>         if (count > 0) {
>>
>>        ......................
>> }
>>
>>
>> ==========older omap2.c driver==========
>>
>> static int omap_correct_data_bch(int correct_bits, struct mtd_info *mtd,
>>                                  uint8_t *dat, uint8_t *read_ecc,
>>                                  uint8_t *calc_ecc)
>> {
>>
>>   ..................
>>
>>   for (i = 0; i < blockCnt; i++) {
>>     /* check if any ecc error */
>>     eccflag = 0;
>>     for (j = 0; (j < eccsize) && (eccflag == 0); j++)
>>       if (calc_ecc[j] != 0)
>>        eccflag = 1;
>>
>>     if (eccflag == 1) {
>>       eccflag = 0;
>>       for (j = 0; (j < eccsize) && (eccflag == 0); j++)
>>        if (read_ecc[j] != 0xFF)
>>          eccflag = 1;
>>     }
>>
>>     if (eccflag == 1) {
>>       /*printk(KERN_INFO "...bch correct(%d 512 byte)\n", i+1);*/
>>       count = decode_bch(mode, calc_ecc, err_loc);
>>
>>   ...............
>>
>>
>> }
>




More information about the linux-mtd mailing list