From: Boris Brezillon <boris.brezillon@free-electrons.com>
To: Masahiro Yamada <yamada.masahiro@socionext.com>
Cc: linux-mtd@lists.infradead.org, linux-kernel@vger.kernel.org,
Marek Vasut <marek.vasut@gmail.com>,
Brian Norris <computersforpeace@gmail.com>,
Richard Weinberger <richard@nod.at>,
David Woodhouse <dwmw2@infradead.org>,
Cyrille Pitchen <cyrille.pitchen@atmel.com>
Subject: Re: [PATCH 15/39] mtd: nand: denali: improve readability of handle_ecc()
Date: Sun, 27 Nov 2016 16:34:19 +0100 [thread overview]
Message-ID: <20161127163419.556a3307@bbrezillon> (raw)
In-Reply-To: <1480183585-592-16-git-send-email-yamada.masahiro@socionext.com>
On Sun, 27 Nov 2016 03:06:01 +0900
Masahiro Yamada <yamada.masahiro@socionext.com> wrote:
> This function is unreadable due to the deep nesting. Note this
> function does a job only when INTR_STATUS__ECC_ERR is set.
> So, if the flag is not set, let it bail-out.
>
> Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com>
> ---
>
> drivers/mtd/nand/denali.c | 119 +++++++++++++++++++++++-----------------------
> 1 file changed, 59 insertions(+), 60 deletions(-)
>
> diff --git a/drivers/mtd/nand/denali.c b/drivers/mtd/nand/denali.c
> index a7dc692..b577560 100644
> --- a/drivers/mtd/nand/denali.c
> +++ b/drivers/mtd/nand/denali.c
> @@ -908,69 +908,68 @@ static bool handle_ecc(struct denali_nand_info *denali, u8 *buf,
> {
> bool check_erased_page = false;
> unsigned int bitflips = 0;
> + u32 err_address, err_correction_info, err_byte, err_sector, err_device,
> + err_correction_value;
Please use single line definitions for local variables:
u32 err_address, err_correction_info, err_byte, err_sector;
u32 err_device, err_correction_value;
Also, maybe you should use shorter names to avoid 80 chars wrapping as
much as possible.
>
> - if (irq_status & INTR_STATUS__ECC_ERR) {
> - /* read the ECC errors. we'll ignore them for now */
> - u32 err_address, err_correction_info, err_byte,
> - err_sector, err_device, err_correction_value;
> - denali_set_intr_modes(denali, false);
> -
> - do {
> - err_address = ioread32(denali->flash_reg +
> - ECC_ERROR_ADDRESS);
> - err_sector = ECC_SECTOR(err_address);
> - err_byte = ECC_BYTE(err_address);
> -
> - err_correction_info = ioread32(denali->flash_reg +
> - ERR_CORRECTION_INFO);
> - err_correction_value =
> + if (!(irq_status & INTR_STATUS__ECC_ERR))
> + goto out;
> +
> + /* read the ECC errors. we'll ignore them for now */
> + denali_set_intr_modes(denali, false);
> +
> + do {
> + err_address = ioread32(denali->flash_reg + ECC_ERROR_ADDRESS);
> + err_sector = ECC_SECTOR(err_address);
> + err_byte = ECC_BYTE(err_address);
> +
> + err_correction_info = ioread32(denali->flash_reg +
> + ERR_CORRECTION_INFO);
> + err_correction_value =
> ECC_CORRECTION_VALUE(err_correction_info);
> - err_device = ECC_ERR_DEVICE(err_correction_info);
> -
> - if (ECC_ERROR_CORRECTABLE(err_correction_info)) {
> - /*
> - * If err_byte is larger than ECC_SECTOR_SIZE,
> - * means error happened in OOB, so we ignore
> - * it. It's no need for us to correct it
> - * err_device is represented the NAND error
> - * bits are happened in if there are more
> - * than one NAND connected.
> - */
> - if (err_byte < ECC_SECTOR_SIZE) {
> - struct mtd_info *mtd =
> - nand_to_mtd(&denali->nand);
> - int offset;
> -
> - offset = (err_sector *
> - ECC_SECTOR_SIZE +
> - err_byte) *
> - denali->devnum +
> - err_device;
> - /* correct the ECC error */
> - buf[offset] ^= err_correction_value;
> - mtd->ecc_stats.corrected++;
> - bitflips++;
> - }
> - } else {
> - /*
> - * if the error is not correctable, need to
> - * look at the page to see if it is an erased
> - * page. if so, then it's not a real ECC error
> - */
> - check_erased_page = true;
> + err_device = ECC_ERR_DEVICE(err_correction_info);
> +
> + if (ECC_ERROR_CORRECTABLE(err_correction_info)) {
> + /*
> + * If err_byte is larger than ECC_SECTOR_SIZE, means error
> + * happened in OOB, so we ignore it. It's no need for
> + * us to correct it err_device is represented the NAND
> + * error bits are happened in if there are more than
> + * one NAND connected.
> + */
> + if (err_byte < ECC_SECTOR_SIZE) {
> + struct mtd_info *mtd =
> + nand_to_mtd(&denali->nand);
> + int offset;
> +
> + offset = (err_sector * ECC_SECTOR_SIZE + err_byte) *
> + denali->devnum + err_device;
> + /* correct the ECC error */
> + buf[offset] ^= err_correction_value;
> + mtd->ecc_stats.corrected++;
> + bitflips++;
> }
> - } while (!ECC_LAST_ERR(err_correction_info));
> - /*
> - * Once handle all ecc errors, controller will triger
> - * a ECC_TRANSACTION_DONE interrupt, so here just wait
> - * for a while for this interrupt
> - */
> - while (!(read_interrupt_status(denali) &
> - INTR_STATUS__ECC_TRANSACTION_DONE))
> - cpu_relax();
> - clear_interrupts(denali);
> - denali_set_intr_modes(denali, true);
> - }
> + } else {
> + /*
> + * if the error is not correctable, need to look at the
> + * page to see if it is an erased page. if so, then
> + * it's not a real ECC error
> + */
> + check_erased_page = true;
> + }
> + } while (!ECC_LAST_ERR(err_correction_info));
> +
> + /*
> + * Once handle all ecc errors, controller will triger a
> + * ECC_TRANSACTION_DONE interrupt, so here just wait for
> + * a while for this interrupt
> + */
> + while (!(read_interrupt_status(denali) &
> + INTR_STATUS__ECC_TRANSACTION_DONE))
> + cpu_relax();
> + clear_interrupts(denali);
> + denali_set_intr_modes(denali, true);
> +
> + out:
> *max_bitflips = bitflips;
> return check_erased_page;
> }
next prev parent reply other threads:[~2016-11-27 15:34 UTC|newest]
Thread overview: 115+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-26 18:05 [PATCH 00/39] mtd: nand: denali: 2nd round of Denali NAND IP patch bomb Masahiro Yamada
2016-11-26 18:05 ` [PATCH 01/39] mtd: nand: allow to set only one of ECC size and ECC strength from DT Masahiro Yamada
2016-11-27 13:58 ` Boris Brezillon
2016-11-26 18:05 ` [PATCH 02/39] mtd: nand: denali: remove unused CONFIG option and macros Masahiro Yamada
2016-11-26 18:05 ` [PATCH 03/39] mtd: nand: denali: remove redundant define of BANK(x) Masahiro Yamada
2016-11-26 18:05 ` [PATCH 04/39] mtd: nand: denali: remove more unused struct members Masahiro Yamada
2016-11-27 15:12 ` Boris Brezillon
2016-11-30 7:16 ` Masahiro Yamada
2016-11-30 7:47 ` Boris Brezillon
2016-11-26 18:05 ` [PATCH 05/39] mtd: nand: denali: fix comment of denali_nand_info::flash_mem Masahiro Yamada
2016-11-26 18:05 ` [PATCH 06/39] mtd: nand: denali: fix write_oob_data() function Masahiro Yamada
2016-11-26 18:05 ` [PATCH 07/39] mtd: nand: denali: transfer OOB only when oob_required is set Masahiro Yamada
2016-11-26 18:05 ` [PATCH 08/39] mtd: nand: denali: introduce capability flag Masahiro Yamada
2016-11-26 18:05 ` [PATCH 09/39] mtd: nand: denali: fix erased page check code Masahiro Yamada
2016-11-27 15:21 ` Boris Brezillon
2016-12-02 4:33 ` Masahiro Yamada
2016-12-02 7:57 ` Boris Brezillon
2016-11-26 18:05 ` [PATCH 10/39] mtd: nand: denali: remove redundant if conditional of erased_check Masahiro Yamada
2016-11-26 18:05 ` [PATCH 11/39] mtd: nand: denali: increment ecc_stats.failed by one per error Masahiro Yamada
2016-11-26 18:05 ` [PATCH 12/39] mtd: nand: denali: return 0 for uncorrectable ECC error Masahiro Yamada
2016-11-26 18:05 ` [PATCH 13/39] mtd: nand: denali: increment ecc_stats->corrected Masahiro Yamada
2016-11-27 15:31 ` Boris Brezillon
2016-12-02 4:28 ` Masahiro Yamada
2016-11-26 18:06 ` [PATCH 14/39] mtd: nand: denali: replace uint{8/16/32}_t with u{8/16/32} Masahiro Yamada
2016-11-26 18:06 ` [PATCH 15/39] mtd: nand: denali: improve readability of handle_ecc() Masahiro Yamada
2016-11-27 15:34 ` Boris Brezillon [this message]
2016-11-27 15:42 ` Boris Brezillon
2016-12-02 4:26 ` Masahiro Yamada
2016-12-02 7:55 ` Boris Brezillon
2016-11-26 18:06 ` [PATCH 16/39] mtd: nand: denali: rename handle_ecc() to denali_sw_ecc_fixup() Masahiro Yamada
2016-11-26 18:06 ` [PATCH 17/39] mtd: nand: denali: support HW_ECC_FIXUP capability Masahiro Yamada
2016-11-27 16:09 ` Boris Brezillon
2016-11-30 6:20 ` Masahiro Yamada
2016-11-30 7:51 ` Boris Brezillon
2016-11-26 18:06 ` [PATCH 18/39] mtd: nand: denali: move denali_read_page_raw() above denali_read_page() Masahiro Yamada
2016-11-27 16:10 ` Boris Brezillon
2016-11-30 6:13 ` Masahiro Yamada
2016-11-26 18:06 ` [PATCH 19/39] mtd: nand: denali: perform erased check against raw transferred page Masahiro Yamada
2016-11-27 16:12 ` Boris Brezillon
2016-11-30 5:36 ` Masahiro Yamada
2016-11-30 8:00 ` Boris Brezillon
2016-11-26 18:06 ` [PATCH 20/39] mtd: nand: denali_dt: enable HW_ECC_FIXUP capability for DT platform Masahiro Yamada
2016-11-27 16:14 ` Boris Brezillon
2016-11-30 6:14 ` Masahiro Yamada
2016-11-26 18:06 ` [PATCH 21/39] mtd: nand: denali: support 64bit capable DMA engine Masahiro Yamada
2016-11-27 16:16 ` Boris Brezillon
2016-11-30 7:11 ` Masahiro Yamada
2016-11-30 7:17 ` Boris Brezillon
2016-11-26 18:06 ` [PATCH 22/39] mtd: nand: denali_dt: remove dma-mask DT property Masahiro Yamada
2016-12-01 15:56 ` Rob Herring
2016-12-01 15:56 ` Rob Herring
2016-11-26 18:06 ` [PATCH 23/39] mtd: nand: denali_dt: use pdev instead of ofdev for platform_device Masahiro Yamada
2016-11-26 18:06 ` [PATCH 24/39] mtd: nand: denali: add NEW_N_BANKS_FORMAT capability Masahiro Yamada
2016-11-26 18:06 ` [PATCH 25/39] mtd: nand: denali: use nand_chip to hold frequently accessed data Masahiro Yamada
2016-11-26 18:06 ` [PATCH 26/39] mtd: nand: denali: call nand_set_flash_node() to set DT node Masahiro Yamada
2016-11-26 18:06 ` [PATCH 27/39] mtd: nand: denali: do not set mtd->name Masahiro Yamada
2016-11-26 18:06 ` [PATCH 28/39] mtd: nand: denali: move multi NAND fixup code to a helper function Masahiro Yamada
2016-11-27 16:24 ` Boris Brezillon
2016-11-30 6:09 ` Masahiro Yamada
2016-11-30 8:07 ` Boris Brezillon
2016-11-26 18:06 ` [PATCH 29/39] mtd: nand: denali: refactor multi NAND fixup code in more generic way Masahiro Yamada
2016-11-26 18:06 ` [PATCH 30/39] mtd: nand: denali: set DEVICES_CONNECTED 1 if not set Masahiro Yamada
2016-11-26 18:06 ` [PATCH 31/39] mtd: nand: denali: remove meaningless writes to read-only registers Masahiro Yamada
2016-11-26 18:06 ` [PATCH 32/39] mtd: nand: denali: remove unnecessary writes to ECC_CORRECTION Masahiro Yamada
2016-11-26 18:06 ` [PATCH 33/39] mtd: nand: denali: support 1024 byte ECC step size Masahiro Yamada
2016-11-26 18:06 ` Masahiro Yamada
2016-12-01 15:58 ` Rob Herring
2016-12-01 15:58 ` Rob Herring
2016-11-26 18:06 ` [PATCH 34/39] mtd: nand: denali: fix the condition for 15 bit ECC strength Masahiro Yamada
2016-11-26 18:06 ` [PATCH 35/39] mtd: nand: denali: calculate ecc.strength and ecc.bytes generically Masahiro Yamada
2016-11-26 18:06 ` [PATCH 36/39] mtd: nand: denali: allow to use SoC-specific ECC strength Masahiro Yamada
2016-11-26 18:06 ` [PATCH 37/39] mtd: nand: denali: support "nand-ecc-strength" DT property Masahiro Yamada
2016-11-26 18:06 ` Masahiro Yamada
2016-12-01 15:59 ` Rob Herring
2016-12-01 15:59 ` Rob Herring
2016-11-26 18:06 ` [PATCH 38/39] mtd: nand: denali: remove Toshiba, Hynix specific fixup code Masahiro Yamada
2016-11-27 16:28 ` Boris Brezillon
2016-11-26 18:06 ` [PATCH 39/39] mtd: nand: denali_dt: add compatible strings for UniPhier SoC variants Masahiro Yamada
2016-11-26 18:06 ` Masahiro Yamada
2016-12-01 16:05 ` Rob Herring
2016-12-02 2:54 ` Masahiro Yamada
2016-12-02 2:54 ` Masahiro Yamada
2016-12-02 16:26 ` Rob Herring
2016-12-02 16:26 ` Rob Herring
2016-12-03 2:41 ` Masahiro Yamada
2016-12-03 2:41 ` Masahiro Yamada
2016-12-03 2:49 ` Marek Vasut
2016-12-03 2:49 ` Marek Vasut
2016-12-03 22:08 ` Dinh Nguyen
2016-12-05 3:30 ` Masahiro Yamada
2016-12-05 3:30 ` Masahiro Yamada
2016-12-05 3:44 ` Marek Vasut
2016-12-05 3:44 ` Marek Vasut
2016-12-05 4:10 ` Masahiro Yamada
2016-12-05 4:10 ` Masahiro Yamada
2016-12-05 4:22 ` Marek Vasut
2016-12-05 20:51 ` Dinh Nguyen
2016-12-05 21:29 ` Marek Vasut
2016-12-05 21:29 ` Marek Vasut
2016-12-05 22:31 ` Dinh Nguyen
2016-12-05 22:31 ` Dinh Nguyen
2016-11-27 15:04 ` [PATCH 00/39] mtd: nand: denali: 2nd round of Denali NAND IP patch bomb Boris Brezillon
2016-11-27 15:04 ` Boris Brezillon
2016-11-30 8:02 ` Masahiro Yamada
2016-11-30 8:02 ` Masahiro Yamada
2016-11-30 8:17 ` Boris Brezillon
2016-11-30 8:17 ` Boris Brezillon
2016-12-01 9:15 ` Masahiro Yamada
2017-03-10 11:00 ` Masahiro Yamada
2017-03-10 11:00 ` Masahiro Yamada
2017-03-13 11:33 ` Boris Brezillon
2017-03-13 11:33 ` Boris Brezillon
2016-11-30 8:13 ` Masahiro Yamada
2016-11-27 16:31 ` Boris Brezillon
2016-11-27 16:31 ` Boris Brezillon
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=20161127163419.556a3307@bbrezillon \
--to=boris.brezillon@free-electrons.com \
--cc=computersforpeace@gmail.com \
--cc=cyrille.pitchen@atmel.com \
--cc=dwmw2@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=marek.vasut@gmail.com \
--cc=richard@nod.at \
--cc=yamada.masahiro@socionext.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.