I got it! _exit macro of rb_hardconfig_init seems to cause this kernel
panic. Here is a patch.

Regards, Denis.
From e042f7d0a72ff9b69fd34ab2f3bac2b698da776f Mon Sep 17 00:00:00 2001
From: Denis Kalashnikov <[email protected]>
Date: Mon, 15 Nov 2021 11:27:14 +0300
Subject: [PATCH] Fixes to generic: platform/mikrotik: use MTD notifier

---
 .../files/drivers/platform/mikrotik/rb_hardconfig.c      | 9 ++++-----
 .../files/drivers/platform/mikrotik/rb_softconfig.c      | 7 +++----
 .../generic/files/drivers/platform/mikrotik/routerboot.c | 1 +
 .../generic/files/drivers/platform/mikrotik/routerboot.h | 8 ++++----
 4 files changed, 12 insertions(+), 13 deletions(-)

diff --git a/target/linux/generic/files/drivers/platform/mikrotik/rb_hardconfig.c b/target/linux/generic/files/drivers/platform/mikrotik/rb_hardconfig.c
index 1f076a9666..5ae798b3ce 100644
--- a/target/linux/generic/files/drivers/platform/mikrotik/rb_hardconfig.c
+++ b/target/linux/generic/files/drivers/platform/mikrotik/rb_hardconfig.c
@@ -676,7 +676,7 @@ static ssize_t hc_wlan_data_bin_read(struct file *filp, struct kobject *kobj,
 	return count;
 }
 
-int __init rb_hardconfig_init(struct kobject *rb_kobj, struct mtd_info *mtd)
+int rb_hardconfig_init(struct kobject *rb_kobj, struct mtd_info *mtd)
 {
 	struct kobject *hc_wlan_kobj;
 	size_t bytes_read, buflen, outlen;
@@ -689,8 +689,7 @@ int __init rb_hardconfig_init(struct kobject *rb_kobj, struct mtd_info *mtd)
 	hc_kobj = NULL;
 	hc_wlan_kobj = NULL;
 
-	ret = __get_mtd_device(mtd);
-	if (IS_ERR(ret))
+	if (__get_mtd_device(mtd))
 		return -ENODEV;
 
 	hc_buflen = mtd->size;
@@ -816,10 +815,10 @@ fail:
 	return ret;
 }
 
-void __exit rb_hardconfig_exit(void)
+void rb_hardconfig_exit(void)
 {
 	kobject_put(hc_kobj);
 	hc_kobj = NULL;
 	kfree(hc_buf);
-	hc_buff = NULL;
+	hc_buf = NULL;
 }
diff --git a/target/linux/generic/files/drivers/platform/mikrotik/rb_softconfig.c b/target/linux/generic/files/drivers/platform/mikrotik/rb_softconfig.c
index 3bbf4038ae..575ef60e33 100644
--- a/target/linux/generic/files/drivers/platform/mikrotik/rb_softconfig.c
+++ b/target/linux/generic/files/drivers/platform/mikrotik/rb_softconfig.c
@@ -705,7 +705,7 @@ mtdfail:
 
 static struct kobj_attribute sc_kattrcommit = __ATTR(commit, RB_SC_RMODE|RB_SC_WMODE, sc_commit_show, sc_commit_store);
 
-int __init rb_softconfig_init(struct kobject *rb_kobj, struct mtd_info *mtd)
+int rb_softconfig_init(struct kobject *rb_kobj, struct mtd_info *mtd)
 {
 	size_t bytes_read, buflen;
 	const u8 *buf;
@@ -715,8 +715,7 @@ int __init rb_softconfig_init(struct kobject *rb_kobj, struct mtd_info *mtd)
 	sc_buf = NULL;
 	sc_kobj = NULL;
 
-	ret = __get_mtd_device(mtd);
-	if (IS_ERR(ret))
+	if (__get_mtd_device(mtd))
 		return -ENODEV;
 
 	sc_buflen = mtd->size;
@@ -797,7 +796,7 @@ fail:
 	return ret;
 }
 
-void __exit rb_softconfig_exit(void)
+void rb_softconfig_exit(void)
 {
 	kobject_put(sc_kobj);
 	sc_kobj = NULL;
diff --git a/target/linux/generic/files/drivers/platform/mikrotik/routerboot.c b/target/linux/generic/files/drivers/platform/mikrotik/routerboot.c
index 13ecfab2ba..9cc080779a 100644
--- a/target/linux/generic/files/drivers/platform/mikrotik/routerboot.c
+++ b/target/linux/generic/files/drivers/platform/mikrotik/routerboot.c
@@ -13,6 +13,7 @@
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/sysfs.h>
+#include <linux/mtd/mtd.h>
 
 #include "routerboot.h"
 
diff --git a/target/linux/generic/files/drivers/platform/mikrotik/routerboot.h b/target/linux/generic/files/drivers/platform/mikrotik/routerboot.h
index 747136b2c1..e858a524af 100644
--- a/target/linux/generic/files/drivers/platform/mikrotik/routerboot.h
+++ b/target/linux/generic/files/drivers/platform/mikrotik/routerboot.h
@@ -25,11 +25,11 @@
 int routerboot_tag_find(const u8 *bufhead, const size_t buflen, const u16 tag_id, u16 *pld_ofs, u16 *pld_len);
 int routerboot_rle_decode(const u8 *in, size_t inlen, u8 *out, size_t *outlen);
 
-int __init rb_hardconfig_init(struct kobject *rb_kobj, struct mtd_info *mtd);
-void __exit rb_hardconfig_exit(void);
+int rb_hardconfig_init(struct kobject *rb_kobj, struct mtd_info *mtd);
+void rb_hardconfig_exit(void);
 
-int __init rb_softconfig_init(struct kobject *rb_kobj, struct mtd_info *mtd);
-void __exit rb_softconfig_exit(void);
+int rb_softconfig_init(struct kobject *rb_kobj, struct mtd_info *mtd);
+void rb_softconfig_exit(void);
 
 ssize_t routerboot_tag_show_string(const u8 *pld, u16 pld_len, char *buf);
 ssize_t routerboot_tag_show_u32s(const u8 *pld, u16 pld_len, char *buf);
-- 
2.31.1

_______________________________________________
openwrt-devel mailing list
[email protected]
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to