[PATCH] ath79: rb4xx-nand: fix 512 byte pages compatibility
Bas Mevissen
abuse at basmevissen.nl
Fri May 28 01:41:28 PDT 2021
A few nitpicks:
On 2021-05-28 00:27, Sergey Ryazanov wrote:
> MikroTik boards with 512 byte NAND pages require the old YAFFS1 OOB
> layout for compatibility with the RouterBoot bootloader. The RB4xx NAND
> driver supports such OOB layout, but checks a NAND page size too early
> before the flash identification, what effectively preventing the old
> OOB
> layout from being used.
>
> To fix this issue, move the page size check and OOB layout
> configuration
> to the chip attaching hook, which is specially intorduced for ECC and
> OOB tweaking.
>
> While at it, copy a comment from the old AR71xx driver to make it
> clear,
> why do we need this OOB layout tweaking.
>
> Run tested with MikroTik RB411U board.
>
> Signed-off-by: Sergey Ryazanov <ryazanov.s.a at gmail.com>
> ---
> .../files/drivers/mtd/nand/raw/nand_rb4xx.c | 25 ++++++++++++++++---
> 1 file changed, 22 insertions(+), 3 deletions(-)
>
> diff --git
> a/target/linux/ath79/files/drivers/mtd/nand/raw/nand_rb4xx.c
> b/target/linux/ath79/files/drivers/mtd/nand/raw/nand_rb4xx.c
> index 50bd69f6a4..00c65d14ae 100644
> --- a/target/linux/ath79/files/drivers/mtd/nand/raw/nand_rb4xx.c
> +++ b/target/linux/ath79/files/drivers/mtd/nand/raw/nand_rb4xx.c
> @@ -81,6 +81,23 @@ static const struct mtd_ooblayout_ops
> rb4xx_nand_ecclayout_ops = {
> .free = rb4xx_ooblayout_free,
> };
>
> +static int rb4xx_nand_attach_chip(struct nand_chip *chip)
> +{
> + struct mtd_info *mtd = nand_to_mtd(chip);
> +
> + /*
> + * Now we knows flash parameters and can tweak OOB the layout for old
Rephrase to something like:
Knowing the flash parameters, we can tweak the OOB layout for old
> + * (usually 64MiB) flashes.
> + *
> + * We need to use the OLD Yaffs-1 OOB layout, otherwise the RB
> + * bootloader will not be able to find the kernel that we load.
> + */
> + if (mtd->writesize == 512)
> + mtd_set_ooblayout(mtd, &rb4xx_nand_ecclayout_ops);
> +
> + return 0;
> +}
> +
> static u8 rb4xx_nand_read_byte(struct nand_chip *chip)
> {
> struct rb4xx_nand *nand = chip->priv;
> @@ -135,6 +152,10 @@ static int rb4xx_nand_dev_ready(struct nand_chip
> *chip)
> return gpiod_get_value_cansleep(nand->rdy);
> }
>
> +static const struct nand_controller_ops rb4xx_nand_controller_ops = {
> + .attach_chip = rb4xx_nand_attach_chip,
remove the ,
> +};
> +
> static int rb4xx_nand_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -185,9 +206,6 @@ static int rb4xx_nand_probe(struct platform_device
> *pdev)
> mtd->dev.parent = dev;
> mtd_set_of_node(mtd, dev->of_node);
>
> - if (mtd->writesize == 512)
> - mtd_set_ooblayout(mtd, &rb4xx_nand_ecclayout_ops);
> -
> nand->chip.ecc.mode = NAND_ECC_SOFT;
> nand->chip.ecc.algo = NAND_ECC_HAMMING;
> nand->chip.options = NAND_NO_SUBPAGE_WRITE;
> @@ -199,6 +217,7 @@ static int rb4xx_nand_probe(struct platform_device
> *pdev)
> nand->chip.legacy.cmd_ctrl = rb4xx_nand_cmd_ctrl;
> nand->chip.legacy.dev_ready = rb4xx_nand_dev_ready;
> nand->chip.legacy.chip_delay = 25;
> + nand->chip.legacy.dummy_controller.ops = &rb4xx_nand_controller_ops;
Fix indentation for all nand->something assignments to line up the =
sign
>
> ret = nand_scan(&nand->chip, 1);
> if (ret)
More information about the openwrt-devel
mailing list