Revert "mt798x: split some patchs"

This reverts commit b5ee06b0bc.
This commit is contained in:
Jianhui Zhao 2023-05-18 11:30:24 +08:00
parent 76c72f2f7c
commit 49672cca57
4 changed files with 361 additions and 404 deletions

View File

@ -1,41 +1,20 @@
From a335de65a396f71e35797bf9b7ea76016f91edb2 Mon Sep 17 00:00:00 2001
From cb7839fee0d6191efd0f8f6351b5128a202f1b26 Mon Sep 17 00:00:00 2001
From: Hongjian Zhang <hongjian.zhang@gl-inet.com>
Date: Mon, 13 Feb 2023 16:45:22 +0800
Subject: [PATCH] Kernel: support Shortcut-fe
Subject: [PATCH] Kernel: support software acceleration
---
target/linux/generic/config-5.4 | 2 +
...k-events-support-multiple-registrant.patch | 313 ++++++++++++++++++
...-linux-kernel-to-support-shortcut-fe.patch | 282 ++++++++++++++++
3 files changed, 597 insertions(+)
create mode 100644 target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch
create mode 100644 target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch
2 files changed, 595 insertions(+)
create mode 100644 target/linux/mediatek/patches-5.4/952-net-conntrack-events-support-multiple-registrant.patch
create mode 100644 target/linux/mediatek/patches-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch
diff --git a/target/linux/generic/config-5.4 b/target/linux/generic/config-5.4
index 63213a8e1f..11d5cd2b0c 100644
--- a/target/linux/generic/config-5.4
+++ b/target/linux/generic/config-5.4
@@ -654,6 +654,7 @@ CONFIG_BPF_JIT=y
# CONFIG_BPF_JIT_ALWAYS_ON is not set
# CONFIG_BPF_UNPRIV_DEFAULT_OFF is not set
# CONFIG_BPF_STREAM_PARSER is not set
+# CONFIG_SHORTCUT_FE is not set
CONFIG_BPF_SYSCALL=y
# CONFIG_BPQETHER is not set
CONFIG_BQL=y
@@ -3696,6 +3697,7 @@ CONFIG_NFS_V3=y
# CONFIG_NF_CONNTRACK_AMANDA is not set
# CONFIG_NF_CONNTRACK_BRIDGE is not set
# CONFIG_NF_CONNTRACK_EVENTS is not set
+# CONFIG_NF_CONNTRACK_CHAIN_EVENTS is not set
# CONFIG_NF_CONNTRACK_FTP is not set
# CONFIG_NF_CONNTRACK_H323 is not set
# CONFIG_NF_CONNTRACK_IPV4 is not set
diff --git a/target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch b/target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch
diff --git a/target/linux/mediatek/patches-5.4/952-net-conntrack-events-support-multiple-registrant.patch b/target/linux/mediatek/patches-5.4/952-net-conntrack-events-support-multiple-registrant.patch
new file mode 100644
index 0000000000..c763449594
--- /dev/null
+++ b/target/linux/generic/hack-5.4/952-net-conntrack-events-support-multiple-registrant.patch
+++ b/target/linux/mediatek/patches-5.4/952-net-conntrack-events-support-multiple-registrant.patch
@@ -0,0 +1,313 @@
+From 42824d4b753f84ccf885eca602c5037338b546c8 Mon Sep 17 00:00:00 2001
+From: Zhi Chen <zhichen@codeaurora.org>
@ -350,11 +329,11 @@ index 0000000000..c763449594
+
+ static struct nf_exp_event_notifier ctnl_notifier_exp = {
+ .fcn = ctnetlink_expect_event,
diff --git a/target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch b/target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch
diff --git a/target/linux/mediatek/patches-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch b/target/linux/mediatek/patches-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch
new file mode 100644
index 0000000000..3f29c65344
--- /dev/null
+++ b/target/linux/generic/hack-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch
+++ b/target/linux/mediatek/patches-5.4/953-net-patch-linux-kernel-to-support-shortcut-fe.patch
@@ -0,0 +1,282 @@
+Index: b/include/linux/if_bridge.h
+===================================================================
@ -639,5 +618,5 @@ index 0000000000..3f29c65344
+ void nf_conntrack_unregister_notifier(struct net *net,
+ struct nf_ct_event_notifier *new)
--
2.34.1
2.17.1

View File

@ -1,159 +0,0 @@
From f37449982969777ab1bc6268fd174bd10a2c7464 Mon Sep 17 00:00:00 2001
From: Jianhui Zhao <jianhui.zhao@gl-inet.com>
Date: Tue, 16 May 2023 18:18:31 +0800
Subject: [PATCH] kernel: block2mtd support partline
Signed-off-by: Jianhui Zhao <jianhui.zhao@gl-inet.com>
---
.../9999-block2mtd-support-partline.patch | 139 ++++++++++++++++++
1 file changed, 139 insertions(+)
create mode 100644 target/linux/generic/hack-5.4/9999-block2mtd-support-partline.patch
diff --git a/target/linux/generic/hack-5.4/9999-block2mtd-support-partline.patch b/target/linux/generic/hack-5.4/9999-block2mtd-support-partline.patch
new file mode 100644
index 0000000000..2e4c2555da
--- /dev/null
+++ b/target/linux/generic/hack-5.4/9999-block2mtd-support-partline.patch
@@ -0,0 +1,139 @@
+Index: linux-5.4.188/drivers/mtd/devices/block2mtd.c
+===================================================================
+--- linux-5.4.188.orig/drivers/mtd/devices/block2mtd.c
++++ linux-5.4.188/drivers/mtd/devices/block2mtd.c
+@@ -26,11 +26,14 @@
+ #include <linux/list.h>
+ #include <linux/init.h>
+ #include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
+ #include <linux/mutex.h>
+ #include <linux/mount.h>
+ #include <linux/slab.h>
+ #include <linux/major.h>
+
++static const char * const block2mtd_probe_types[] = { "ofpart","cmdlinepart", NULL };
++
+ /* Info for the block device */
+ struct block2mtd_dev {
+ struct list_head list;
+@@ -183,10 +186,9 @@ static int block2mtd_write(struct mtd_in
+ mutex_unlock(&dev->write_mutex);
+ if (err > 0)
+ err = 0;
++ sync_blockdev(dev->blkdev);
+ return err;
+ }
+-
+-
+ /* sync the device - wait until the write queue is empty */
+ static void block2mtd_sync(struct mtd_info *mtd)
+ {
+@@ -214,12 +216,13 @@ static void block2mtd_free_device(struct
+
+
+ static struct block2mtd_dev *add_device(char *devname, int erase_size,
+- int timeout)
++ const char *mtdname, int timeout)
+ {
+ #ifndef MODULE
+ int i;
+ #endif
+ const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
++ struct mtd_part_parser_data ppdata;
+ struct block_device *bdev;
+ struct block2mtd_dev *dev;
+ char *name;
+@@ -278,10 +281,13 @@ static struct block2mtd_dev *add_device(
+
+ /* Setup the MTD structure */
+ /* make the name contain the block device in */
+- name = kasprintf(GFP_KERNEL, "block2mtd: %s", devname);
++ if (!mtdname)
++ mtdname = devname;
++ name = kmalloc(strlen(mtdname) + 1, GFP_KERNEL);
+ if (!name)
+ goto err_destroy_mutex;
+
++ strcpy(name, mtdname);
+ dev->mtd.name = name;
+
+ dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
+@@ -292,12 +298,14 @@ static struct block2mtd_dev *add_device(
+ dev->mtd.flags = MTD_CAP_RAM;
+ dev->mtd._erase = block2mtd_erase;
+ dev->mtd._write = block2mtd_write;
++ dev->mtd._panic_write = block2mtd_write;
+ dev->mtd._sync = block2mtd_sync;
+ dev->mtd._read = block2mtd_read;
+ dev->mtd.priv = dev;
+ dev->mtd.owner = THIS_MODULE;
+
+- if (mtd_device_register(&dev->mtd, NULL, 0)) {
++ memset(&ppdata, '\0', sizeof(ppdata));
++ if (mtd_device_parse_register(&dev->mtd, block2mtd_probe_types, &ppdata, NULL, 0)) {
+ /* Device didn't get added, so free the entry */
+ goto err_destroy_mutex;
+ }
+@@ -305,7 +313,7 @@ static struct block2mtd_dev *add_device(
+ list_add(&dev->list, &blkmtd_device_list);
+ pr_info("mtd%d: [%s] erase_size = %dKiB [%d]\n",
+ dev->mtd.index,
+- dev->mtd.name + strlen("block2mtd: "),
++ dev->mtd.name,
+ dev->mtd.erasesize >> 10, dev->mtd.erasesize);
+ return dev;
+
+@@ -381,7 +389,7 @@ static int block2mtd_setup2(const char *
+ /* 80 for device, 12 for erase size, 80 for name, 8 for timeout */
+ char buf[80 + 12 + 80 + 8];
+ char *str = buf;
+- char *token[2];
++ char *token[4];
+ char *name;
+ size_t erase_size = PAGE_SIZE;
+ unsigned long timeout = MTD_DEFAULT_TIMEOUT;
+@@ -395,7 +403,7 @@ static int block2mtd_setup2(const char *
+ strcpy(str, val);
+ kill_final_newline(str);
+
+- for (i = 0; i < 2; i++)
++ for (i = 0; i < 4; i++)
+ token[i] = strsep(&str, ",");
+
+ if (str) {
+@@ -421,8 +429,13 @@ static int block2mtd_setup2(const char *
+ return 0;
+ }
+ }
++ if (token[2] && (strlen(token[2]) + 1 > 80))
++ pr_err("mtd device name too long\n");
++
++ if (token[3] && kstrtoul(token[3], 0, &timeout))
++ pr_err("invalid timeout\n");
+
+- add_device(name, erase_size, timeout);
++ add_device(name, erase_size, token[2], timeout);
+
+ return 0;
+ }
+@@ -454,9 +467,8 @@ static int block2mtd_setup(const char *v
+ #endif
+ }
+
+-
+ module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
+-MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>]\"");
++MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>[,<timeout>]]]\"");
+
+ static int __init block2mtd_init(void)
+ {
+@@ -484,7 +496,7 @@ static void block2mtd_exit(void)
+ mutex_destroy(&dev->write_mutex);
+ pr_info("mtd%d: [%s] removed\n",
+ dev->mtd.index,
+- dev->mtd.name + strlen("block2mtd: "));
++ dev->mtd.name);
+ list_del(&dev->list);
+ block2mtd_free_device(dev);
+ }
--
2.34.1

View File

@ -1,206 +0,0 @@
From a5fb2fb2faa520dabb8b3515918f725678d3ed80 Mon Sep 17 00:00:00 2001
From: Jianhui Zhao <jianhui.zhao@gl-inet.com>
Date: Tue, 16 May 2023 18:19:30 +0800
Subject: [PATCH] kernel: block: support partition split
Signed-off-by: Jianhui Zhao <jianhui.zhao@gl-inet.com>
---
.../9999-support-partition-split.patch | 186 ++++++++++++++++++
1 file changed, 186 insertions(+)
create mode 100644 target/linux/generic/hack-5.4/9999-support-partition-split.patch
diff --git a/target/linux/generic/hack-5.4/9999-support-partition-split.patch b/target/linux/generic/hack-5.4/9999-support-partition-split.patch
new file mode 100644
index 0000000000..8e0026c216
--- /dev/null
+++ b/target/linux/generic/hack-5.4/9999-support-partition-split.patch
@@ -0,0 +1,186 @@
+Index: linux-5.4.188/block/Kconfig
+===================================================================
+--- linux-5.4.188.orig/block/Kconfig
++++ linux-5.4.188/block/Kconfig
+@@ -105,6 +105,9 @@ config BLK_DEV_THROTTLING_LOW
+
+ Note, this is an experimental interface and could be changed someday.
+
++config PARTITION_SPLIT
++ bool "Openwrt Block device partition rootfs split"
++
+ config BLK_CMDLINE_PARSER
+ bool "Block device command line partition parser"
+ ---help---
+Index: linux-5.4.188/block/Makefile
+===================================================================
+--- linux-5.4.188.orig/block/Makefile
++++ linux-5.4.188/block/Makefile
+@@ -36,3 +36,4 @@ obj-$(CONFIG_BLK_DEBUG_FS) += blk-mq-deb
+ obj-$(CONFIG_BLK_DEBUG_FS_ZONED)+= blk-mq-debugfs-zoned.o
+ obj-$(CONFIG_BLK_SED_OPAL) += sed-opal.o
+ obj-$(CONFIG_BLK_PM) += blk-pm.o
++obj-$(CONFIG_PARTITION_SPLIT) += partition-split.o
+Index: linux-5.4.188/block/partition-generic.c
+===================================================================
+--- linux-5.4.188.orig/block/partition-generic.c
++++ linux-5.4.188/block/partition-generic.c
+@@ -21,6 +21,10 @@
+
+ #include "partitions/check.h"
+
++#ifdef CONFIG_PARTITION_SPLIT
++#include "partition-split.h"
++#endif
++
+ #ifdef CONFIG_BLK_DEV_MD
+ extern void md_autodetect_dev(dev_t dev);
+ #endif
+@@ -569,6 +573,9 @@ rescan:
+ highest = p;
+
+ disk_expand_part_tbl(disk, highest);
++#ifdef CONFIG_PARTITION_SPLIT
++ partition_split(bdev, state);
++#endif
+
+ /* add partitions */
+ for (p = 1; p < state->limit; p++) {
+Index: linux-5.4.188/block/partition-split.c
+===================================================================
+--- /dev/null
++++ linux-5.4.188/block/partition-split.c
+@@ -0,0 +1,111 @@
++#include <linux/blkdev.h>
++#include <linux/magic.h>
++#include <linux/module.h>
++#include "partitions/check.h"
++#include "partition-split.h"
++
++void print_sblock_value(char *buf)
++{
++ int i, j;
++ for (i = 0; i < sizeof(struct squashfs_sblock);) {
++ for (j = 0; j < 16; j++) {
++ printk("%02x ", buf[i]);
++ i++;
++ }
++ printk("\n");
++ }
++}
++
++unsigned char *fs_read_super_block(struct block_device *bdev, sector_t from, Sector *sector)
++{
++ if (from >= get_capacity(bdev->bd_disk)) {
++ return NULL;
++ }
++ return read_dev_sector(bdev, from, sector);
++}
++
++
++int get_squashfs_len(struct block_device *bdev, sector_t from, size_t *squashfs_len)
++{
++ struct squashfs_sblock sb;
++ unsigned char *buf;
++ Sector sector;
++ size_t retlen;
++
++ buf = fs_read_super_block(bdev, from, &sector);
++ if (!buf) {
++ printk("failed to get super\n");
++ return -EIO;
++ }
++ memcpy((void *)&sb, buf, sizeof(sb));
++ put_dev_sector(sector);
++
++ if (le32_to_cpu(sb.s_magic) != SQUASHFS_MAGIC) {
++ printk("no squashfs found in\n");
++ //print_sblock_value((char *)&sb);
++ return -EINVAL;
++ }
++
++ retlen = le64_to_cpu(sb.bytes_used);
++ if (retlen <= 0) {
++ printk("squashfs is empty in \n");
++ return -ENODEV;
++ }
++
++ *squashfs_len = retlen;
++ return 0;
++}
++
++static int find_part_by_lable(struct parsed_partitions *state, const char *lable)
++{
++ int p;
++ /* add partitions */
++ for (p = 1; p < state->limit; p++) {
++ if (!strcmp(state->parts[p].info.volname, lable))
++ return p;
++ }
++ return 0;
++}
++
++int partition_split(struct block_device *bdev, struct parsed_partitions *state)
++{
++ int p, insert;
++ size_t sqfs_size;
++ sector_t new_size, new_from;
++ struct partition_meta_info *info;
++ char tmp[sizeof(info->volname) + 4];
++
++ p = find_part_by_lable(state, ROOTFS_PART);
++ if (p == 0)
++ return 0;
++ if (get_squashfs_len(bdev, state->parts[p].from, &sqfs_size))
++ return 0;
++
++ sqfs_size = (sqfs_size + (ALING_SQFS - 1)) & ~(ALING_SQFS - 1); //squashfs 64k对齐
++
++ //计算新分区大小和起始位置
++
++ new_size = state->parts[p].size - (sqfs_size >> 9);
++ new_from = state->parts[p].from + (sqfs_size >> 9);
++
++ for (insert = 1; insert < state->limit; insert++) {
++ if (!state->parts[insert].size)
++ break;
++ }
++
++ if (insert >= state->limit)
++ return 0;
++
++ //追加一个新分区并设置相关信息
++ put_partition(state, insert, new_from, new_size);
++
++ info = &state->parts[insert].info;
++
++ strncpy(info->volname, ROOTFS_PART_DATA, strlen(ROOTFS_PART_DATA) + 1);
++ snprintf(tmp, sizeof(tmp), "(%s)", info->volname);
++ strlcat(state->pp_buf, tmp, PAGE_SIZE);
++
++ state->parts[insert].has_info = true;
++ return 0;
++
++}
+Index: linux-5.4.188/block/partition-split.h
+===================================================================
+--- /dev/null
++++ linux-5.4.188/block/partition-split.h
+@@ -0,0 +1,17 @@
++#ifndef __PARTITION_SPLIT_H
++#define __PARTITION_SPLIT_H
++
++#define ROOTFS_PART "rootfs"
++#define ROOTFS_PART_DATA "rootfs_data"
++
++#define ALING_SQFS 0X10000
++
++struct squashfs_sblock {
++ __le32 s_magic;
++ __le32 pad0[9];
++ __le64 bytes_used;
++};
++
++extern int partition_split(struct block_device *bdev, struct parsed_partitions *state);
++
++#endif
--
2.34.1

View File

@ -1,17 +1,21 @@
From 4145af6cc999a793345e48d98336a38ec6700d49 Mon Sep 17 00:00:00 2001
From d6957948ef99f0d6c28bce715013557f433f07e2 Mon Sep 17 00:00:00 2001
From: Luo Chongjun <luochongjun@gl-inet.com>
Date: Thu, 19 Jan 2023 10:37:12 +0800
Subject: [PATCH] support MT2500 target
---
.../boot/dts/mediatek/mt7981-gl-mt2500.dts | 184 ++++++++++++++++++
target/linux/mediatek/mt7981/config-5.4 | 5 +-
2 files changed, 187 insertions(+), 2 deletions(-)
.../boot/dts/mediatek/mt7981-gl-mt2500.dts | 184 +++++++++++++++++
target/linux/mediatek/mt7981/config-5.4 | 7 +-
.../9999-block2mtd-support-partline.patch | 139 +++++++++++++
.../9999-support-partition-split.patch | 186 ++++++++++++++++++
4 files changed, 514 insertions(+), 2 deletions(-)
create mode 100755 target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-gl-mt2500.dts
create mode 100644 target/linux/mediatek/patches-5.4/9999-block2mtd-support-partline.patch
create mode 100644 target/linux/mediatek/patches-5.4/9999-support-partition-split.patch
diff --git a/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-gl-mt2500.dts b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-gl-mt2500.dts
new file mode 100755
index 0000000000..1537bc2b74
index 0000000000..2b673e74cc
--- /dev/null
+++ b/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7981-gl-mt2500.dts
@@ -0,0 +1,184 @@
@ -200,7 +204,7 @@ index 0000000000..1537bc2b74
+ status = "okay";
+};
diff --git a/target/linux/mediatek/mt7981/config-5.4 b/target/linux/mediatek/mt7981/config-5.4
index 219c62fca8..7ee7a7609c 100644
index 219c62fca8..d79d4ff221 100644
--- a/target/linux/mediatek/mt7981/config-5.4
+++ b/target/linux/mediatek/mt7981/config-5.4
@@ -264,6 +264,8 @@ CONFIG_MMC_MTK=y
@ -220,7 +224,7 @@ index 219c62fca8..7ee7a7609c 100644
CONFIG_PCI=y
# CONFIG_PCIE_MEDIATEK is not set
CONFIG_PCIE_MEDIATEK_GEN3=y
@@ -467,7 +470,5 @@ CONFIG_XPS=y
@@ -467,7 +470,7 @@ CONFIG_XPS=y
CONFIG_ZLIB_DEFLATE=y
CONFIG_ZLIB_INFLATE=y
CONFIG_ZONE_DMA32=y
@ -228,6 +232,345 @@ index 219c62fca8..7ee7a7609c 100644
-CONFIG_MTK_EFUSE=y
# CONFIG_MTD_SPI_NAND_W25N01KV is not set
# CONFIG_MAXLINEAR_GPHY is not set
+# CONFIG_SHORTCUT_FE is not set
+# CONFIG_NF_CONNTRACK_CHAIN_EVENTS is not set
diff --git a/target/linux/mediatek/patches-5.4/9999-block2mtd-support-partline.patch b/target/linux/mediatek/patches-5.4/9999-block2mtd-support-partline.patch
new file mode 100644
index 0000000000..2e4c2555da
--- /dev/null
+++ b/target/linux/mediatek/patches-5.4/9999-block2mtd-support-partline.patch
@@ -0,0 +1,139 @@
+Index: linux-5.4.188/drivers/mtd/devices/block2mtd.c
+===================================================================
+--- linux-5.4.188.orig/drivers/mtd/devices/block2mtd.c
++++ linux-5.4.188/drivers/mtd/devices/block2mtd.c
+@@ -26,11 +26,14 @@
+ #include <linux/list.h>
+ #include <linux/init.h>
+ #include <linux/mtd/mtd.h>
++#include <linux/mtd/partitions.h>
+ #include <linux/mutex.h>
+ #include <linux/mount.h>
+ #include <linux/slab.h>
+ #include <linux/major.h>
+
++static const char * const block2mtd_probe_types[] = { "ofpart","cmdlinepart", NULL };
++
+ /* Info for the block device */
+ struct block2mtd_dev {
+ struct list_head list;
+@@ -183,10 +186,9 @@ static int block2mtd_write(struct mtd_in
+ mutex_unlock(&dev->write_mutex);
+ if (err > 0)
+ err = 0;
++ sync_blockdev(dev->blkdev);
+ return err;
+ }
+-
+-
+ /* sync the device - wait until the write queue is empty */
+ static void block2mtd_sync(struct mtd_info *mtd)
+ {
+@@ -214,12 +216,13 @@ static void block2mtd_free_device(struct
+
+
+ static struct block2mtd_dev *add_device(char *devname, int erase_size,
+- int timeout)
++ const char *mtdname, int timeout)
+ {
+ #ifndef MODULE
+ int i;
+ #endif
+ const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
++ struct mtd_part_parser_data ppdata;
+ struct block_device *bdev;
+ struct block2mtd_dev *dev;
+ char *name;
+@@ -278,10 +281,13 @@ static struct block2mtd_dev *add_device(
+
+ /* Setup the MTD structure */
+ /* make the name contain the block device in */
+- name = kasprintf(GFP_KERNEL, "block2mtd: %s", devname);
++ if (!mtdname)
++ mtdname = devname;
++ name = kmalloc(strlen(mtdname) + 1, GFP_KERNEL);
+ if (!name)
+ goto err_destroy_mutex;
+
++ strcpy(name, mtdname);
+ dev->mtd.name = name;
+
+ dev->mtd.size = dev->blkdev->bd_inode->i_size & PAGE_MASK;
+@@ -292,12 +298,14 @@ static struct block2mtd_dev *add_device(
+ dev->mtd.flags = MTD_CAP_RAM;
+ dev->mtd._erase = block2mtd_erase;
+ dev->mtd._write = block2mtd_write;
++ dev->mtd._panic_write = block2mtd_write;
+ dev->mtd._sync = block2mtd_sync;
+ dev->mtd._read = block2mtd_read;
+ dev->mtd.priv = dev;
+ dev->mtd.owner = THIS_MODULE;
+
+- if (mtd_device_register(&dev->mtd, NULL, 0)) {
++ memset(&ppdata, '\0', sizeof(ppdata));
++ if (mtd_device_parse_register(&dev->mtd, block2mtd_probe_types, &ppdata, NULL, 0)) {
+ /* Device didn't get added, so free the entry */
+ goto err_destroy_mutex;
+ }
+@@ -305,7 +313,7 @@ static struct block2mtd_dev *add_device(
+ list_add(&dev->list, &blkmtd_device_list);
+ pr_info("mtd%d: [%s] erase_size = %dKiB [%d]\n",
+ dev->mtd.index,
+- dev->mtd.name + strlen("block2mtd: "),
++ dev->mtd.name,
+ dev->mtd.erasesize >> 10, dev->mtd.erasesize);
+ return dev;
+
+@@ -381,7 +389,7 @@ static int block2mtd_setup2(const char *
+ /* 80 for device, 12 for erase size, 80 for name, 8 for timeout */
+ char buf[80 + 12 + 80 + 8];
+ char *str = buf;
+- char *token[2];
++ char *token[4];
+ char *name;
+ size_t erase_size = PAGE_SIZE;
+ unsigned long timeout = MTD_DEFAULT_TIMEOUT;
+@@ -395,7 +403,7 @@ static int block2mtd_setup2(const char *
+ strcpy(str, val);
+ kill_final_newline(str);
+
+- for (i = 0; i < 2; i++)
++ for (i = 0; i < 4; i++)
+ token[i] = strsep(&str, ",");
+
+ if (str) {
+@@ -421,8 +429,13 @@ static int block2mtd_setup2(const char *
+ return 0;
+ }
+ }
++ if (token[2] && (strlen(token[2]) + 1 > 80))
++ pr_err("mtd device name too long\n");
++
++ if (token[3] && kstrtoul(token[3], 0, &timeout))
++ pr_err("invalid timeout\n");
+
+- add_device(name, erase_size, timeout);
++ add_device(name, erase_size, token[2], timeout);
+
+ return 0;
+ }
+@@ -454,9 +467,8 @@ static int block2mtd_setup(const char *v
+ #endif
+ }
+
+-
+ module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
+-MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>]\"");
++MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=<dev>[,<erasesize>[,<name>[,<timeout>]]]\"");
+
+ static int __init block2mtd_init(void)
+ {
+@@ -484,7 +496,7 @@ static void block2mtd_exit(void)
+ mutex_destroy(&dev->write_mutex);
+ pr_info("mtd%d: [%s] removed\n",
+ dev->mtd.index,
+- dev->mtd.name + strlen("block2mtd: "));
++ dev->mtd.name);
+ list_del(&dev->list);
+ block2mtd_free_device(dev);
+ }
diff --git a/target/linux/mediatek/patches-5.4/9999-support-partition-split.patch b/target/linux/mediatek/patches-5.4/9999-support-partition-split.patch
new file mode 100644
index 0000000000..8e0026c216
--- /dev/null
+++ b/target/linux/mediatek/patches-5.4/9999-support-partition-split.patch
@@ -0,0 +1,186 @@
+Index: linux-5.4.188/block/Kconfig
+===================================================================
+--- linux-5.4.188.orig/block/Kconfig
++++ linux-5.4.188/block/Kconfig
+@@ -105,6 +105,9 @@ config BLK_DEV_THROTTLING_LOW
+
+ Note, this is an experimental interface and could be changed someday.
+
++config PARTITION_SPLIT
++ bool "Openwrt Block device partition rootfs split"
++
+ config BLK_CMDLINE_PARSER
+ bool "Block device command line partition parser"
+ ---help---
+Index: linux-5.4.188/block/Makefile
+===================================================================
+--- linux-5.4.188.orig/block/Makefile
++++ linux-5.4.188/block/Makefile
+@@ -36,3 +36,4 @@ obj-$(CONFIG_BLK_DEBUG_FS) += blk-mq-deb
+ obj-$(CONFIG_BLK_DEBUG_FS_ZONED)+= blk-mq-debugfs-zoned.o
+ obj-$(CONFIG_BLK_SED_OPAL) += sed-opal.o
+ obj-$(CONFIG_BLK_PM) += blk-pm.o
++obj-$(CONFIG_PARTITION_SPLIT) += partition-split.o
+Index: linux-5.4.188/block/partition-generic.c
+===================================================================
+--- linux-5.4.188.orig/block/partition-generic.c
++++ linux-5.4.188/block/partition-generic.c
+@@ -21,6 +21,10 @@
+
+ #include "partitions/check.h"
+
++#ifdef CONFIG_PARTITION_SPLIT
++#include "partition-split.h"
++#endif
++
+ #ifdef CONFIG_BLK_DEV_MD
+ extern void md_autodetect_dev(dev_t dev);
+ #endif
+@@ -569,6 +573,9 @@ rescan:
+ highest = p;
+
+ disk_expand_part_tbl(disk, highest);
++#ifdef CONFIG_PARTITION_SPLIT
++ partition_split(bdev, state);
++#endif
+
+ /* add partitions */
+ for (p = 1; p < state->limit; p++) {
+Index: linux-5.4.188/block/partition-split.c
+===================================================================
+--- /dev/null
++++ linux-5.4.188/block/partition-split.c
+@@ -0,0 +1,111 @@
++#include <linux/blkdev.h>
++#include <linux/magic.h>
++#include <linux/module.h>
++#include "partitions/check.h"
++#include "partition-split.h"
++
++void print_sblock_value(char *buf)
++{
++ int i, j;
++ for (i = 0; i < sizeof(struct squashfs_sblock);) {
++ for (j = 0; j < 16; j++) {
++ printk("%02x ", buf[i]);
++ i++;
++ }
++ printk("\n");
++ }
++}
++
++unsigned char *fs_read_super_block(struct block_device *bdev, sector_t from, Sector *sector)
++{
++ if (from >= get_capacity(bdev->bd_disk)) {
++ return NULL;
++ }
++ return read_dev_sector(bdev, from, sector);
++}
++
++
++int get_squashfs_len(struct block_device *bdev, sector_t from, size_t *squashfs_len)
++{
++ struct squashfs_sblock sb;
++ unsigned char *buf;
++ Sector sector;
++ size_t retlen;
++
++ buf = fs_read_super_block(bdev, from, &sector);
++ if (!buf) {
++ printk("failed to get super\n");
++ return -EIO;
++ }
++ memcpy((void *)&sb, buf, sizeof(sb));
++ put_dev_sector(sector);
++
++ if (le32_to_cpu(sb.s_magic) != SQUASHFS_MAGIC) {
++ printk("no squashfs found in\n");
++ //print_sblock_value((char *)&sb);
++ return -EINVAL;
++ }
++
++ retlen = le64_to_cpu(sb.bytes_used);
++ if (retlen <= 0) {
++ printk("squashfs is empty in \n");
++ return -ENODEV;
++ }
++
++ *squashfs_len = retlen;
++ return 0;
++}
++
++static int find_part_by_lable(struct parsed_partitions *state, const char *lable)
++{
++ int p;
++ /* add partitions */
++ for (p = 1; p < state->limit; p++) {
++ if (!strcmp(state->parts[p].info.volname, lable))
++ return p;
++ }
++ return 0;
++}
++
++int partition_split(struct block_device *bdev, struct parsed_partitions *state)
++{
++ int p, insert;
++ size_t sqfs_size;
++ sector_t new_size, new_from;
++ struct partition_meta_info *info;
++ char tmp[sizeof(info->volname) + 4];
++
++ p = find_part_by_lable(state, ROOTFS_PART);
++ if (p == 0)
++ return 0;
++ if (get_squashfs_len(bdev, state->parts[p].from, &sqfs_size))
++ return 0;
++
++ sqfs_size = (sqfs_size + (ALING_SQFS - 1)) & ~(ALING_SQFS - 1); //squashfs 64k对齐
++
++ //计算新分区大小和起始位置
++
++ new_size = state->parts[p].size - (sqfs_size >> 9);
++ new_from = state->parts[p].from + (sqfs_size >> 9);
++
++ for (insert = 1; insert < state->limit; insert++) {
++ if (!state->parts[insert].size)
++ break;
++ }
++
++ if (insert >= state->limit)
++ return 0;
++
++ //追加一个新分区并设置相关信息
++ put_partition(state, insert, new_from, new_size);
++
++ info = &state->parts[insert].info;
++
++ strncpy(info->volname, ROOTFS_PART_DATA, strlen(ROOTFS_PART_DATA) + 1);
++ snprintf(tmp, sizeof(tmp), "(%s)", info->volname);
++ strlcat(state->pp_buf, tmp, PAGE_SIZE);
++
++ state->parts[insert].has_info = true;
++ return 0;
++
++}
+Index: linux-5.4.188/block/partition-split.h
+===================================================================
+--- /dev/null
++++ linux-5.4.188/block/partition-split.h
+@@ -0,0 +1,17 @@
++#ifndef __PARTITION_SPLIT_H
++#define __PARTITION_SPLIT_H
++
++#define ROOTFS_PART "rootfs"
++#define ROOTFS_PART_DATA "rootfs_data"
++
++#define ALING_SQFS 0X10000
++
++struct squashfs_sblock {
++ __le32 s_magic;
++ __le32 pad0[9];
++ __le64 bytes_used;
++};
++
++extern int partition_split(struct block_device *bdev, struct parsed_partitions *state);
++
++#endif
--
2.34.1
2.25.1