1
0
mirror of https://git.openwrt.org/openwrt/openwrt.git synced 2024-06-20 23:58:27 +02:00

kernel: fix mtd/NVMEM regression affecting U-Boot env NVMEM driver

Fixes: b595670070 ("kernel: backport nvmem v6.6 fixes and v6.7 changes")
Fixes: https://github.com/openwrt/openwrt/issues/13831
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
Rafał Miłecki 2023-10-31 17:09:45 +01:00
parent c441f9b2c5
commit c997634c01
9 changed files with 103 additions and 7 deletions

View File

@ -34,7 +34,7 @@ Signed-off-by: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma@imgtec.com>
mtd->type = MTD_NORFLASH;
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -847,6 +847,17 @@ out_error:
@@ -870,6 +870,17 @@ out_error:
*/
static void mtd_set_dev_defaults(struct mtd_info *mtd)
{

View File

@ -33,7 +33,7 @@ Signed-off-by: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma@imgtec.com>
mtd->flags = MTD_CAP_NORFLASH;
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -840,6 +840,17 @@ out_error:
@@ -863,6 +863,17 @@ out_error:
*/
static void mtd_set_dev_defaults(struct mtd_info *mtd)
{

View File

@ -77,7 +77,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
#include "mtdcore.h"
@@ -1083,6 +1084,8 @@ int mtd_device_parse_register(struct mtd
@@ -1106,6 +1107,8 @@ int mtd_device_parse_register(struct mtd
register_reboot_notifier(&mtd->reboot_notifier);
}

View File

@ -12,7 +12,7 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -761,7 +761,8 @@ int add_mtd_device(struct mtd_info *mtd)
@@ -784,7 +784,8 @@ int add_mtd_device(struct mtd_info *mtd)
mutex_unlock(&mtd_table_mutex);

View File

@ -91,7 +91,7 @@ Signed-off-by: Daniel Golle <daniel@makrotopia.org>
#include "mtdcore.h"
@@ -1075,6 +1076,8 @@ int mtd_device_parse_register(struct mtd
@@ -1098,6 +1099,8 @@ int mtd_device_parse_register(struct mtd
register_reboot_notifier(&mtd->reboot_notifier);
}

View File

@ -12,7 +12,7 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -750,7 +750,8 @@ int add_mtd_device(struct mtd_info *mtd)
@@ -773,7 +773,8 @@ int add_mtd_device(struct mtd_info *mtd)
mutex_unlock(&mtd_table_mutex);

View File

@ -0,0 +1,48 @@
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
Date: Tue, 31 Oct 2023 15:51:01 +0100
Subject: [PATCH] mtd: don't register NVMEM devices for partitions with custom
drivers
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This fixes issue exposed by upstream commit f4cf4e5db331 ("Revert
"nvmem: add new config option"").
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
drivers/mtd/mtdcore.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -537,6 +537,29 @@ static int mtd_nvmem_add(struct mtd_info
struct device_node *node = mtd_get_of_node(mtd);
struct nvmem_config config = {};
+ /*
+ * Do NOT register NVMEM device for any partition that is meant to be
+ * handled by a U-Boot env driver. That would result in associating two
+ * different NVMEM devices with the same OF node.
+ *
+ * An example of unwanted behaviour of above (forwardtrace):
+ * of_get_mac_addr_nvmem()
+ * of_nvmem_cell_get()
+ * __nvmem_device_get()
+ *
+ * We can't have __nvmem_device_get() return "mtdX" NVMEM device instead
+ * of U-Boot env NVMEM device. That would result in failing to find
+ * NVMEM cell.
+ *
+ * This issue seems to affect U-Boot env case only and will go away with
+ * switch to NVMEM layouts.
+ */
+ if (of_device_is_compatible(node, "u-boot,env") ||
+ of_device_is_compatible(node, "u-boot,env-redundant-bool") ||
+ of_device_is_compatible(node, "u-boot,env-redundant-count") ||
+ of_device_is_compatible(node, "brcm,env"))
+ return 0;
+
config.id = -1;
config.dev = &mtd->dev;
config.name = dev_name(&mtd->dev);

View File

@ -0,0 +1,48 @@
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl>
Date: Tue, 31 Oct 2023 15:51:01 +0100
Subject: [PATCH] mtd: don't register NVMEM devices for partitions with custom
drivers
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This fixes issue exposed by upstream commit f4cf4e5db331 ("Revert
"nvmem: add new config option"").
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
drivers/mtd/mtdcore.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -519,6 +519,29 @@ static int mtd_nvmem_add(struct mtd_info
struct device_node *node = mtd_get_of_node(mtd);
struct nvmem_config config = {};
+ /*
+ * Do NOT register NVMEM device for any partition that is meant to be
+ * handled by a U-Boot env driver. That would result in associating two
+ * different NVMEM devices with the same OF node.
+ *
+ * An example of unwanted behaviour of above (forwardtrace):
+ * of_get_mac_addr_nvmem()
+ * of_nvmem_cell_get()
+ * __nvmem_device_get()
+ *
+ * We can't have __nvmem_device_get() return "mtdX" NVMEM device instead
+ * of U-Boot env NVMEM device. That would result in failing to find
+ * NVMEM cell.
+ *
+ * This issue seems to affect U-Boot env case only and will go away with
+ * switch to NVMEM layouts.
+ */
+ if (of_device_is_compatible(node, "u-boot,env") ||
+ of_device_is_compatible(node, "u-boot,env-redundant-bool") ||
+ of_device_is_compatible(node, "u-boot,env-redundant-count") ||
+ of_device_is_compatible(node, "brcm,env"))
+ return 0;
+
config.id = -1;
config.dev = &mtd->dev;
config.name = dev_name(&mtd->dev);

View File

@ -34,7 +34,7 @@ Signed-off-by: Abhimanyu Vishwakarma <Abhimanyu.Vishwakarma@imgtec.com>
mtd->type = MTD_NORFLASH;
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -847,6 +847,17 @@ out_error:
@@ -870,6 +870,17 @@ out_error:
*/
static void mtd_set_dev_defaults(struct mtd_info *mtd)
{