mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: "Rafał Miłecki" <zajec5@gmail.com>
To: Boris Brezillon <boris.brezillon@free-electrons.com>
Cc: linux-mtd@lists.infradead.org, "Rafał Miłecki" <zajec5@gmail.com>,
	"Richard Weinberger" <richard@nod.at>,
	"David Woodhouse" <dwmw2@infradead.org>,
	"Brian Norris" <computersforpeace@gmail.com>,
	linux-kernel@vger.kernel.org (open list)
Subject: [PATCH V2 09/11] mtd: nand: read ECC algorithm from the new field
Date: Sun, 17 Apr 2016 19:11:42 +0200	[thread overview]
Message-ID: <1460913104-27388-10-git-send-email-zajec5@gmail.com> (raw)
In-Reply-To: <1460913104-27388-1-git-send-email-zajec5@gmail.com>

Now we have all drivers properly setting this new field we can start
using it. For a very short period of time we should support both values:
NAND_ECC_SOFT and NAND_ECC_SOFT_BCH treating them the same. It's because
of_get_nand_ecc_mode may still be setting NAND_ECC_SOFT_BCH.

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
V2: Move SOFT-related code to separated functions
    Add missing checks for SOFT before checking Hamming vs. BCH
---
 drivers/mtd/nand/nand_base.c | 116 ++++++++++++++++++++++++++-----------------
 1 file changed, 71 insertions(+), 45 deletions(-)

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index e1f3cf8..d092375 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -4079,6 +4079,69 @@ int nand_scan_ident(struct mtd_info *mtd, int maxchips,
 }
 EXPORT_SYMBOL(nand_scan_ident);
 
+static int nand_set_ecc_soft_ops(struct mtd_info *mtd)
+{
+	struct nand_chip *chip = mtd_to_nand(mtd);
+	struct nand_ecc_ctrl *ecc = &chip->ecc;
+
+	if (WARN_ON(ecc->mode != NAND_ECC_SOFT &&
+		    ecc->mode != NAND_ECC_SOFT_BCH))
+		return -EINVAL;
+
+	switch (ecc->algo) {
+	case NAND_ECC_HAMMING:
+		ecc->calculate = nand_calculate_ecc;
+		ecc->correct = nand_correct_data;
+		ecc->read_page = nand_read_page_swecc;
+		ecc->read_subpage = nand_read_subpage;
+		ecc->write_page = nand_write_page_swecc;
+		ecc->read_page_raw = nand_read_page_raw;
+		ecc->write_page_raw = nand_write_page_raw;
+		ecc->read_oob = nand_read_oob_std;
+		ecc->write_oob = nand_write_oob_std;
+		if (!ecc->size)
+			ecc->size = 256;
+		ecc->bytes = 3;
+		ecc->strength = 1;
+		return 0;
+	case NAND_ECC_BCH:
+		if (!mtd_nand_has_bch()) {
+			WARN(1, "CONFIG_MTD_NAND_ECC_BCH not enabled\n");
+			return -EINVAL;
+		}
+		ecc->calculate = nand_bch_calculate_ecc;
+		ecc->correct = nand_bch_correct_data;
+		ecc->read_page = nand_read_page_swecc;
+		ecc->read_subpage = nand_read_subpage;
+		ecc->write_page = nand_write_page_swecc;
+		ecc->read_page_raw = nand_read_page_raw;
+		ecc->write_page_raw = nand_write_page_raw;
+		ecc->read_oob = nand_read_oob_std;
+		ecc->write_oob = nand_write_oob_std;
+		/*
+		* Board driver should supply ecc.size and ecc.strength
+		* values to select how many bits are correctable.
+		* Otherwise, default to 4 bits for large page devices.
+		*/
+		if (!ecc->size && (mtd->oobsize >= 64)) {
+			ecc->size = 512;
+			ecc->strength = 4;
+		}
+
+		/* See nand_bch_init() for details. */
+		ecc->bytes = 0;
+		ecc->priv = nand_bch_init(mtd);
+		if (!ecc->priv) {
+			WARN(1, "BCH ECC initialization failed!\n");
+			return -EINVAL;
+		}
+		return 0;
+	default:
+		WARN(1, "Unsupported ECC algorithm!\n");
+		return -EINVAL;
+	}
+}
+
 /*
  * Check if the chip configuration meet the datasheet requirements.
 
@@ -4154,7 +4217,9 @@ int nand_scan_tail(struct mtd_info *mtd)
 	/*
 	 * If no default placement scheme is given, select an appropriate one.
 	 */
