From patchwork Wed Dec 23 09:33:41 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: vimal singh X-Patchwork-Id: 41657 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from bombadil.infradead.org (bombadil.infradead.org [18.85.46.34]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 1DBA2B7BBA for ; Wed, 23 Dec 2009 20:35:53 +1100 (EST) Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.69 #1 (Red Hat Linux)) id 1NNNbg-0004Kz-HC; Wed, 23 Dec 2009 09:34:12 +0000 Received: from mail-bw0-f212.google.com ([209.85.218.212]) by bombadil.infradead.org with esmtp (Exim 4.69 #1 (Red Hat Linux)) id 1NNNbX-00044z-O0; Wed, 23 Dec 2009 09:34:08 +0000 Received: by bwz4 with SMTP id 4so4680637bwz.2 for ; Wed, 23 Dec 2009 01:34:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:from:date:message-id :subject:to:content-type; bh=RpfJHWXo6S1EH2Z3SpFxZX5KOl1uXZGqFZTgCD0LwNY=; b=sjt6BhQ8LQeP4LoEeaG+daPcTr0tNv+i2mOEbAWhGabjVNqlTDEz8+xLhd9jkAzCH8 ksbdfNqKJfnsGQWvlG1Z+LFmJP40ZRTi0BPQoh+sRJx5ifR3DeoQvOtB6QmfaKxcXfoX 7Z5K1HNmvMUN5uXpYOPyQuk7X6DPQB7q3U4Gk= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:from:date:message-id:subject:to:content-type; b=B6ZshqAc5TDaIuiYaZoX7Ul/LdUjZnnw6u1fI0LOE9GJQmMPSSeuJZkVTDebIn2fzR htu1FklYYuQJqqvTA/i06ZkmlughlQ+Gv3MOXvCqfK/m6qBWztdAwq+Xe5N3HOVpvybx Dv/ArI2+IzaVZur5StNA5evDOzWJIPj4ZNFYE= MIME-Version: 1.0 Received: by 10.204.5.66 with SMTP id 2mr1705748bku.198.1261560841216; Wed, 23 Dec 2009 01:34:01 -0800 (PST) From: Vimal Singh Date: Wed, 23 Dec 2009 15:03:41 +0530 Message-ID: Subject: Issue in oamp nand driver with 32-bit reads in prefetch mode To: linux-omap@vger.kernel.org, Linux MTD , linux-arm-kernel@lists.infradead.org X-CRM114-Version: 20090807-BlameThorstenAndJenny ( TRE 0.7.6 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20091223_043403_906969_CE13BA32 X-CRM114-Status: GOOD ( 12.20 ) X-Spam-Score: 0.0 (/) X-Spam-Report: SpamAssassin version 3.2.5 on bombadil.infradead.org summary: Content analysis details: (0.0 points) pts rule name description ---- ---------------------- -------------------------------------------------- _SUMMARY_ X-BeenThere: linux-mtd@lists.infradead.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: Linux MTD discussion mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-mtd-bounces@lists.infradead.org Errors-To: linux-mtd-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org In omap nand driver we used to do 32-bit reads (in function omap_read_buf_pref, using 'ioread32_rep' i.e.: __raw_readsl), and it was working fine till some time back. But now, somehow, this has got some problem. Reads are not being done successfully, and driver gives lots for error reprot like below: td->read(0x604 bytes from 0x1fc) returned ECC error uncorrectable error : uncorrectable error : uncorrectable error : uncorrectable error : uncorrectable error : uncorrectable error : mtd->read(0x520 bytes from 0x2e0) returned ECC error While if we change 32-bit reads to 16-bit reads (using 'ioread16_rep' i.e.: __raw_readwl) makes it working fine. (A patch to do this is listed below at the bottom of this mail.) I have not seen any change in routine '__raw_readsl'. So, could someone help me find out the root cause the issue? Thanks for any input. diff --git a/drivers/mtd/nand/omap2.c b/drivers/mtd/nand/omap2.c index aaef170..dc493f5 100644 --- a/drivers/mtd/nand/omap2.c +++ b/drivers/mtd/nand/omap2.c @@ -288,14 +288,14 @@ static void omap_read_buf_pref(struct mtd_info struct omap_nand_info, mtd); uint32_t pfpw_status = 0, r_count = 0; int ret = 0; - u32 *p = (u32 *)buf; + u16 *p = (u16 *)buf; /* take care of subpage reads */ - for (; len % 4 != 0; ) { + for (; len % 2 != 0; ) { *buf++ = __raw_readb(info->nand.IO_ADDR_R); len--; } - p = (u32 *) buf; + p = (u16 *) buf; /* configure and start prefetch transfer */ ret = gpmc_prefetch_enable(info->gpmc_cs, 0x0, len, 0x0); @@ -308,10 +308,10 @@ static void omap_read_buf_pref(struct mtd_info *mtd, u_char *buf, int len) } else { do { pfpw_status = gpmc_prefetch_status(); - r_count = ((pfpw_status >> 24) & 0x7F) >> 2; - ioread32_rep(info->nand_pref_fifo_add, p, r_count); + r_count = ((pfpw_status >> 24) & 0x7F) >> 1; + ioread16_rep(info->nand_pref_fifo_add, p, r_count); p += r_count; - len -= r_count << 2; + len -= r_count << 1; } while (len);