From: s.hauer@pengutronix.de (Sascha Hauer)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 6/8] mxc_nand: fix correct_data function
Date: Fri, 6 Aug 2010 15:53:09 +0200 [thread overview]
Message-ID: <1281102791-8089-7-git-send-email-s.hauer@pengutronix.de> (raw)
In-Reply-To: <1281102791-8089-1-git-send-email-s.hauer@pengutronix.de>
The v2 controller has a totally different mechanism to check
whether the data we read had ecc errors or not. Implement this.
The mechanism in the v2 controller happens to be identical to
the v3 controller.
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
---
drivers/mtd/nand/mxc_nand.c | 42 ++++++++++++++++++++++++++++++++++++++++--
1 files changed, 40 insertions(+), 2 deletions(-)
diff --git a/drivers/mtd/nand/mxc_nand.c b/drivers/mtd/nand/mxc_nand.c
index 48b6dca..a6dc5a5 100644
--- a/drivers/mtd/nand/mxc_nand.c
+++ b/drivers/mtd/nand/mxc_nand.c
@@ -94,6 +94,7 @@ struct mxc_nand_host {
struct clk *clk;
int clk_act;
int irq;
+ int eccsize;
wait_queue_head_t irq_waitq;
@@ -342,7 +343,7 @@ static void mxc_nand_enable_hwecc(struct mtd_info *mtd, int mode)
*/
}
-static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
+static int mxc_nand_correct_data_v1(struct mtd_info *mtd, u_char *dat,
u_char *read_ecc, u_char *calc_ecc)
{
struct nand_chip *nand_chip = mtd->priv;
@@ -364,6 +365,40 @@ static int mxc_nand_correct_data(struct mtd_info *mtd, u_char *dat,
return 0;
}
+static int mxc_nand_correct_data_v2_v3(struct mtd_info *mtd, u_char *dat,
+ u_char *read_ecc, u_char *calc_ecc)
+{
+ struct nand_chip *nand_chip = mtd->priv;
+ struct mxc_nand_host *host = nand_chip->priv;
+ u32 ecc_stat, err;
+ int no_subpages = 1;
+ int ret = 0;
+ u8 ecc_bit_mask, err_limit;
+
+ ecc_bit_mask = (host->eccsize == 4) ? 0x7 : 0xf;
+ err_limit = (host->eccsize == 4) ? 0x4 : 0x8;
+
+ no_subpages = mtd->writesize >> 9;
+
+ ecc_stat = readl(NFC_V1_V2_ECC_STATUS_RESULT);
+
+ do {
+ err = ecc_stat & ecc_bit_mask;
+ if (err > err_limit) {
+ printk(KERN_WARNING "UnCorrectable RS-ECC Error\n");
+ return -1;
+ } else {
+ ret += err;
+ }
+ ecc_stat >>= 4;
+ } while (--no_subpages);
+
+ mtd->ecc_stats.corrected += ret;
+ pr_debug("%d Symbol Correctable RS-ECC Error\n", ret);
+
+ return ret;
+}
+
static int mxc_nand_calculate_ecc(struct mtd_info *mtd, const u_char *dat,
u_char *ecc_code)
{
@@ -790,7 +825,10 @@ static int __init mxcnd_probe(struct platform_device *pdev)
if (pdata->hw_ecc) {
this->ecc.calculate = mxc_nand_calculate_ecc;
this->ecc.hwctl = mxc_nand_enable_hwecc;
- this->ecc.correct = mxc_nand_correct_data;
+ if (nfc_is_v1())
+ this->ecc.correct = mxc_nand_correct_data_v1;
+ else
+ this->ecc.correct = mxc_nand_correct_data_v2_v3;
this->ecc.mode = NAND_ECC_HW;
} else {
this->ecc.mode = NAND_ECC_SOFT;
--
1.7.1
next prev parent reply other threads:[~2010-08-06 13:53 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-08-06 13:53 Add i.MX51 support to mxc_nand Sascha Hauer
2010-08-06 13:53 ` [PATCH 1/8] mxc_nand: remove 0xe00 offset from registers Sascha Hauer
2010-08-06 13:53 ` [PATCH 2/8] mxc_nand: rework get_dev_status Sascha Hauer
2010-08-06 13:53 ` [PATCH 3/8] mxc_nand: make some internally used functions overwriteable Sascha Hauer
2010-08-06 13:53 ` [PATCH 4/8] mxc_nand: factor out a check_int function Sascha Hauer
2010-08-06 13:53 ` [PATCH 5/8] mxc_nand: add V1_V2 namespace to registers Sascha Hauer
2010-08-06 13:53 ` Sascha Hauer [this message]
2010-08-08 6:19 ` [PATCH 6/8] mxc_nand: fix correct_data function Baruch Siach
2010-08-08 20:44 ` Sascha Hauer
2010-08-08 8:19 ` Russell King - ARM Linux
2010-08-08 8:32 ` Baruch Siach
2010-08-08 20:43 ` Sascha Hauer
2010-08-08 22:10 ` Russell King - ARM Linux
2010-08-09 4:20 ` [PATCH] nand: fix .correct callback return value check Baruch Siach
2010-08-12 5:42 ` Baruch Siach
2010-08-29 11:01 ` Artem Bityutskiy
2010-08-06 13:53 ` [PATCH 7/8] mxc_nand: support 8bit ecc Sascha Hauer
2010-08-06 13:53 ` [PATCH 8/8] mxc_nand: Add v3 (i.MX51) Support Sascha Hauer
2010-08-09 11:38 ` [PATCH 0/2] mxc_nand: fixes for purposed updates Baruch Siach
2010-08-09 11:38 ` [PATCH 1/2] mxc_nand: fix build error Baruch Siach
2010-08-09 12:28 ` Sascha Hauer
2010-08-09 11:38 ` [PATCH 2/2] mxc_nand: remove unused variables Baruch Siach
2010-08-09 12:34 ` Lothar Waßmann
2010-08-09 11:53 ` [PATCH 0/2] mxc_nand: fixes for purposed updates David Woodhouse
2010-08-09 12:19 ` Baruch Siach
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=1281102791-8089-7-git-send-email-s.hauer@pengutronix.de \
--to=s.hauer@pengutronix.de \
--cc=linux-arm-kernel@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).