[PATCH v2] cmd: mtd: try to erase bad blocks only if scrub flag is provided

Michael Nazzareno Trimarchi michael at amarulasolutions.com
Mon Oct 24 09:49:14 CEST 2022


Hi Mikhail

On Mon, Oct 24, 2022 at 9:37 AM Mikhail Kshevetskiy
<mikhail.kshevetskiy at iopsys.eu> wrote:
>
> 'mtd erase' command should not erase bad blocks. To force bad block erasing
> there is 'mtd erase.dontskipbad' command. Unfortunately nand layer erases
> bad blocks unconditionally. This is wrong.
>
> Fix issue by adding bad block checks to do_mtd_erase() function in the case
> srub flag is not provided. We can't simplify code by eliminating -EIO result
> check of mtd_erase() as it will terminate erasing with CMD_RET_SUCCESS.
>
> Thanks to Dario Binacchi <dario.binacchi at amarulasolutions.com> for his patch.
>
> Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy at iopsys.eu>
> ---
>  cmd/mtd.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/cmd/mtd.c b/cmd/mtd.c
> index ad5cc9827d..a314745e95 100644
> --- a/cmd/mtd.c
> +++ b/cmd/mtd.c
> @@ -434,11 +434,24 @@ static int do_mtd_erase(struct cmd_tbl *cmdtp, int flag, int argc,
>         erase_op.mtd = mtd;
>         erase_op.addr = off;
>         erase_op.len = mtd->erasesize;
> -       erase_op.scrub = scrub;
>
>         while (len) {
> -               ret = mtd_erase(mtd, &erase_op);
> +               if (!scrub) {
> +                       ret = mtd_block_isbad(mtd, erase_op.addr);
> +                       if (ret < 0) {
> +                               printf("Failed to get bad block at 0x%08llx\n",
> +                                      erase_op.addr);
> +                               ret = CMD_RET_FAILURE;
> +                               goto out_put_mtd;
> +                       } else if (ret > 0) {
> +                               /* simulate bad block behavior */
> +                               ret = -EIO;
> +                               goto skip_block_erasing;
> +                       }
> +               }
>
> +               ret = mtd_erase(mtd, &erase_op);
> +skip_block_erasing:
>                 if (ret) {
>                         /* Abort if its not a bad block error */
>                         if (ret != -EIO)
> --
> 2.35.1
>

As I stated in a different email. Please re-post with the right sign-off

Michael

-- 
Michael Nazzareno Trimarchi
Co-Founder & Chief Executive Officer
M. +39 347 913 2170
michael at amarulasolutions.com
__________________________________

Amarula Solutions BV
Joop Geesinkweg 125, 1114 AB, Amsterdam, NL
T. +31 (0)85 111 9172
info at amarulasolutions.com
www.amarulasolutions.com


More information about the U-Boot mailing list