mtd: omap2 fix prefetch mode read issue
authorVimal Singh <vimal.newwork@gmail.com>
Thu, 7 Jan 2010 06:46:26 +0000 (12:16 +0530)
committerDavid Woodhouse <David.Woodhouse@intel.com>
Fri, 26 Feb 2010 16:51:23 +0000 (16:51 +0000)
There is a bug in nand prefetch read routine, which comes into effect
only if nand device is a 16-bit device (as we have in zoom boards).
This bug is effective only with below combination of conditions:
1. nand deivce, in use, is a 16 bit device
2. nand driver supports 'subpage' read
3. SW ECC is in use

This was not seen old  kernel (ex: .23), because when, in early days,
we tested this (nand prefetch read in LDP boards) there was no
'subpage read' support.
Later when we had subpage read in (.27) kernel, we had hw ecc enabled
always in our internal tree. So, we missed this bug.

This patch fixes the issue.

Signed-off-by: Vimal Singh <vimalsingh@ti.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
drivers/mtd/nand/omap2.c

index 16120e2dd4a3d6229a2e4a3de6cea991436f8201..7df303aed8a44db682db1fa844746eb816e454cb 100644 (file)
@@ -295,11 +295,14 @@ static void omap_read_buf_pref(struct mtd_info *mtd, u_char *buf, int len)
        u32 *p = (u32 *)buf;
 
        /* take care of subpage reads */
-       for (; len % 4 != 0; ) {
-               *buf++ = __raw_readb(info->nand.IO_ADDR_R);
-               len--;
+       if (len % 4) {
+               if (info->nand.options & NAND_BUSWIDTH_16)
+                       omap_read_buf16(mtd, buf, len % 4);
+               else
+                       omap_read_buf8(mtd, buf, len % 4);
+               p = (u32 *) (buf + len % 4);
+               len -= len % 4;
        }
-       p = (u32 *) buf;
 
        /* configure and start prefetch transfer */
        ret = gpmc_prefetch_enable(info->gpmc_cs, 0x0, len, 0x0);