From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail.bootlin.com ([62.4.15.54]:39729 "EHLO mail.bootlin.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726220AbeIDRhz (ORCPT ); Tue, 4 Sep 2018 13:37:55 -0400 Date: Tue, 4 Sep 2018 15:12:37 +0200 From: Boris Brezillon To: Boris Brezillon , Richard Weinberger , Miquel Raynal , linux-mtd@lists.infradead.org Cc: David Woodhouse , Brian Norris , Marek Vasut , Linus Walleij , stable@vger.kernel.org Subject: Re: [PATCH] mtd: rawnand: fsmc: Fix Hamming ECC Message-ID: <20180904151237.11c3c609@bbrezillon> In-Reply-To: <20180904091438.3755-1-boris.brezillon@bootlin.com> References: <20180904091438.3755-1-boris.brezillon@bootlin.com> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Sender: stable-owner@vger.kernel.org List-ID: On Tue, 4 Sep 2018 11:14:38 +0200 Boris Brezillon wrote: > Apparently ECC bytes are not ordered as expected by nand_correct_data() > in the ecc_calc buffer which leads to invalid bitflip correction when > an ECC error is detected (can be reproduced with 'nandbiterrs -i'). > > Re-ordering ECC bytes seems to fix the problem. > > While at it, get rid of the useless u8 cast. > > Fixes: 6c009ab89a21 ("mtd: generic FSMC NAND MTD driver") > Cc: > Signed-off-by: Boris Brezillon > --- > drivers/mtd/nand/raw/fsmc_nand.c | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/mtd/nand/raw/fsmc_nand.c b/drivers/mtd/nand/raw/fsmc_nand.c > index f418236fa020..c79f8e965b38 100644 > --- a/drivers/mtd/nand/raw/fsmc_nand.c > +++ b/drivers/mtd/nand/raw/fsmc_nand.c > @@ -440,9 +440,9 @@ static int fsmc_read_hwecc_ecc1(struct mtd_info *mtd, const uint8_t *data, > uint32_t ecc_tmp; > > ecc_tmp = readl_relaxed(host->regs_va + ECC1); > - ecc[0] = (uint8_t) (ecc_tmp >> 0); > - ecc[1] = (uint8_t) (ecc_tmp >> 8); > - ecc[2] = (uint8_t) (ecc_tmp >> 16); > + ecc[0] = ecc_tmp >> 8; > + ecc[1] = ecc_tmp; > + ecc[2] = ecc_tmp >> 16; Hm, looks like there's a Kconfig option (CONFIG_MTD_NAND_ECC_SMC) to let nand_ecc_correct() swap those 2 bytes for us, but it's clearly not a good thing to take this decision based on a Kconfig option (does not work if you want the same kernel to be used on various platforms). I'll come up with a better solution.