-	if (!mtd->ooblayout && (ecc->mode != NAND_ECC_SOFT_BCH)) {
+	if (!mtd->ooblayout &&
+	    (ecc->mode == NAND_ECC_SOFT || ecc->mode == NAND_ECC_SOFT_BCH) &&
+	    ecc->algo != NAND_ECC_BCH) {
 		switch (mtd->oobsize) {
 		case 8:
 		case 16:
@@ -4248,54 +4313,13 @@ int nand_scan_tail(struct mtd_info *mtd)
 		ecc->algo = NAND_ECC_HAMMING;
 
 	case NAND_ECC_SOFT:
-		ecc->calculate = nand_calculate_ecc;
-		ecc->correct = nand_correct_data;
-		ecc->read_page = nand_read_page_swecc;
-		ecc->read_subpage = nand_read_subpage;
-		ecc->write_page = nand_write_page_swecc;
-		ecc->read_page_raw = nand_read_page_raw;
-		ecc->write_page_raw = nand_write_page_raw;
-		ecc->read_oob = nand_read_oob_std;
-		ecc->write_oob = nand_write_oob_std;
-		if (!ecc->size)
-			ecc->size = 256;
-		ecc->bytes = 3;
-		ecc->strength = 1;
-		break;
-
 	case NAND_ECC_SOFT_BCH:
-		if (!mtd_nand_has_bch()) {
-			WARN(1, "CONFIG_MTD_NAND_ECC_BCH not enabled\n");
+		ret = nand_set_ecc_soft_ops(mtd);
+		if (ret) {
 			ret = -EINVAL;
 			goto err_free;
 		}
-		ecc->calculate = nand_bch_calculate_ecc;
-		ecc->correct = nand_bch_correct_data;
-		ecc->read_page = nand_read_page_swecc;
-		ecc->read_subpage = nand_read_subpage;
-		ecc->write_page = nand_write_page_swecc;
-		ecc->read_page_raw = nand_read_page_raw;
-		ecc->write_page_raw = nand_write_page_raw;
-		ecc->read_oob = nand_read_oob_std;
-		ecc->write_oob = nand_write_oob_std;
-		/*
-		 * Board driver should supply ecc.size and ecc.strength values
-		 * to select how many bits are correctable. Otherwise, default
-		 * to 4 bits for large page devices.
-		 */
-		if (!ecc->size && (mtd->oobsize >= 64)) {
-			ecc->size = 512;
-			ecc->strength = 4;
-		}
 
-		/* See nand_bch_init() for details. */
-		ecc->bytes = 0;
-		ecc->priv = nand_bch_init(mtd);
-		if (!ecc->priv) {
-			WARN(1, "BCH ECC initialization failed!\n");
-			ret = -EINVAL;
-			goto err_free;
-		}
 		break;
 
 	case NAND_ECC_NONE:
@@ -4478,7 +4502,9 @@ void nand_release(struct mtd_info *mtd)
 {
 	struct nand_chip *chip = mtd_to_nand(mtd);
 
-	if (chip->ecc.mode == NAND_ECC_SOFT_BCH)
+	if ((chip->ecc.mode == NAND_ECC_SOFT ||
+	     chip->ecc.mode == NAND_ECC_SOFT_BCH) &&
+	    chip->ecc.algo == NAND_ECC_BCH)
 		nand_bch_free((struct nand_bch_control *)chip->ecc.priv);
 
 	mtd_device_unregister(mtd);
-- 
1.8.4.5

  parent reply	other threads:[~2016-04-17 17:12 UTC|newest]

Thread overview: 58+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1460750052-16285-1-git-send-email-zajec5@gmail.com>
2016-04-15 19:54 ` [PATCH 01/12] mtd: nand: bf5xx: set ECC algorithm explicitly Rafał Miłecki
2016-04-15 19:54 ` [PATCH 02/12] mtd: nand: davinci: " Rafał Miłecki
2016-04-15 19:54 ` [PATCH 03/12] avr32: set Atmel NAND " Rafał Miłecki
2016-04-16  7:38   ` Boris Brezillon
2016-04-16 12:58   ` Hans-Christian Noren Egtvedt
2016-04-15 19:54 ` [PATCH 04/12] mtd: nand: atmel: set " Rafał Miłecki
2016-04-16  7:40   ` Boris Brezillon
2016-04-15 19:54 ` [PATCH 05/12] CRIS v32: nand: " Rafał Miłecki
2016-04-15 19:54 ` [PATCH 06/12] staging: mt29f_spinand: " Rafał Miłecki
2016-04-15 19:54 ` [PATCH 07/12] mtd: nand: set ECC algorithm to Hamming on fallback Rafał Miłecki
2016-04-15 19:54 ` [PATCH 08/12] mtd: nand: hisi504: set ECC algorithm based on DT info Rafał Miłecki
2016-04-16  7:48   ` Boris Brezillon
2016-04-15 19:54 ` [PATCH 09/12] mtd: nand: fsmc: validate ECC setup by checking algorithm directly Rafał Miłecki
2016-04-15 20:23   ` Joe Perches
2016-04-15 20:24     ` Joe Perches
2016-04-15 20:43       ` Rafał Miłecki
2016-04-15 19:54 ` [PATCH 10/12] mtd: nand: read ECC algorithm from the new field Rafał Miłecki
2016-04-16  7:58   ` Boris Brezillon
2016-04-16  8:11     ` Boris Brezillon
2016-04-17 16:27     ` Rafał Miłecki
2016-04-17 16:50       ` Boris Brezillon
2016-04-17 16:57         ` Boris Brezillon
2016-04-17 16:57         ` Rafał Miłecki
2016-04-15 19:54 ` [PATCH 11/12] of: mtd: drop support for NAND_ECC_SOFT_BCH as "soft_bch" mapping Rafał Miłecki
2016-04-16  8:00   ` Boris Brezillon
2016-04-16  8:01     ` Boris Brezillon
2016-04-15 19:54 ` [PATCH 12/12] mtd: mtd: drop NAND_ECC_SOFT_BCH enum value Rafał Miłecki
2016-04-17 17:05   ` Boris Brezillon
2016-04-17 17:10     ` Rafał Miłecki
2016-04-17 19:01       ` Boris Brezillon
     [not found] ` <1460913104-27388-1-git-send-email-zajec5@gmail.com>
2016-04-17 17:11   ` [PATCH V2 01/11] mtd: nand: bf5xx: set ECC algorithm explicitly Rafał Miłecki
2016-04-17 17:11   ` [PATCH V2 02/11] mtd: nand: davinci: " Rafał Miłecki
2016-04-17 17:11   ` [PATCH V2 03/11] mtd: nand: atmel: " Rafał Miłecki
2016-04-17 17:11   ` [PATCH V2 04/11] CRIS v32: nand: " Rafał Miłecki
2016-04-17 17:11   ` [PATCH V2 05/11] staging: mt29f_spinand: " Rafał Miłecki
2016-04-17 17:11   ` [PATCH V2 06/11] mtd: nand: set ECC algorithm to Hamming on fallback Rafał Miłecki
2016-04-17 17:11   ` [PATCH V2 07/11] mtd: nand: hisi504: set ECC algorithm based on DT info Rafał Miłecki
2016-04-17 17:11   ` [PATCH V2 08/11] mtd: nand: fsmc: validate ECC setup by checking algorithm directly Rafał Miłecki
2016-04-17 17:11   ` Rafał Miłecki [this message]
2016-04-17 18:59     ` [PATCH V2 09/11] mtd: nand: read ECC algorithm from the new field Boris Brezillon
2016-04-17 17:11   ` [PATCH V2 10/11] of: mtd: drop support for NAND_ECC_SOFT_BCH as "soft_bch" mapping Rafał Miłecki
2016-04-17 17:11   ` [PATCH V2 11/11] mtd: mtd: drop NAND_ECC_SOFT_BCH enum value Rafał Miłecki
     [not found]   ` <1460926387-9563-1-git-send-email-zajec5@gmail.com>
2016-04-17 20:52     ` [PATCH V3 01/11] mtd: nand: bf5xx: set ECC algorithm explicitly Rafał Miłecki
2016-04-17 20:52     ` [PATCH V3 02/11] mtd: nand: davinci: " Rafał Miłecki
2016-04-17 20:52     ` [PATCH V3 03/11] mtd: nand: atmel: " Rafał Miłecki
2016-04-17 20:53     ` [PATCH V3 04/11] CRIS v32: nand: " Rafał Miłecki
2016-04-21 20:18       ` Boris Brezillon
2016-04-21 20:44       ` Mikael Starvik
2016-04-22  7:26       ` Jesper Nilsson
2016-04-17 20:53     ` [PATCH V3 05/11] staging: mt29f_spinand: " Rafał Miłecki
2016-04-21 20:20       ` Boris Brezillon
2016-04-22  2:32         ` Greg Kroah-Hartman
2016-04-17 20:53     ` [PATCH V3 06/11] mtd: nand: set ECC algorithm to Hamming on fallback Rafał Miłecki
2016-04-17 20:53     ` [PATCH V3 07/11] mtd: nand: hisi504: set ECC algorithm based on DT info Rafał Miłecki
2016-04-17 20:53     ` [PATCH V3 08/11] mtd: nand: fsmc: validate ECC setup by checking algorithm directly Rafał Miłecki
2016-04-17 20:53     ` [PATCH V3 09/11] mtd: nand: read ECC algorithm from the new field Rafał Miłecki
2016-04-17 20:53     ` [PATCH V3 10/11] of: mtd: drop support for NAND_ECC_SOFT_BCH as "soft_bch" mapping Rafał Miłecki
2016-04-17 20:53     ` [PATCH V3 11/11] mtd: mtd: drop NAND_ECC_SOFT_BCH enum value Rafał Miłecki

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=1460913104-27388-10-git-send-email-zajec5@gmail.com \
    --to=zajec5@gmail.com \
    --cc=boris.brezillon@free-electrons.com \
    --cc=computersforpeace@gmail.com \
    --cc=dwmw2@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mtd@lists.infradead.org \
    --cc=richard@nod.at \
    /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

all inboxes | Powered by JetHome®