[OpenWrt-Devel] [PATCH] ath79: fix NAND driver compilation for kernel 5.4

Michal Cieslakiewicz michal.cieslakiewicz at wp.pl
Sun Mar 22 07:35:44 EDT 2020

On Tue, 17 Mar 2020 21:59:27 +0100
David Bauer <mail at david-bauer.net> wrote:

> This fixes the compilation of the AR934x NAND controller
> driver for kernel 5.4 while leaving it untouched for
> kernel 4.19.
> This change is currently not run-tested, as i do not have such
> a device at hand.

Hello David,

Good news, Netgear WNDR4300 runs fine on kernel 5.4 with this patch

Tested-by: Michal Cieslakiewicz <michal.cieslakiewicz at wp.pl>

I would also propose to mitigate two compilation warnings by
introducing a return value here (by integrating into your patch):

diff --git a/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c b/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c
index 70aa396e25..0e33b07146 100644
--- a/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c
+++ b/target/linux/ath79/files/drivers/mtd/nand/raw/ar934x_nand.c
@@ -1082,14 +1082,24 @@ static int ar934x_nfc_write_page(struct nand_chip *chip,
 	return err;
-static int ar934x_nfc_hw_reset_assert(struct ar934x_nfc *nfc) {
-	reset_control_assert(nfc->rst);
+static int ar934x_nfc_hw_reset_assert(struct ar934x_nfc *nfc)
+	int err;
+	err = reset_control_assert(nfc->rst);
+	return err;
-static int ar934x_nfc_hw_reset_deassert(struct ar934x_nfc *nfc) {
-	reset_control_deassert(nfc->rst);
+static int ar934x_nfc_hw_reset_deassert(struct ar934x_nfc *nfc)
+	int err;
+	err = reset_control_deassert(nfc->rst);
+	return err;
 static int ar934x_nfc_hw_init(struct ar934x_nfc *nfc)

And finally, an important information:

Enabling 5.4 for this device exposes a mtd concat issue unrelated
to ar934x-nand driver, apparently affecting all routers that use 
concatenation of flash areas to form one larger volume for ubi. 
This appears to be a generic 5.x kernel problem not introduced by 
OpenWrt in any way.

The quick and dirty solution that worked for me was reverting kernel

commit 2431c4f5b46c32c4ac495456b1ef4ce59c0bb85d
Author: Boris Brezillon <bbrezillon at kernel.org>
Date:   Thu Dec 20 15:13:20 2018 +0100

    mtd: Implement mtd_{read,write}() as wrappers around

    mtd_{read,write}_oob() already take care of checking the params and
    calling ->_{read,write}() or  ->_{read,write}_oob() based on the
    request and the operations supported by the MTD device.
    No need to duplicate the logic, we can simply implement
    mtd_{read,write}() as wrappers around mtd_{read,write}_oob().

Above commit makes router to oops on WARN_ON canary and exit with error
when creating mtd concat, entering boot loop. Without it my WNDR4300 runs
fine so far.

Best regards

openwrt-devel mailing list
openwrt-devel at lists.openwrt.org

More information about the openwrt-devel mailing list