diff --git a/patches-mt798x-7.6.6.1/2006-Kernel-support-Shortcut-fe.patch b/patches-mt798x-7.6.6.1/2006-Kernel-support-software-acceleration.patch similarity index 91% rename from patches-mt798x-7.6.6.1/2006-Kernel-support-Shortcut-fe.patch rename to patches-mt798x-7.6.6.1/2006-Kernel-support-software-acceleration.patch index 9f42e0f..dfe1039 100644 --- a/patches-mt798x-7.6.6.1/2006-Kernel-support-Shortcut-fe.patch +++ b/patches-mt798x-7.6.6.1/2006-Kernel-support-software-acceleration.patch @@ -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 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 @@ -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 diff --git a/patches-mt798x-7.6.6.1/2008-kernel-block2mtd-support-partline.patch b/patches-mt798x-7.6.6.1/2008-kernel-block2mtd-support-partline.patch deleted file mode 100644 index d7cd5ee..0000000 --- a/patches-mt798x-7.6.6.1/2008-kernel-block2mtd-support-partline.patch +++ /dev/null @@ -1,159 +0,0 @@ -From f37449982969777ab1bc6268fd174bd10a2c7464 Mon Sep 17 00:00:00 2001 -From: Jianhui Zhao -Date: Tue, 16 May 2023 18:18:31 +0800 -Subject: [PATCH] kernel: block2mtd support partline - -Signed-off-by: Jianhui Zhao ---- - .../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 -+ #include -+ #include -++#include -+ #include -+ #include -+ #include -+ #include -+ -++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=[,]\""); -++MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=[,[,[,]]]\""); -+ -+ 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 - diff --git a/patches-mt798x-7.6.6.1/2009-kernel-block-support-partition-split.patch b/patches-mt798x-7.6.6.1/2009-kernel-block-support-partition-split.patch deleted file mode 100644 index 4ddb303..0000000 --- a/patches-mt798x-7.6.6.1/2009-kernel-block-support-partition-split.patch +++ /dev/null @@ -1,206 +0,0 @@ -From a5fb2fb2faa520dabb8b3515918f725678d3ed80 Mon Sep 17 00:00:00 2001 -From: Jianhui Zhao -Date: Tue, 16 May 2023 18:19:30 +0800 -Subject: [PATCH] kernel: block: support partition split - -Signed-off-by: Jianhui Zhao ---- - .../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 -++#include -++#include -++#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, §or); -++ 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 - diff --git a/patches-mt798x-7.6.6.1/4001-support-MT2500-target.patch b/patches-mt798x-7.6.6.1/4001-support-MT2500-target.patch index 7b684b1..cf2a3c3 100644 --- a/patches-mt798x-7.6.6.1/4001-support-MT2500-target.patch +++ b/patches-mt798x-7.6.6.1/4001-support-MT2500-target.patch @@ -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 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 ++ #include ++ #include +++#include ++ #include ++ #include ++ #include ++ #include ++ +++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=[,]\""); +++MODULE_PARM_DESC(block2mtd, "Device to use. \"block2mtd=[,[,[,]]]\""); ++ ++ 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 +++#include +++#include +++#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, §or); +++ 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