]> git.ipfire.org Git - people/ms/ipfire-2.x.git/commitdiff
linux: Update to 6.0-rc7 kernel-6.0
authorMichael Tremer <michael.tremer@ipfire.org>
Thu, 29 Sep 2022 08:05:26 +0000 (08:05 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Thu, 29 Sep 2022 08:05:26 +0000 (08:05 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
config/kernel/kernel.config.x86_64-ipfire
lfs/linux
src/patches/linux/devtmpfs-mount-with-noexec-and-nosuid.patch [deleted file]
src/patches/linux/linux-6.0-ipfire-arm-patches.patch [new file with mode: 0644]
src/patches/linux/linux-6.0-layer7.patch [new file with mode: 0644]

index d005f98d4be7748535e6683237fd313dfb00b249..34f107179eefc286d847fa035b664c73ee9e3871 100644 (file)
@@ -1,6 +1,6 @@
 #
 # Automatically generated file; DO NOT EDIT.
-# Linux/x86 5.15.68-ipfire Kernel Configuration
+# Linux/x86 6.0.0-ipfire Kernel Configuration
 #
 CONFIG_CC_VERSION_TEXT="gcc (GCC) 11.3.0"
 CONFIG_CC_IS_GCC=y
@@ -13,11 +13,11 @@ CONFIG_LD_VERSION=23900
 CONFIG_LLD_VERSION=0
 CONFIG_CC_CAN_LINK=y
 CONFIG_CC_CAN_LINK_STATIC=y
-CONFIG_CC_HAS_ASM_GOTO=y
 CONFIG_CC_HAS_ASM_GOTO_OUTPUT=y
 CONFIG_CC_HAS_ASM_GOTO_TIED_OUTPUT=y
 CONFIG_CC_HAS_ASM_INLINE=y
 CONFIG_CC_HAS_NO_PROFILE_FN_ATTR=y
+CONFIG_PAHOLE_VERSION=0
 CONFIG_IRQ_WORK=y
 CONFIG_BUILDTIME_TABLE_SORT=y
 CONFIG_THREAD_INFO_IN_TASK=y
@@ -47,9 +47,9 @@ CONFIG_KERNEL_XZ=y
 # CONFIG_KERNEL_ZSTD is not set
 CONFIG_DEFAULT_INIT=""
 CONFIG_DEFAULT_HOSTNAME="(none)"
-CONFIG_SWAP=y
 CONFIG_SYSVIPC=y
 CONFIG_SYSVIPC_SYSCTL=y
+CONFIG_SYSVIPC_COMPAT=y
 CONFIG_POSIX_MQUEUE=y
 CONFIG_POSIX_MQUEUE_SYSCTL=y
 # CONFIG_WATCH_QUEUE is not set
@@ -90,6 +90,8 @@ CONFIG_GENERIC_CLOCKEVENTS_MIN_ADJUST=y
 CONFIG_GENERIC_CMOS_UPDATE=y
 CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y
 CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y
+CONFIG_CONTEXT_TRACKING=y
+CONFIG_CONTEXT_TRACKING_IDLE=y
 
 #
 # Timers subsystem
@@ -101,6 +103,7 @@ CONFIG_NO_HZ_IDLE=y
 # CONFIG_NO_HZ_FULL is not set
 CONFIG_NO_HZ=y
 CONFIG_HIGH_RES_TIMERS=y
+CONFIG_CLOCKSOURCE_WATCHDOG_MAX_SKEW_US=100
 # end of Timers subsystem
 
 CONFIG_BPF=y
@@ -115,9 +118,13 @@ CONFIG_BPF_JIT=y
 CONFIG_BPF_JIT_DEFAULT_ON=y
 # end of BPF subsystem
 
+CONFIG_PREEMPT_BUILD=y
 # CONFIG_PREEMPT_NONE is not set
 CONFIG_PREEMPT_VOLUNTARY=y
 # CONFIG_PREEMPT is not set
+CONFIG_PREEMPT_COUNT=y
+CONFIG_PREEMPTION=y
+CONFIG_PREEMPT_DYNAMIC=y
 CONFIG_SCHED_CORE=y
 
 #
@@ -143,10 +150,12 @@ CONFIG_CPU_ISOLATION=y
 # RCU Subsystem
 #
 CONFIG_TREE_RCU=y
+CONFIG_PREEMPT_RCU=y
 # CONFIG_RCU_EXPERT is not set
 CONFIG_SRCU=y
 CONFIG_TREE_SRCU=y
 CONFIG_TASKS_RCU_GENERIC=y
+CONFIG_TASKS_RCU=y
 CONFIG_TASKS_RUDE_RCU=y
 CONFIG_RCU_STALL_COMMON=y
 CONFIG_RCU_NEED_SEGCBLIST=y
@@ -168,9 +177,12 @@ CONFIG_HAVE_UNSTABLE_SCHED_CLOCK=y
 CONFIG_ARCH_SUPPORTS_NUMA_BALANCING=y
 CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH=y
 CONFIG_CC_HAS_INT128=y
+CONFIG_CC_IMPLICIT_FALLTHROUGH="-Wimplicit-fallthrough=5"
+CONFIG_GCC12_NO_ARRAY_BOUNDS=y
 CONFIG_ARCH_SUPPORTS_INT128=y
 CONFIG_CGROUPS=y
 CONFIG_PAGE_COUNTER=y
+# CONFIG_CGROUP_FAVOR_DYNMODS is not set
 CONFIG_MEMCG=y
 CONFIG_MEMCG_SWAP=y
 CONFIG_MEMCG_KMEM=y
@@ -212,6 +224,7 @@ CONFIG_RD_LZO=y
 CONFIG_RD_LZ4=y
 CONFIG_RD_ZSTD=y
 # CONFIG_BOOT_CONFIG is not set
+CONFIG_INITRAMFS_PRESERVE_MTIME=y
 CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y
 # CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
 CONFIG_LD_ORPHAN_WARN=y
@@ -246,13 +259,13 @@ CONFIG_KALLSYMS=y
 CONFIG_KALLSYMS_ALL=y
 CONFIG_KALLSYMS_ABSOLUTE_PERCPU=y
 CONFIG_KALLSYMS_BASE_RELATIVE=y
-# CONFIG_USERFAULTFD is not set
 CONFIG_ARCH_HAS_MEMBARRIER_SYNC_CORE=y
 CONFIG_KCMP=y
 CONFIG_RSEQ=y
 # CONFIG_DEBUG_RSEQ is not set
 CONFIG_EMBEDDED=y
 CONFIG_HAVE_PERF_EVENTS=y
+CONFIG_GUEST_PERF_EVENTS=y
 # CONFIG_PC104 is not set
 
 #
@@ -262,17 +275,6 @@ CONFIG_PERF_EVENTS=y
 # CONFIG_DEBUG_PERF_USE_VMALLOC is not set
 # end of Kernel Performance Events And Counters
 
-CONFIG_VM_EVENT_COUNTERS=y
-# CONFIG_SLUB_DEBUG is not set
-# CONFIG_COMPAT_BRK is not set
-# CONFIG_SLAB is not set
-CONFIG_SLUB=y
-# CONFIG_SLOB is not set
-# CONFIG_SLAB_MERGE_DEFAULT is not set
-CONFIG_SLAB_FREELIST_RANDOM=y
-CONFIG_SLAB_FREELIST_HARDENED=y
-CONFIG_SHUFFLE_PAGE_ALLOCATOR=y
-CONFIG_SLUB_CPU_PARTIAL=y
 CONFIG_SYSTEM_DATA_VERIFICATION=y
 # CONFIG_PROFILING is not set
 CONFIG_TRACEPOINTS=y
@@ -296,19 +298,15 @@ CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
 CONFIG_ARCH_MAY_HAVE_PC_FDC=y
 CONFIG_GENERIC_CALIBRATE_DELAY=y
 CONFIG_ARCH_HAS_CPU_RELAX=y
-CONFIG_ARCH_HAS_FILTER_PGPROT=y
-CONFIG_HAVE_SETUP_PER_CPU_AREA=y
-CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
-CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
 CONFIG_ARCH_HIBERNATION_POSSIBLE=y
 CONFIG_ARCH_NR_GPIO=1024
 CONFIG_ARCH_SUSPEND_POSSIBLE=y
-CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
 CONFIG_AUDIT_ARCH=y
 CONFIG_HAVE_INTEL_TXT=y
 CONFIG_X86_64_SMP=y
 CONFIG_ARCH_SUPPORTS_UPROBES=y
 CONFIG_FIX_EARLYCON_MEM=y
+CONFIG_DYNAMIC_PHYSICAL_MASK=y
 CONFIG_PGTABLE_LEVELS=4
 CONFIG_CC_HAS_SANE_STACKPROTECTOR=y
 
@@ -354,6 +352,7 @@ CONFIG_PARAVIRT_TIME_ACCOUNTING=y
 CONFIG_PARAVIRT_CLOCK=y
 # CONFIG_JAILHOUSE_GUEST is not set
 # CONFIG_ACRN_GUEST is not set
+CONFIG_INTEL_TDX_GUEST=y
 # CONFIG_MK8 is not set
 # CONFIG_MPSC is not set
 # CONFIG_MCORE2 is not set
@@ -378,11 +377,13 @@ CONFIG_HPET_TIMER=y
 CONFIG_HPET_EMULATE_RTC=y
 CONFIG_DMI=y
 # CONFIG_GART_IOMMU is not set
+CONFIG_BOOT_VESA_SUPPORT=y
 # CONFIG_MAXSMP is not set
 CONFIG_NR_CPUS_RANGE_BEGIN=2
 CONFIG_NR_CPUS_RANGE_END=512
 CONFIG_NR_CPUS_DEFAULT=64
 CONFIG_NR_CPUS=64
+CONFIG_SCHED_CLUSTER=y
 CONFIG_SCHED_SMT=y
 CONFIG_SCHED_MC=y
 CONFIG_SCHED_MC_PRIO=y
@@ -403,24 +404,24 @@ CONFIG_PERF_EVENTS_INTEL_RAPL=y
 CONFIG_PERF_EVENTS_INTEL_CSTATE=y
 CONFIG_PERF_EVENTS_AMD_POWER=m
 CONFIG_PERF_EVENTS_AMD_UNCORE=y
+# CONFIG_PERF_EVENTS_AMD_BRS is not set
 # end of Performance monitoring
 
 CONFIG_X86_VSYSCALL_EMULATION=y
 CONFIG_X86_IOPL_IOPERM=y
-CONFIG_I8K=m
 CONFIG_MICROCODE=y
 CONFIG_MICROCODE_INTEL=y
 CONFIG_MICROCODE_AMD=y
-CONFIG_MICROCODE_OLD_INTERFACE=y
+# CONFIG_MICROCODE_LATE_LOADING is not set
 CONFIG_X86_MSR=y
 CONFIG_X86_CPUID=y
 # CONFIG_X86_5LEVEL is not set
 CONFIG_X86_DIRECT_GBPAGES=y
+CONFIG_X86_MEM_ENCRYPT=y
 # CONFIG_AMD_MEM_ENCRYPT is not set
 # CONFIG_NUMA is not set
 CONFIG_ARCH_SPARSEMEM_ENABLE=y
 CONFIG_ARCH_SPARSEMEM_DEFAULT=y
-CONFIG_ARCH_SELECT_MEMORY_MODEL=y
 CONFIG_ILLEGAL_POINTER_VALUE=0xdead000000000000
 CONFIG_X86_PMEM_LEGACY_DEVICE=y
 CONFIG_X86_PMEM_LEGACY=m
@@ -432,9 +433,9 @@ CONFIG_MTRR_SANITIZER_ENABLE_DEFAULT=1
 CONFIG_MTRR_SANITIZER_SPARE_REG_NR_DEFAULT=1
 CONFIG_X86_PAT=y
 CONFIG_ARCH_USES_PG_UNCACHED=y
-CONFIG_ARCH_RANDOM=y
-CONFIG_X86_SMAP=y
 CONFIG_X86_UMIP=y
+CONFIG_CC_HAS_IBT=y
+# CONFIG_X86_KERNEL_IBT is not set
 CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS=y
 CONFIG_X86_INTEL_TSX_MODE_OFF=y
 # CONFIG_X86_INTEL_TSX_MODE_ON is not set
@@ -464,11 +465,11 @@ CONFIG_HOTPLUG_CPU=y
 # CONFIG_BOOTPARAM_HOTPLUG_CPU0 is not set
 # CONFIG_DEBUG_HOTPLUG_CPU0 is not set
 # CONFIG_COMPAT_VDSO is not set
-# CONFIG_LEGACY_VSYSCALL_EMULATE is not set
 # CONFIG_LEGACY_VSYSCALL_XONLY is not set
 CONFIG_LEGACY_VSYSCALL_NONE=y
 # CONFIG_CMDLINE_BOOL is not set
 # CONFIG_MODIFY_LDT_SYSCALL is not set
+# CONFIG_STRICT_SIGALTSTACK_SIZE is not set
 CONFIG_HAVE_LIVEPATCH=y
 # CONFIG_LIVEPATCH is not set
 # end of Processor type and features
@@ -495,6 +496,7 @@ CONFIG_HIBERNATE_CALLBACKS=y
 CONFIG_PM_SLEEP=y
 CONFIG_PM_SLEEP_SMP=y
 # CONFIG_PM_AUTOSLEEP is not set
+# CONFIG_PM_USERSPACE_AUTOSLEEP is not set
 # CONFIG_PM_WAKELOCKS is not set
 CONFIG_PM=y
 # CONFIG_PM_DEBUG is not set
@@ -553,11 +555,13 @@ CONFIG_ACPI_WATCHDOG=y
 CONFIG_ACPI_EXTLOG=m
 CONFIG_ACPI_ADXL=y
 CONFIG_ACPI_CONFIGFS=m
+CONFIG_ACPI_PFRUT=m
+CONFIG_ACPI_PCC=y
 CONFIG_PMIC_OPREGION=y
 # CONFIG_XPOWER_PMIC_OPREGION is not set
 CONFIG_ACPI_VIOT=y
-CONFIG_X86_PM_TIMER=y
 CONFIG_ACPI_PRMT=y
+CONFIG_X86_PM_TIMER=y
 
 #
 # CPU Frequency scaling
@@ -582,6 +586,7 @@ CONFIG_CPU_FREQ_GOV_SCHEDUTIL=y
 #
 CONFIG_X86_INTEL_PSTATE=y
 CONFIG_X86_PCC_CPUFREQ=m
+CONFIG_X86_AMD_PSTATE=m
 CONFIG_X86_ACPI_CPUFREQ=m
 # CONFIG_X86_ACPI_CPUFREQ_CPB is not set
 CONFIG_X86_POWERNOW_K8=m
@@ -626,17 +631,18 @@ CONFIG_AMD_NB=y
 # Binary Emulations
 #
 CONFIG_IA32_EMULATION=y
-# CONFIG_X86_X32 is not set
+# CONFIG_X86_X32_ABI is not set
 CONFIG_COMPAT_32=y
 CONFIG_COMPAT=y
 CONFIG_COMPAT_FOR_U64_ALIGNMENT=y
-CONFIG_SYSVIPC_COMPAT=y
 # end of Binary Emulations
 
 CONFIG_HAVE_KVM=y
+CONFIG_HAVE_KVM_PFNCACHE=y
 CONFIG_HAVE_KVM_IRQCHIP=y
 CONFIG_HAVE_KVM_IRQFD=y
 CONFIG_HAVE_KVM_IRQ_ROUTING=y
+CONFIG_HAVE_KVM_DIRTY_RING=y
 CONFIG_HAVE_KVM_EVENTFD=y
 CONFIG_KVM_MMIO=y
 CONFIG_KVM_ASYNC_PF=y
@@ -656,7 +662,6 @@ CONFIG_KVM_INTEL=m
 CONFIG_KVM_AMD=m
 CONFIG_KVM_AMD_SEV=y
 # CONFIG_KVM_XEN is not set
-CONFIG_KVM_MMU_AUDIT=y
 CONFIG_AS_AVX512=y
 CONFIG_AS_SHA1_NI=y
 CONFIG_AS_SHA256_NI=y
@@ -680,6 +685,7 @@ CONFIG_HAVE_KPROBES=y
 CONFIG_HAVE_KRETPROBES=y
 CONFIG_HAVE_OPTPROBES=y
 CONFIG_HAVE_KPROBES_ON_FTRACE=y
+CONFIG_ARCH_CORRECT_STACKTRACE_ON_KRETPROBE=y
 CONFIG_HAVE_FUNCTION_ERROR_INJECTION=y
 CONFIG_HAVE_NMI=y
 CONFIG_TRACE_IRQFLAGS_SUPPORT=y
@@ -708,6 +714,7 @@ CONFIG_HAVE_ARCH_JUMP_LABEL=y
 CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
 CONFIG_MMU_GATHER_TABLE_FREE=y
 CONFIG_MMU_GATHER_RCU_TABLE_FREE=y
+CONFIG_MMU_GATHER_MERGE_VMAS=y
 CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG=y
 CONFIG_HAVE_ALIGNED_STRUCT_PAGE=y
 CONFIG_HAVE_CMPXCHG_LOCAL=y
@@ -727,8 +734,8 @@ CONFIG_ARCH_SUPPORTS_LTO_CLANG=y
 CONFIG_ARCH_SUPPORTS_LTO_CLANG_THIN=y
 CONFIG_LTO_NONE=y
 CONFIG_HAVE_ARCH_WITHIN_STACK_FRAMES=y
-CONFIG_HAVE_CONTEXT_TRACKING=y
-CONFIG_HAVE_CONTEXT_TRACKING_OFFSTACK=y
+CONFIG_HAVE_CONTEXT_TRACKING_USER=y
+CONFIG_HAVE_CONTEXT_TRACKING_USER_OFFSTACK=y
 CONFIG_HAVE_VIRT_CPU_ACCOUNTING_GEN=y
 CONFIG_HAVE_IRQ_TIME_ACCOUNTING=y
 CONFIG_HAVE_MOVE_PUD=y
@@ -736,12 +743,14 @@ CONFIG_HAVE_MOVE_PMD=y
 CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE=y
 CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD=y
 CONFIG_HAVE_ARCH_HUGE_VMAP=y
+CONFIG_HAVE_ARCH_HUGE_VMALLOC=y
 CONFIG_ARCH_WANT_HUGE_PMD_SHARE=y
 CONFIG_HAVE_ARCH_SOFT_DIRTY=y
 CONFIG_HAVE_MOD_ARCH_SPECIFIC=y
 CONFIG_MODULES_USE_ELF_RELA=y
 CONFIG_HAVE_IRQ_EXIT_ON_IRQ_STACK=y
 CONFIG_HAVE_SOFTIRQ_ON_OWN_STACK=y
+CONFIG_SOFTIRQ_ON_OWN_STACK=y
 CONFIG_ARCH_HAS_ELF_RANDOMIZE=y
 CONFIG_HAVE_ARCH_MMAP_RND_BITS=y
 CONFIG_HAVE_EXIT_THREAD=y
@@ -749,6 +758,13 @@ CONFIG_ARCH_MMAP_RND_BITS=32
 CONFIG_HAVE_ARCH_MMAP_RND_COMPAT_BITS=y
 CONFIG_ARCH_MMAP_RND_COMPAT_BITS=8
 CONFIG_HAVE_ARCH_COMPAT_MMAP_BASES=y
+CONFIG_PAGE_SIZE_LESS_THAN_64KB=y
+CONFIG_PAGE_SIZE_LESS_THAN_256KB=y
+CONFIG_HAVE_OBJTOOL=y
+CONFIG_HAVE_JUMP_LABEL_HACK=y
+CONFIG_HAVE_NOINSTR_HACK=y
+CONFIG_HAVE_NOINSTR_VALIDATION=y
+CONFIG_HAVE_UACCESS_VALIDATION=y
 CONFIG_HAVE_STACK_VALIDATION=y
 CONFIG_HAVE_RELIABLE_STACKTRACE=y
 CONFIG_ISA_BUS_API=y
@@ -758,6 +774,7 @@ CONFIG_COMPAT_32BIT_TIME=y
 CONFIG_HAVE_ARCH_VMAP_STACK=y
 CONFIG_VMAP_STACK=y
 CONFIG_HAVE_ARCH_RANDOMIZE_KSTACK_OFFSET=y
+CONFIG_RANDOMIZE_KSTACK_OFFSET=y
 CONFIG_RANDOMIZE_KSTACK_OFFSET_DEFAULT=y
 CONFIG_ARCH_HAS_STRICT_KERNEL_RWX=y
 CONFIG_STRICT_KERNEL_RWX=y
@@ -766,13 +783,17 @@ CONFIG_STRICT_MODULE_RWX=y
 CONFIG_HAVE_ARCH_PREL32_RELOCATIONS=y
 CONFIG_ARCH_USE_MEMREMAP_PROT=y
 CONFIG_ARCH_HAS_MEM_ENCRYPT=y
+CONFIG_ARCH_HAS_CC_PLATFORM=y
 CONFIG_HAVE_STATIC_CALL=y
 CONFIG_HAVE_STATIC_CALL_INLINE=y
 CONFIG_HAVE_PREEMPT_DYNAMIC=y
+CONFIG_HAVE_PREEMPT_DYNAMIC_CALL=y
 CONFIG_ARCH_WANT_LD_ORPHAN_WARN=y
 CONFIG_ARCH_SUPPORTS_DEBUG_PAGEALLOC=y
+CONFIG_ARCH_SUPPORTS_PAGE_TABLE_CHECK=y
 CONFIG_ARCH_HAS_ELFCORE_COMPAT=y
 CONFIG_ARCH_HAS_PARANOID_L1D_FLUSH=y
+CONFIG_DYNAMIC_SIGFRAME=y
 
 #
 # GCOV-based kernel profiling
@@ -782,9 +803,7 @@ CONFIG_ARCH_HAS_GCOV_PROFILE_ALL=y
 
 CONFIG_HAVE_GCC_PLUGINS=y
 CONFIG_GCC_PLUGINS=y
-# CONFIG_GCC_PLUGIN_CYC_COMPLEXITY is not set
 CONFIG_GCC_PLUGIN_LATENT_ENTROPY=y
-# CONFIG_GCC_PLUGIN_RANDSTRUCT is not set
 # end of General architecture-dependent options
 
 CONFIG_RT_MUTEXES=y
@@ -794,6 +813,7 @@ CONFIG_MODULES=y
 # CONFIG_MODULE_FORCE_LOAD is not set
 CONFIG_MODULE_UNLOAD=y
 # CONFIG_MODULE_FORCE_UNLOAD is not set
+# CONFIG_MODULE_UNLOAD_TAINT_TRACKING is not set
 CONFIG_MODVERSIONS=y
 CONFIG_ASM_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
@@ -810,13 +830,16 @@ CONFIG_MODULE_SIG_HASH="sha512"
 # CONFIG_MODULE_COMPRESS_GZIP is not set
 CONFIG_MODULE_COMPRESS_XZ=y
 # CONFIG_MODULE_COMPRESS_ZSTD is not set
+# CONFIG_MODULE_DECOMPRESS is not set
 # CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS is not set
 CONFIG_MODPROBE_PATH="/sbin/modprobe"
 # CONFIG_TRIM_UNUSED_KSYMS is not set
 CONFIG_MODULES_TREE_LOOKUP=y
 CONFIG_BLOCK=y
+CONFIG_BLOCK_LEGACY_AUTOLOAD=y
 CONFIG_BLK_CGROUP_RWSTAT=y
 CONFIG_BLK_DEV_BSG_COMMON=y
+CONFIG_BLK_ICQ=y
 CONFIG_BLK_DEV_BSGLIB=y
 CONFIG_BLK_DEV_INTEGRITY=y
 CONFIG_BLK_DEV_INTEGRITY_T10=y
@@ -863,6 +886,7 @@ CONFIG_BLK_MQ_PCI=y
 CONFIG_BLK_MQ_VIRTIO=y
 CONFIG_BLK_PM=y
 CONFIG_BLOCK_HOLDER_DEPRECATED=y
+CONFIG_BLK_MQ_STACKING=y
 
 #
 # IO Schedulers
@@ -877,11 +901,7 @@ CONFIG_BFQ_GROUP_IOSCHED=y
 CONFIG_PREEMPT_NOTIFIERS=y
 CONFIG_PADATA=y
 CONFIG_ASN1=y
-CONFIG_INLINE_SPIN_UNLOCK_IRQ=y
-CONFIG_INLINE_READ_UNLOCK=y
-CONFIG_INLINE_READ_UNLOCK_IRQ=y
-CONFIG_INLINE_WRITE_UNLOCK=y
-CONFIG_INLINE_WRITE_UNLOCK_IRQ=y
+CONFIG_UNINLINE_SPIN_UNLOCK=y
 CONFIG_ARCH_SUPPORTS_ATOMIC_RMW=y
 CONFIG_MUTEX_SPIN_ON_OWNER=y
 CONFIG_RWSEM_SPIN_ON_OWNER=y
@@ -910,14 +930,31 @@ CONFIG_COREDUMP=y
 #
 # Memory Management options
 #
-CONFIG_SELECT_MEMORY_MODEL=y
-CONFIG_SPARSEMEM_MANUAL=y
+CONFIG_SWAP=y
+# CONFIG_ZSWAP is not set
+
+#
+# SLAB allocator options
+#
+# CONFIG_SLAB is not set
+CONFIG_SLUB=y
+# CONFIG_SLOB is not set
+# CONFIG_SLAB_MERGE_DEFAULT is not set
+CONFIG_SLAB_FREELIST_RANDOM=y
+CONFIG_SLAB_FREELIST_HARDENED=y
+# CONFIG_SLUB_STATS is not set
+CONFIG_SLUB_CPU_PARTIAL=y
+# end of SLAB allocator options
+
+CONFIG_SHUFFLE_PAGE_ALLOCATOR=y
+# CONFIG_COMPAT_BRK is not set
 CONFIG_SPARSEMEM=y
 CONFIG_SPARSEMEM_EXTREME=y
 CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
 CONFIG_SPARSEMEM_VMEMMAP=y
 CONFIG_HAVE_FAST_GUP=y
 CONFIG_MEMORY_ISOLATION=y
+CONFIG_EXCLUSIVE_SYSTEM_RAM=y
 CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
 # CONFIG_MEMORY_HOTPLUG is not set
 CONFIG_SPLIT_PTLOCK_CPUS=4
@@ -930,28 +967,28 @@ CONFIG_MIGRATION=y
 CONFIG_ARCH_ENABLE_THP_MIGRATION=y
 CONFIG_CONTIG_ALLOC=y
 CONFIG_PHYS_ADDR_T_64BIT=y
-CONFIG_VIRT_TO_BUS=y
 CONFIG_MMU_NOTIFIER=y
 CONFIG_KSM=y
 CONFIG_DEFAULT_MMAP_MIN_ADDR=65536
 CONFIG_ARCH_SUPPORTS_MEMORY_FAILURE=y
 CONFIG_MEMORY_FAILURE=y
 # CONFIG_HWPOISON_INJECT is not set
+CONFIG_ARCH_WANT_GENERAL_HUGETLB=y
+CONFIG_ARCH_WANTS_THP_SWAP=y
 CONFIG_TRANSPARENT_HUGEPAGE=y
 CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
 # CONFIG_TRANSPARENT_HUGEPAGE_MADVISE is not set
-CONFIG_ARCH_WANTS_THP_SWAP=y
 CONFIG_THP_SWAP=y
-CONFIG_CLEANCACHE=y
-CONFIG_FRONTSWAP=y
+# CONFIG_READ_ONLY_THP_FOR_FS is not set
+CONFIG_NEED_PER_CPU_EMBED_FIRST_CHUNK=y
+CONFIG_NEED_PER_CPU_PAGE_FIRST_CHUNK=y
+CONFIG_HAVE_SETUP_PER_CPU_AREA=y
 # CONFIG_CMA is not set
-# CONFIG_ZSWAP is not set
-# CONFIG_ZPOOL is not set
-# CONFIG_ZSMALLOC is not set
 CONFIG_GENERIC_EARLY_IOREMAP=y
 # CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set
 # CONFIG_IDLE_PAGE_TRACKING is not set
 CONFIG_ARCH_HAS_CACHE_LINE_SIZE=y
+CONFIG_ARCH_HAS_CURRENT_STACK_POINTER=y
 CONFIG_ARCH_HAS_PTE_DEVMAP=y
 CONFIG_ARCH_HAS_ZONE_DMA_SET=y
 CONFIG_ZONE_DMA=y
@@ -959,14 +996,16 @@ CONFIG_ZONE_DMA32=y
 CONFIG_VMAP_PFN=y
 CONFIG_ARCH_USES_HIGH_VMA_FLAGS=y
 CONFIG_ARCH_HAS_PKEYS=y
+CONFIG_VM_EVENT_COUNTERS=y
 # CONFIG_PERCPU_STATS is not set
 
 #
 # GUP_TEST needs to have DEBUG_FS enabled
 #
-# CONFIG_READ_ONLY_THP_FOR_FS is not set
 CONFIG_ARCH_HAS_PTE_SPECIAL=y
 CONFIG_MAPPING_DIRTY_HELPERS=y
+CONFIG_ANON_VMA_NAME=y
+# CONFIG_USERFAULTFD is not set
 
 #
 # Data Access Monitoring
@@ -1109,6 +1148,8 @@ CONFIG_BRIDGE_NETFILTER=y
 # Core Netfilter Configuration
 #
 CONFIG_NETFILTER_INGRESS=y
+CONFIG_NETFILTER_EGRESS=y
+CONFIG_NETFILTER_SKIP_EGRESS=y
 CONFIG_NETFILTER_NETLINK=y
 CONFIG_NETFILTER_FAMILY_BRIDGE=y
 CONFIG_NETFILTER_FAMILY_ARP=y
@@ -1155,7 +1196,6 @@ CONFIG_NF_TABLES=y
 CONFIG_NFT_NUMGEN=m
 CONFIG_NFT_CT=m
 CONFIG_NFT_FLOW_OFFLOAD=m
-CONFIG_NFT_COUNTER=m
 CONFIG_NFT_CONNLIMIT=m
 CONFIG_NFT_LOG=m
 CONFIG_NFT_LIMIT=m
@@ -1177,6 +1217,7 @@ CONFIG_NFT_TPROXY=m
 CONFIG_NFT_SYNPROXY=m
 CONFIG_NF_FLOW_TABLE_INET=m
 CONFIG_NF_FLOW_TABLE=m
+CONFIG_NF_FLOW_TABLE_PROCFS=y
 CONFIG_NETFILTER_XTABLES=y
 CONFIG_NETFILTER_XTABLES_COMPAT=y
 
@@ -1347,7 +1388,6 @@ CONFIG_NFT_REJECT_IPV4=m
 CONFIG_NFT_DUP_IPV4=m
 CONFIG_NFT_FIB_IPV4=m
 CONFIG_NF_TABLES_ARP=y
-CONFIG_NF_FLOW_TABLE_IPV4=m
 CONFIG_NF_DUP_IPV4=m
 CONFIG_NF_LOG_ARP=m
 CONFIG_NF_LOG_IPV4=m
@@ -1384,7 +1424,6 @@ CONFIG_NF_TABLES_IPV6=y
 CONFIG_NFT_REJECT_IPV6=m
 CONFIG_NFT_DUP_IPV6=m
 CONFIG_NFT_FIB_IPV6=m
-CONFIG_NF_FLOW_TABLE_IPV6=m
 CONFIG_NF_DUP_IPV6=m
 CONFIG_NF_REJECT_IPV6=m
 CONFIG_NF_LOG_IPV6=m
@@ -1479,10 +1518,12 @@ CONFIG_NET_DSA_TAG_DSA=m
 CONFIG_NET_DSA_TAG_EDSA=m
 CONFIG_NET_DSA_TAG_MTK=m
 CONFIG_NET_DSA_TAG_KSZ=m
-CONFIG_NET_DSA_TAG_RTL4_A=m
 CONFIG_NET_DSA_TAG_OCELOT=m
 CONFIG_NET_DSA_TAG_OCELOT_8021Q=m
 CONFIG_NET_DSA_TAG_QCA=m
+CONFIG_NET_DSA_TAG_RTL4_A=m
+CONFIG_NET_DSA_TAG_RTL8_4=m
+CONFIG_NET_DSA_TAG_RZN1_A5PSW=m
 CONFIG_NET_DSA_TAG_LAN9303=m
 CONFIG_NET_DSA_TAG_SJA1105=m
 CONFIG_NET_DSA_TAG_TRAILER=m
@@ -1704,6 +1745,7 @@ CONFIG_NET_SELFTESTS=y
 CONFIG_NET_SOCK_MSG=y
 CONFIG_NET_DEVLINK=y
 CONFIG_PAGE_POOL=y
+# CONFIG_PAGE_POOL_STATS is not set
 CONFIG_FAILOVER=m
 CONFIG_ETHTOOL_NETLINK=y
 
@@ -1748,6 +1790,8 @@ CONFIG_PCIE_BUS_DEFAULT=y
 # CONFIG_PCIE_BUS_SAFE is not set
 # CONFIG_PCIE_BUS_PERFORMANCE is not set
 # CONFIG_PCIE_BUS_PEER2PEER is not set
+CONFIG_VGA_ARB=y
+CONFIG_VGA_ARB_MAX_GPUS=16
 CONFIG_HOTPLUG_PCI=y
 CONFIG_HOTPLUG_PCI_ACPI=y
 CONFIG_HOTPLUG_PCI_ACPI_IBM=m
@@ -1827,11 +1871,15 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
 #
 CONFIG_FW_LOADER=y
 CONFIG_FW_LOADER_PAGED_BUF=y
+CONFIG_FW_LOADER_SYSFS=y
 CONFIG_EXTRA_FIRMWARE=""
 CONFIG_FW_LOADER_USER_HELPER=y
 # CONFIG_FW_LOADER_USER_HELPER_FALLBACK is not set
 CONFIG_FW_LOADER_COMPRESS=y
+CONFIG_FW_LOADER_COMPRESS_XZ=y
+CONFIG_FW_LOADER_COMPRESS_ZSTD=y
 CONFIG_FW_CACHE=y
+# CONFIG_FW_UPLOAD is not set
 # end of Firmware loader
 
 CONFIG_WANT_DEV_COREDUMP=y
@@ -1857,6 +1905,7 @@ CONFIG_DMA_SHARED_BUFFER=y
 #
 CONFIG_MHI_BUS=m
 # CONFIG_MHI_BUS_PCI_GENERIC is not set
+CONFIG_MHI_BUS_EP=m
 # end of Bus devices
 
 CONFIG_CONNECTOR=y
@@ -1887,11 +1936,11 @@ CONFIG_SYSFB_SIMPLEFB=y
 #
 # EFI (Extensible Firmware Interface) Support
 #
-CONFIG_EFI_VARS=y
 CONFIG_EFI_ESRT=y
 CONFIG_EFI_VARS_PSTORE=y
 # CONFIG_EFI_VARS_PSTORE_DEFAULT_DISABLE is not set
 # CONFIG_EFI_FAKE_MEMMAP is not set
+CONFIG_EFI_DXE_MEM_ATTRIBUTES=y
 CONFIG_EFI_RUNTIME_WRAPPERS=y
 CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y
 # CONFIG_EFI_BOOTLOADER_CONTROL is not set
@@ -1901,12 +1950,14 @@ CONFIG_EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER=y
 # CONFIG_RESET_ATTACK_MITIGATION is not set
 # CONFIG_EFI_RCI2_TABLE is not set
 CONFIG_EFI_DISABLE_PCI_DMA=y
+CONFIG_EFI_EARLYCON=y
+# CONFIG_EFI_CUSTOM_SSDT_OVERLAYS is not set
+CONFIG_EFI_DISABLE_RUNTIME=y
+CONFIG_EFI_COCO_SECRET=y
 # end of EFI (Extensible Firmware Interface) Support
 
 CONFIG_UEFI_CPER=y
 CONFIG_UEFI_CPER_X86=y
-CONFIG_EFI_EARLYCON=y
-# CONFIG_EFI_CUSTOM_SSDT_OVERLAYS is not set
 
 #
 # Tegra firmware driver
@@ -1941,12 +1992,11 @@ CONFIG_BLK_DEV_FD=m
 CONFIG_CDROM=y
 # CONFIG_PARIDE is not set
 CONFIG_BLK_DEV_PCIESSD_MTIP32XX=m
+# CONFIG_ZRAM is not set
 CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_LOOP_MIN_COUNT=8
-CONFIG_BLK_DEV_CRYPTOLOOP=m
 # CONFIG_BLK_DEV_DRBD is not set
 # CONFIG_BLK_DEV_NBD is not set
-CONFIG_BLK_DEV_SX8=m
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_COUNT=16
 CONFIG_BLK_DEV_RAM_SIZE=16384
@@ -1956,7 +2006,7 @@ CONFIG_XEN_BLKDEV_FRONTEND=m
 CONFIG_XEN_BLKDEV_BACKEND=m
 CONFIG_VIRTIO_BLK=m
 # CONFIG_BLK_DEV_RBD is not set
-CONFIG_BLK_DEV_RSXX=m
+# CONFIG_BLK_DEV_UBLK is not set
 
 #
 # NVME Support
@@ -1964,16 +2014,19 @@ CONFIG_BLK_DEV_RSXX=m
 CONFIG_NVME_CORE=m
 CONFIG_BLK_DEV_NVME=m
 CONFIG_NVME_MULTIPATH=y
+# CONFIG_NVME_VERBOSE_ERRORS is not set
 CONFIG_NVME_HWMON=y
 CONFIG_NVME_FABRICS=m
 CONFIG_NVME_FC=m
 CONFIG_NVME_TCP=m
+# CONFIG_NVME_AUTH is not set
 CONFIG_NVME_TARGET=m
 CONFIG_NVME_TARGET_PASSTHRU=y
 # CONFIG_NVME_TARGET_LOOP is not set
 CONFIG_NVME_TARGET_FC=m
 CONFIG_NVME_TARGET_FCLOOP=m
 CONFIG_NVME_TARGET_TCP=m
+# CONFIG_NVME_TARGET_AUTH is not set
 # end of NVME Support
 
 #
@@ -2032,10 +2085,12 @@ CONFIG_TI_ST=m
 # Altera FPGA firmware download module (requires I2C)
 #
 CONFIG_ALTERA_STAPL=m
-# CONFIG_INTEL_MEI is not set
-# CONFIG_INTEL_MEI_ME is not set
+CONFIG_INTEL_MEI=m
+CONFIG_INTEL_MEI_ME=m
 # CONFIG_INTEL_MEI_TXE is not set
+CONFIG_INTEL_MEI_GSC=m
 # CONFIG_INTEL_MEI_HDCP is not set
+CONFIG_INTEL_MEI_PXP=m
 CONFIG_VMWARE_VMCI=m
 CONFIG_GENWQE=m
 CONFIG_GENWQE_PLATFORM_ERROR_RECOVERY=0
@@ -2119,7 +2174,6 @@ CONFIG_SCSI_MVSAS=m
 # CONFIG_SCSI_MVSAS_DEBUG is not set
 CONFIG_SCSI_MVSAS_TASKLET=y
 CONFIG_SCSI_MVUMI=m
-CONFIG_SCSI_DPT_I2O=m
 CONFIG_SCSI_ADVANSYS=m
 CONFIG_SCSI_ARCMSR=m
 CONFIG_SCSI_ESAS2R=m
@@ -2134,15 +2188,6 @@ CONFIG_SCSI_MPT3SAS_MAX_SGE=128
 CONFIG_SCSI_MPT2SAS=m
 CONFIG_SCSI_MPI3MR=m
 CONFIG_SCSI_SMARTPQI=m
-CONFIG_SCSI_UFSHCD=m
-CONFIG_SCSI_UFSHCD_PCI=m
-CONFIG_SCSI_UFS_DWC_TC_PCI=m
-CONFIG_SCSI_UFSHCD_PLATFORM=m
-CONFIG_SCSI_UFS_CDNS_PLATFORM=m
-CONFIG_SCSI_UFS_DWC_TC_PLATFORM=m
-CONFIG_SCSI_UFS_BSG=y
-CONFIG_SCSI_UFS_CRYPTO=y
-# CONFIG_SCSI_UFS_HPB is not set
 CONFIG_SCSI_HPTIOP=m
 CONFIG_SCSI_BUSLOGIC=m
 # CONFIG_SCSI_FLASHPOINT is not set
@@ -2237,7 +2282,6 @@ CONFIG_ATA_BMDMA=y
 CONFIG_ATA_PIIX=y
 CONFIG_SATA_DWC=m
 # CONFIG_SATA_DWC_OLD_DMA is not set
-# CONFIG_SATA_DWC_DEBUG is not set
 CONFIG_SATA_MV=m
 CONFIG_SATA_NV=m
 CONFIG_SATA_PROMISE=m
@@ -2394,6 +2438,7 @@ CONFIG_VXLAN=m
 CONFIG_GENEVE=m
 CONFIG_BAREUDP=m
 CONFIG_GTP=m
+CONFIG_AMT=m
 CONFIG_MACSEC=m
 CONFIG_NETCONSOLE=m
 CONFIG_NETCONSOLE_DYNAMIC=y
@@ -2416,9 +2461,6 @@ CONFIG_ATM_LANAI=m
 CONFIG_ATM_ENI=m
 # CONFIG_ATM_ENI_DEBUG is not set
 # CONFIG_ATM_ENI_TUNE_BURST is not set
-CONFIG_ATM_FIRESTREAM=m
-CONFIG_ATM_ZATM=m
-# CONFIG_ATM_ZATM_DEBUG is not set
 CONFIG_ATM_NICSTAR=m
 # CONFIG_ATM_NICSTAR_USE_SUNI is not set
 # CONFIG_ATM_NICSTAR_USE_IDT77105 is not set
@@ -2426,10 +2468,6 @@ CONFIG_ATM_IDT77252=m
 # CONFIG_ATM_IDT77252_DEBUG is not set
 # CONFIG_ATM_IDT77252_RCV_ALL is not set
 CONFIG_ATM_IDT77252_USE_SUNI=y
-CONFIG_ATM_AMBASSADOR=m
-# CONFIG_ATM_AMBASSADOR_DEBUG is not set
-CONFIG_ATM_HORIZON=m
-# CONFIG_ATM_HORIZON_DEBUG is not set
 CONFIG_ATM_IA=m
 # CONFIG_ATM_IA_DEBUG is not set
 CONFIG_ATM_FORE200E=m
@@ -2455,19 +2493,21 @@ CONFIG_NET_DSA_LANTIQ_GSWIP=m
 CONFIG_NET_DSA_MT7530=m
 CONFIG_NET_DSA_MV88E6060=m
 CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON=m
-CONFIG_NET_DSA_MICROCHIP_KSZ9477=m
 CONFIG_NET_DSA_MICROCHIP_KSZ9477_I2C=m
-CONFIG_NET_DSA_MICROCHIP_KSZ8795=m
 CONFIG_NET_DSA_MICROCHIP_KSZ8863_SMI=m
 CONFIG_NET_DSA_MV88E6XXX=m
 CONFIG_NET_DSA_MV88E6XXX_PTP=y
 CONFIG_NET_DSA_MSCC_SEVILLE=m
 CONFIG_NET_DSA_AR9331=m
+CONFIG_NET_DSA_QCA8K=m
 CONFIG_NET_DSA_XRS700X=m
 CONFIG_NET_DSA_XRS700X_I2C=m
 CONFIG_NET_DSA_XRS700X_MDIO=m
-CONFIG_NET_DSA_QCA8K=m
-CONFIG_NET_DSA_REALTEK_SMI=m
+CONFIG_NET_DSA_REALTEK=m
+# CONFIG_NET_DSA_REALTEK_MDIO is not set
+# CONFIG_NET_DSA_REALTEK_SMI is not set
+CONFIG_NET_DSA_REALTEK_RTL8365MB=m
+CONFIG_NET_DSA_REALTEK_RTL8366RB=m
 CONFIG_NET_DSA_SMSC_LAN9303=m
 CONFIG_NET_DSA_SMSC_LAN9303_I2C=m
 CONFIG_NET_DSA_SMSC_LAN9303_MDIO=m
@@ -2503,6 +2543,7 @@ CONFIG_AMD_XGBE_HAVE_ECC=y
 CONFIG_NET_VENDOR_AQUANTIA=y
 CONFIG_AQTION=m
 CONFIG_NET_VENDOR_ARC=y
+CONFIG_NET_VENDOR_ASIX=y
 CONFIG_NET_VENDOR_ATHEROS=y
 CONFIG_ATL2=m
 CONFIG_ATL1=m
@@ -2551,6 +2592,7 @@ CONFIG_CHELSIO_INLINE_CRYPTO=y
 CONFIG_NET_VENDOR_CISCO=y
 CONFIG_ENIC=m
 CONFIG_NET_VENDOR_CORTINA=y
+CONFIG_NET_VENDOR_DAVICOM=y
 CONFIG_DNET=m
 CONFIG_NET_VENDOR_DEC=y
 CONFIG_NET_TULIP=y
@@ -2561,7 +2603,6 @@ CONFIG_TULIP=m
 CONFIG_TULIP_MMIO=y
 CONFIG_TULIP_NAPI=y
 CONFIG_TULIP_NAPI_HW_MITIGATION=y
-CONFIG_DE4X5=m
 CONFIG_WINBOND_840=m
 CONFIG_DM9102=m
 CONFIG_ULI526X=m
@@ -2577,9 +2618,15 @@ CONFIG_BE2NET_BE2=y
 CONFIG_BE2NET_BE3=y
 CONFIG_BE2NET_LANCER=y
 CONFIG_BE2NET_SKYHAWK=y
+CONFIG_NET_VENDOR_ENGLEDER=y
+CONFIG_TSNEP=m
+# CONFIG_TSNEP_SELFTESTS is not set
 CONFIG_NET_VENDOR_EZCHIP=y
 CONFIG_NET_VENDOR_FUJITSU=y
 CONFIG_PCMCIA_FMVJ18X=m
+CONFIG_NET_VENDOR_FUNGIBLE=y
+CONFIG_FUN_CORE=m
+CONFIG_FUN_ETH=m
 CONFIG_NET_VENDOR_GOOGLE=y
 CONFIG_GVE=m
 CONFIG_NET_VENDOR_HUAWEI=y
@@ -2605,8 +2652,12 @@ CONFIG_I40E=m
 CONFIG_IAVF=m
 CONFIG_I40EVF=m
 CONFIG_ICE=m
+CONFIG_ICE_SWITCHDEV=y
+CONFIG_ICE_HWTS=y
 CONFIG_FM10K=m
 CONFIG_IGC=m
+CONFIG_NET_VENDOR_WANGXUN=y
+CONFIG_TXGBE=m
 CONFIG_JME=m
 CONFIG_NET_VENDOR_LITEX=y
 CONFIG_NET_VENDOR_MARVELL=y
@@ -2614,6 +2665,7 @@ CONFIG_MVMDIO=m
 CONFIG_SKGE=m
 CONFIG_SKGE_GENESIS=y
 CONFIG_SKY2=m
+CONFIG_OCTEON_EP=m
 CONFIG_PRESTERA=m
 CONFIG_PRESTERA_PCI=m
 CONFIG_NET_VENDOR_MELLANOX=y
@@ -2622,7 +2674,6 @@ CONFIG_MLX4_CORE=m
 # CONFIG_MLX4_DEBUG is not set
 CONFIG_MLX4_CORE_GEN2=y
 CONFIG_MLX5_CORE=m
-CONFIG_MLX5_ACCEL=y
 CONFIG_MLX5_FPGA=y
 CONFIG_MLX5_CORE_EN=y
 CONFIG_MLX5_EN_ARFS=y
@@ -2633,8 +2684,6 @@ CONFIG_MLX5_BRIDGE=y
 CONFIG_MLX5_CLS_ACT=y
 CONFIG_MLX5_TC_SAMPLE=y
 CONFIG_MLX5_CORE_IPOIB=y
-CONFIG_MLX5_FPGA_IPSEC=y
-CONFIG_MLX5_IPSEC=y
 CONFIG_MLX5_EN_IPSEC=y
 CONFIG_MLX5_SW_STEERING=y
 CONFIG_MLX5_SF=y
@@ -2668,8 +2717,6 @@ CONFIG_NATSEMI=m
 CONFIG_NS83820=m
 CONFIG_NET_VENDOR_NETERION=y
 CONFIG_S2IO=m
-CONFIG_VXGE=m
-# CONFIG_VXGE_DEBUG_TRACE_ALL is not set
 CONFIG_NET_VENDOR_NETRONOME=y
 CONFIG_NFP=m
 CONFIG_NFP_APP_FLOWER=y
@@ -2734,6 +2781,10 @@ CONFIG_SFC_MCDI_MON=y
 CONFIG_SFC_SRIOV=y
 CONFIG_SFC_MCDI_LOGGING=y
 CONFIG_SFC_FALCON=m
+CONFIG_SFC_SIENA=m
+CONFIG_SFC_SIENA_MCDI_MON=y
+CONFIG_SFC_SIENA_SRIOV=y
+CONFIG_SFC_SIENA_MCDI_LOGGING=y
 CONFIG_NET_VENDOR_SMSC=y
 CONFIG_PCMCIA_SMC91C92=m
 CONFIG_EPIC100=m
@@ -2761,6 +2812,7 @@ CONFIG_TEHUTI=m
 CONFIG_NET_VENDOR_TI=y
 # CONFIG_TI_CPSW_PHY_SEL is not set
 CONFIG_TLAN=m
+CONFIG_NET_VENDOR_VERTEXCOM=y
 CONFIG_NET_VENDOR_VIA=y
 CONFIG_VIA_RHINE=m
 CONFIG_VIA_RHINE_MMIO=y
@@ -2792,6 +2844,7 @@ CONFIG_SFP=m
 #
 CONFIG_AMD_PHY=m
 CONFIG_ADIN_PHY=m
+CONFIG_ADIN1100_PHY=m
 CONFIG_AQUANTIA_PHY=m
 CONFIG_AX88796B_PHY=m
 CONFIG_BROADCOM_PHY=m
@@ -2832,6 +2885,7 @@ CONFIG_DP83TC811_PHY=m
 CONFIG_DP83848_PHY=m
 CONFIG_DP83867_PHY=m
 CONFIG_DP83869_PHY=m
+CONFIG_DP83TD510_PHY=m
 CONFIG_VITESSE_PHY=m
 CONFIG_XILINX_GMII2RGMII=m
 CONFIG_MDIO_DEVICE=y
@@ -2940,10 +2994,10 @@ CONFIG_ATH9K=m
 CONFIG_ATH9K_PCI=y
 CONFIG_ATH9K_AHB=y
 CONFIG_ATH9K_DFS_CERTIFIED=y
-# CONFIG_ATH9K_DYNACK is not set
+CONFIG_ATH9K_DYNACK=y
 # CONFIG_ATH9K_WOW is not set
 CONFIG_ATH9K_RFKILL=y
-# CONFIG_ATH9K_CHANNEL_CONTEXT is not set
+CONFIG_ATH9K_CHANNEL_CONTEXT=y
 CONFIG_ATH9K_PCOEM=y
 CONFIG_ATH9K_PCI_NO_EEPROM=m
 CONFIG_ATH9K_HTC=m
@@ -3008,6 +3062,7 @@ CONFIG_B43LEGACY_DMA_AND_PIO_MODE=y
 # CONFIG_B43LEGACY_PIO_MODE is not set
 CONFIG_BRCMUTIL=m
 CONFIG_BRCMSMAC=m
+CONFIG_BRCMSMAC_LEDS=y
 CONFIG_BRCMFMAC=m
 CONFIG_BRCMFMAC_PROTO_BCDC=y
 CONFIG_BRCMFMAC_PROTO_MSGBUF=y
@@ -3046,7 +3101,6 @@ CONFIG_IWLWIFI_LEDS=y
 CONFIG_IWLDVM=m
 CONFIG_IWLMVM=m
 CONFIG_IWLWIFI_OPMODE_MODULAR=y
-# CONFIG_IWLWIFI_BCAST_FILTERING is not set
 
 #
 # Debugging Options
@@ -3112,9 +3166,14 @@ CONFIG_MT7663_USB_SDIO_COMMON=m
 CONFIG_MT7663U=m
 CONFIG_MT7663S=m
 CONFIG_MT7915E=m
+CONFIG_MT7921_COMMON=m
 CONFIG_MT7921E=m
+CONFIG_MT7921S=m
+CONFIG_MT7921U=m
 CONFIG_WLAN_VENDOR_MICROCHIP=y
 # CONFIG_WILC1000_SDIO is not set
+CONFIG_WLAN_VENDOR_PURELIFI=y
+CONFIG_PLFXLC=m
 CONFIG_WLAN_VENDOR_RALINK=y
 CONFIG_RT2X00=m
 CONFIG_RT2400PCI=m
@@ -3180,11 +3239,22 @@ CONFIG_RTW88_8723DE=m
 CONFIG_RTW88_8821CE=m
 # CONFIG_RTW88_DEBUG is not set
 # CONFIG_RTW88_DEBUGFS is not set
+CONFIG_RTW89=m
+CONFIG_RTW89_CORE=m
+CONFIG_RTW89_PCI=m
+CONFIG_RTW89_8852A=m
+CONFIG_RTW89_8852C=m
+CONFIG_RTW89_8852AE=m
+CONFIG_RTW89_8852CE=m
+# CONFIG_RTW89_DEBUGMSG is not set
+# CONFIG_RTW89_DEBUGFS is not set
 CONFIG_WLAN_VENDOR_RSI=y
 CONFIG_RSI_91X=m
 CONFIG_RSI_DEBUGFS=y
 CONFIG_RSI_SDIO=m
 CONFIG_RSI_USB=m
+CONFIG_WLAN_VENDOR_SILABS=y
+# CONFIG_WFX is not set
 CONFIG_WLAN_VENDOR_ST=y
 CONFIG_CW1200=m
 CONFIG_CW1200_WLAN_SDIO=m
@@ -3213,7 +3283,12 @@ CONFIG_USB_NET_RNDIS_WLAN=m
 #
 # Wireless WAN
 #
-# CONFIG_WWAN is not set
+CONFIG_WWAN=m
+CONFIG_WWAN_HWSIM=m
+CONFIG_MHI_WWAN_CTRL=m
+CONFIG_MHI_WWAN_MBIM=m
+CONFIG_IOSM=m
+CONFIG_MTK_T7XX=m
 # end of Wireless WAN
 
 CONFIG_XEN_NETDEV_FRONTEND=m
@@ -3232,6 +3307,7 @@ CONFIG_INPUT_LEDS=y
 CONFIG_INPUT_FF_MEMLESS=y
 CONFIG_INPUT_SPARSEKMAP=m
 CONFIG_INPUT_MATRIXKMAP=m
+CONFIG_INPUT_VIVALDIFMAP=y
 
 #
 # Userland interfaces
@@ -3273,6 +3349,7 @@ CONFIG_KEYBOARD_LM8333=m
 # CONFIG_KEYBOARD_SUNKBD is not set
 # CONFIG_KEYBOARD_TM2_TOUCHKEY is not set
 # CONFIG_KEYBOARD_XTKBD is not set
+# CONFIG_KEYBOARD_CYPRESS_SF is not set
 CONFIG_INPUT_MOUSE=y
 CONFIG_MOUSE_PS2=m
 CONFIG_MOUSE_PS2_ALPS=y
@@ -3330,6 +3407,7 @@ CONFIG_INPUT_DA7280_HAPTICS=m
 # CONFIG_INPUT_IMS_PCU is not set
 # CONFIG_INPUT_IQS269A is not set
 # CONFIG_INPUT_IQS626A is not set
+# CONFIG_INPUT_IQS7222 is not set
 # CONFIG_INPUT_CMA3000 is not set
 CONFIG_INPUT_XEN_KBDDEV_FRONTEND=y
 CONFIG_INPUT_IDEAPAD_SLIDEBAR=m
@@ -3401,6 +3479,7 @@ CONFIG_SERIAL_8250_DW=m
 CONFIG_SERIAL_8250_RT288X=y
 CONFIG_SERIAL_8250_LPSS=y
 CONFIG_SERIAL_8250_MID=y
+CONFIG_SERIAL_8250_PERICOM=y
 
 #
 # Non-8250 serial port support
@@ -3414,7 +3493,6 @@ CONFIG_SERIAL_SCCNXP=m
 CONFIG_SERIAL_SC16IS7XX_CORE=m
 CONFIG_SERIAL_SC16IS7XX=m
 CONFIG_SERIAL_SC16IS7XX_I2C=y
-CONFIG_SERIAL_BCM63XX=m
 # CONFIG_SERIAL_ALTERA_JTAGUART is not set
 # CONFIG_SERIAL_ALTERA_UART is not set
 CONFIG_SERIAL_ARC=m
@@ -3452,6 +3530,7 @@ CONFIG_IPMI_PLAT_DATA=y
 CONFIG_IPMI_DEVICE_INTERFACE=m
 CONFIG_IPMI_SI=m
 CONFIG_IPMI_SSIF=m
+CONFIG_IPMI_IPMB=m
 CONFIG_IPMI_WATCHDOG=m
 CONFIG_IPMI_POWEROFF=m
 # CONFIG_IPMB_DEVICE_INTERFACE is not set
@@ -3486,6 +3565,7 @@ CONFIG_TCG_TPM=m
 CONFIG_HW_RANDOM_TPM=y
 CONFIG_TCG_TIS_CORE=m
 CONFIG_TCG_TIS=m
+CONFIG_TCG_TIS_I2C=m
 CONFIG_TCG_TIS_I2C_CR50=m
 CONFIG_TCG_TIS_I2C_ATMEL=m
 CONFIG_TCG_TIS_I2C_INFINEON=m
@@ -3537,6 +3617,7 @@ CONFIG_I2C_ALGOPCA=m
 #
 # PC SMBus host controller drivers
 #
+CONFIG_I2C_CCGX_UCSI=m
 CONFIG_I2C_ALI1535=m
 CONFIG_I2C_ALI1563=m
 CONFIG_I2C_ALI15X3=m
@@ -3569,6 +3650,7 @@ CONFIG_I2C_CBUS_GPIO=m
 CONFIG_I2C_DESIGNWARE_CORE=m
 # CONFIG_I2C_DESIGNWARE_SLAVE is not set
 CONFIG_I2C_DESIGNWARE_PLATFORM=m
+CONFIG_I2C_DESIGNWARE_AMDPSP=y
 CONFIG_I2C_DESIGNWARE_BAYTRAIL=y
 # CONFIG_I2C_DESIGNWARE_PCI is not set
 CONFIG_I2C_EMEV2=m
@@ -3656,10 +3738,15 @@ CONFIG_PINMUX=y
 CONFIG_PINCONF=y
 CONFIG_GENERIC_PINCONF=y
 # CONFIG_DEBUG_PINCTRL is not set
-CONFIG_PINCTRL_AMD=m
+CONFIG_PINCTRL_AMD=y
 # CONFIG_PINCTRL_DA9062 is not set
 CONFIG_PINCTRL_MCP23S08_I2C=m
 CONFIG_PINCTRL_MCP23S08=m
+CONFIG_PINCTRL_MADERA=m
+
+#
+# Intel pinctrl drivers
+#
 CONFIG_PINCTRL_BAYTRAIL=y
 CONFIG_PINCTRL_CHERRYVIEW=m
 CONFIG_PINCTRL_LYNXPOINT=m
@@ -3676,15 +3763,16 @@ CONFIG_PINCTRL_GEMINILAKE=m
 # CONFIG_PINCTRL_JASPERLAKE is not set
 CONFIG_PINCTRL_LAKEFIELD=m
 CONFIG_PINCTRL_LEWISBURG=m
+CONFIG_PINCTRL_METEORLAKE=m
 CONFIG_PINCTRL_SUNRISEPOINT=m
 # CONFIG_PINCTRL_TIGERLAKE is not set
+# end of Intel pinctrl drivers
 
 #
 # Renesas pinctrl drivers
 #
 # end of Renesas pinctrl drivers
 
-CONFIG_PINCTRL_MADERA=m
 CONFIG_GPIOLIB=y
 CONFIG_GPIOLIB_FASTPATH_LIMIT=512
 CONFIG_GPIO_ACPI=y
@@ -3762,6 +3850,7 @@ CONFIG_GPIO_VIPERBOARD=m
 # CONFIG_GPIO_AGGREGATOR is not set
 CONFIG_GPIO_MOCKUP=m
 CONFIG_GPIO_VIRTIO=m
+# CONFIG_GPIO_SIM is not set
 # end of Virtual GPIO drivers
 
 CONFIG_W1=m
@@ -3808,6 +3897,7 @@ CONFIG_POWER_SUPPLY=y
 # CONFIG_POWER_SUPPLY_DEBUG is not set
 CONFIG_POWER_SUPPLY_HWMON=y
 # CONFIG_PDA_POWER is not set
+# CONFIG_IP5XXX_POWER is not set
 # CONFIG_TEST_POWER is not set
 # CONFIG_CHARGER_ADP5061 is not set
 # CONFIG_BATTERY_CW2015 is not set
@@ -3815,6 +3905,7 @@ CONFIG_POWER_SUPPLY_HWMON=y
 # CONFIG_BATTERY_DS2780 is not set
 # CONFIG_BATTERY_DS2781 is not set
 # CONFIG_BATTERY_DS2782 is not set
+# CONFIG_BATTERY_SAMSUNG_SDI is not set
 # CONFIG_BATTERY_SBS is not set
 # CONFIG_CHARGER_SBS is not set
 # CONFIG_MANAGER_SBS is not set
@@ -3829,6 +3920,7 @@ CONFIG_POWER_SUPPLY_HWMON=y
 # CONFIG_CHARGER_GPIO is not set
 # CONFIG_CHARGER_LT3651 is not set
 # CONFIG_CHARGER_LTC4162L is not set
+# CONFIG_CHARGER_MAX77976 is not set
 # CONFIG_CHARGER_BQ2415X is not set
 # CONFIG_CHARGER_BQ24190 is not set
 # CONFIG_CHARGER_BQ24257 is not set
@@ -3842,6 +3934,7 @@ CONFIG_POWER_SUPPLY_HWMON=y
 # CONFIG_BATTERY_RT5033 is not set
 # CONFIG_CHARGER_RT9455 is not set
 # CONFIG_CHARGER_BD99954 is not set
+# CONFIG_BATTERY_UG3105 is not set
 CONFIG_HWMON=y
 CONFIG_HWMON_VID=m
 # CONFIG_HWMON_DEBUG_CHIP is not set
@@ -3853,7 +3946,6 @@ CONFIG_SENSORS_ABITUGURU=m
 CONFIG_SENSORS_ABITUGURU3=m
 CONFIG_SENSORS_AD7414=m
 CONFIG_SENSORS_AD7418=m
-CONFIG_SENSORS_ADM1021=m
 CONFIG_SENSORS_ADM1025=m
 CONFIG_SENSORS_ADM1026=m
 CONFIG_SENSORS_ADM1029=m
@@ -3884,6 +3976,7 @@ CONFIG_SENSORS_DRIVETEMP=m
 CONFIG_SENSORS_DS620=m
 CONFIG_SENSORS_DS1621=m
 CONFIG_SENSORS_DELL_SMM=m
+# CONFIG_I8K is not set
 CONFIG_SENSORS_I5K_AMB=m
 CONFIG_SENSORS_F71805F=m
 CONFIG_SENSORS_F71882FG=m
@@ -3920,9 +4013,9 @@ CONFIG_SENSORS_MAX1619=m
 CONFIG_SENSORS_MAX1668=m
 CONFIG_SENSORS_MAX197=m
 CONFIG_SENSORS_MAX31730=m
+CONFIG_SENSORS_MAX6620=m
 CONFIG_SENSORS_MAX6621=m
 CONFIG_SENSORS_MAX6639=m
-CONFIG_SENSORS_MAX6642=m
 CONFIG_SENSORS_MAX6650=m
 CONFIG_SENSORS_MAX6697=m
 CONFIG_SENSORS_MAX31790=m
@@ -3947,13 +4040,15 @@ CONFIG_SENSORS_LM95241=m
 CONFIG_SENSORS_LM95245=m
 CONFIG_SENSORS_PC87360=m
 CONFIG_SENSORS_PC87427=m
-CONFIG_SENSORS_NTC_THERMISTOR=m
 CONFIG_SENSORS_NCT6683=m
+CONFIG_SENSORS_NCT6775_CORE=m
 CONFIG_SENSORS_NCT6775=m
+CONFIG_SENSORS_NCT6775_I2C=m
 CONFIG_SENSORS_NCT7802=m
 CONFIG_SENSORS_NCT7904=m
 CONFIG_SENSORS_NPCM7XX=m
 CONFIG_SENSORS_NZXT_KRAKEN2=m
+CONFIG_SENSORS_NZXT_SMART2=m
 CONFIG_SENSORS_PCF8591=m
 CONFIG_PMBUS=m
 CONFIG_SENSORS_PMBUS=m
@@ -3961,6 +4056,7 @@ CONFIG_SENSORS_PMBUS=m
 CONFIG_SENSORS_ADM1275=m
 CONFIG_SENSORS_BEL_PFE=m
 CONFIG_SENSORS_BPA_RS600=m
+CONFIG_SENSORS_DELTA_AHE50DC_FAN=m
 CONFIG_SENSORS_FSP_3Y=m
 CONFIG_SENSORS_IBM_CFFPS=m
 CONFIG_SENSORS_DPS920AB=m
@@ -3971,6 +4067,7 @@ CONFIG_SENSORS_IR38064=m
 CONFIG_SENSORS_IRPS5401=m
 CONFIG_SENSORS_ISL68137=m
 CONFIG_SENSORS_LM25066=m
+CONFIG_SENSORS_LT7182S=m
 # CONFIG_SENSORS_LTC2978 is not set
 CONFIG_SENSORS_LTC3815=m
 CONFIG_SENSORS_MAX15301=m
@@ -3983,7 +4080,9 @@ CONFIG_SENSORS_MAX34440=m
 CONFIG_SENSORS_MAX8688=m
 CONFIG_SENSORS_MP2888=m
 # CONFIG_SENSORS_MP2975 is not set
+CONFIG_SENSORS_MP5023=m
 CONFIG_SENSORS_PIM4328=m
+CONFIG_SENSORS_PLI1209BC=m
 CONFIG_SENSORS_PM6764TR=m
 CONFIG_SENSORS_PXE1610=m
 CONFIG_SENSORS_Q54SJ108A2=m
@@ -3992,6 +4091,7 @@ CONFIG_SENSORS_TPS40422=m
 CONFIG_SENSORS_TPS53679=m
 CONFIG_SENSORS_UCD9000=m
 CONFIG_SENSORS_UCD9200=m
+CONFIG_SENSORS_XDPE152=m
 CONFIG_SENSORS_XDPE122=m
 # CONFIG_SENSORS_ZL6100 is not set
 CONFIG_SENSORS_SBTSI=m
@@ -4002,6 +4102,7 @@ CONFIG_SENSORS_SHT3x=m
 CONFIG_SENSORS_SHT4x=m
 CONFIG_SENSORS_SHTC1=m
 CONFIG_SENSORS_SIS5595=m
+CONFIG_SENSORS_SY7636A=m
 CONFIG_SENSORS_DME1737=m
 CONFIG_SENSORS_EMC1403=m
 # CONFIG_SENSORS_EMC2103 is not set
@@ -4019,6 +4120,7 @@ CONFIG_SENSORS_ADS7828=m
 CONFIG_SENSORS_AMC6821=m
 CONFIG_SENSORS_INA209=m
 CONFIG_SENSORS_INA2XX=m
+CONFIG_SENSORS_INA238=m
 CONFIG_SENSORS_INA3221=m
 CONFIG_SENSORS_TC74=m
 CONFIG_SENSORS_THMC50=m
@@ -4027,6 +4129,7 @@ CONFIG_SENSORS_TMP103=m
 CONFIG_SENSORS_TMP108=m
 CONFIG_SENSORS_TMP401=m
 CONFIG_SENSORS_TMP421=m
+CONFIG_SENSORS_TMP464=m
 CONFIG_SENSORS_TMP513=m
 CONFIG_SENSORS_VIA_CPUTEMP=m
 CONFIG_SENSORS_VIA686A=m
@@ -4050,8 +4153,10 @@ CONFIG_SENSORS_W83627EHF=m
 #
 CONFIG_SENSORS_ACPI_POWER=m
 CONFIG_SENSORS_ATK0110=m
+CONFIG_SENSORS_ASUS_WMI=m
+CONFIG_SENSORS_ASUS_EC=m
 CONFIG_THERMAL=y
-# CONFIG_THERMAL_NETLINK is not set
+CONFIG_THERMAL_NETLINK=y
 # CONFIG_THERMAL_STATISTICS is not set
 CONFIG_THERMAL_EMERGENCY_POWEROFF_DELAY_MS=0
 CONFIG_THERMAL_HWMON=y
@@ -4086,6 +4191,7 @@ CONFIG_INT3406_THERMAL=m
 CONFIG_INTEL_PCH_THERMAL=m
 CONFIG_INTEL_TCC_COOLING=m
 # CONFIG_INTEL_MENLOW is not set
+CONFIG_INTEL_HFI_THERMAL=y
 # end of Intel thermal drivers
 
 CONFIG_WATCHDOG=y
@@ -4148,6 +4254,7 @@ CONFIG_W83877F_WDT=m
 CONFIG_W83977F_WDT=m
 CONFIG_MACHZ_WDT=m
 CONFIG_SBC_EPX_C3_WATCHDOG=m
+CONFIG_INTEL_MEI_WDT=m
 CONFIG_NI903X_WDT=m
 CONFIG_NIC7018_WDT=m
 CONFIG_MEN_A21_WDT=m
@@ -4214,11 +4321,9 @@ CONFIG_MFD_DLN2=m
 # CONFIG_MFD_INTEL_QUARK_I2C_GPIO is not set
 CONFIG_LPC_ICH=m
 CONFIG_LPC_SCH=m
-# CONFIG_INTEL_SOC_PMIC_CHTDC_TI is not set
 # CONFIG_MFD_INTEL_LPSS_ACPI is not set
 # CONFIG_MFD_INTEL_LPSS_PCI is not set
 # CONFIG_MFD_INTEL_PMC_BXT is not set
-CONFIG_MFD_INTEL_PMT=m
 # CONFIG_MFD_IQS62X is not set
 # CONFIG_MFD_JANZ_CMODIO is not set
 # CONFIG_MFD_KEMPLD is not set
@@ -4238,6 +4343,7 @@ CONFIG_MFD_RETU=m
 # CONFIG_MFD_RT4831 is not set
 # CONFIG_MFD_RT5033 is not set
 # CONFIG_MFD_SI476X_CORE is not set
+CONFIG_MFD_SIMPLE_MFD_I2C=m
 CONFIG_MFD_SM501=m
 CONFIG_MFD_SM501_GPIO=y
 # CONFIG_MFD_SKY81452 is not set
@@ -4262,42 +4368,47 @@ CONFIG_MFD_VX855=m
 
 # CONFIG_REGULATOR is not set
 CONFIG_RC_CORE=m
-CONFIG_RC_MAP=m
 # CONFIG_LIRC is not set
+CONFIG_RC_MAP=m
 CONFIG_RC_DECODERS=y
+CONFIG_IR_IMON_DECODER=m
+CONFIG_IR_JVC_DECODER=m
+CONFIG_IR_MCE_KBD_DECODER=m
 CONFIG_IR_NEC_DECODER=m
 CONFIG_IR_RC5_DECODER=m
 CONFIG_IR_RC6_DECODER=m
-CONFIG_IR_JVC_DECODER=m
-CONFIG_IR_SONY_DECODER=m
+CONFIG_IR_RCMM_DECODER=m
 CONFIG_IR_SANYO_DECODER=m
 CONFIG_IR_SHARP_DECODER=m
-CONFIG_IR_MCE_KBD_DECODER=m
+CONFIG_IR_SONY_DECODER=m
 CONFIG_IR_XMP_DECODER=m
-CONFIG_IR_IMON_DECODER=m
-CONFIG_IR_RCMM_DECODER=m
 CONFIG_RC_DEVICES=y
-CONFIG_RC_ATI_REMOTE=m
 CONFIG_IR_ENE=m
+CONFIG_IR_FINTEK=m
+CONFIG_IR_IGORPLUGUSB=m
+CONFIG_IR_IGUANA=m
 CONFIG_IR_IMON=m
 CONFIG_IR_IMON_RAW=m
-CONFIG_IR_MCEUSB=m
 CONFIG_IR_ITE_CIR=m
-CONFIG_IR_FINTEK=m
+CONFIG_IR_MCEUSB=m
 CONFIG_IR_NUVOTON=m
 CONFIG_IR_REDRAT3=m
+CONFIG_IR_SERIAL=m
+CONFIG_IR_SERIAL_TRANSMITTER=y
 CONFIG_IR_STREAMZAP=m
-CONFIG_IR_WINBOND_CIR=m
-CONFIG_IR_IGORPLUGUSB=m
-CONFIG_IR_IGUANA=m
+CONFIG_IR_TOY=m
 CONFIG_IR_TTUSBIR=m
+CONFIG_IR_WINBOND_CIR=m
+CONFIG_RC_ATI_REMOTE=m
 CONFIG_RC_LOOPBACK=m
-CONFIG_IR_SERIAL=m
-CONFIG_IR_SERIAL_TRANSMITTER=y
-CONFIG_IR_SIR=m
 CONFIG_RC_XBOX_DVD=m
-CONFIG_IR_TOY=m
+
+#
+# CEC support
+#
 # CONFIG_MEDIA_CEC_SUPPORT is not set
+# end of CEC support
+
 CONFIG_MEDIA_SUPPORT=m
 # CONFIG_MEDIA_SUPPORT_FILTER is not set
 CONFIG_MEDIA_SUBDRV_AUTOSELECT=y
@@ -4325,9 +4436,7 @@ CONFIG_DVB_CORE=m
 #
 # Video4Linux options
 #
-CONFIG_VIDEO_V4L2=m
 CONFIG_VIDEO_V4L2_I2C=y
-CONFIG_VIDEO_V4L2_SUBDEV_API=y
 # CONFIG_VIDEO_ADV_DEBUG is not set
 # CONFIG_VIDEO_FIXED_MINOR_RANGES is not set
 CONFIG_VIDEO_TUNER=m
@@ -4356,6 +4465,10 @@ CONFIG_DVB_DYNAMIC_MINORS=y
 # CONFIG_DVB_ULE_DEBUG is not set
 # end of Digital TV options
 
+#
+# Media drivers
+#
+
 #
 # Media drivers
 #
@@ -4364,12 +4477,8 @@ CONFIG_MEDIA_USB_SUPPORT=y
 #
 # Webcam devices
 #
-CONFIG_USB_VIDEO_CLASS=m
-CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
+CONFIG_VIDEO_CPIA2=m
 CONFIG_USB_GSPCA=m
-CONFIG_USB_M5602=m
-CONFIG_USB_STV06XX=m
-CONFIG_USB_GL860=m
 CONFIG_USB_GSPCA_BENQ=m
 CONFIG_USB_GSPCA_CONEX=m
 CONFIG_USB_GSPCA_CPIA1=m
@@ -4394,13 +4503,13 @@ CONFIG_USB_GSPCA_SN9C2028=m
 CONFIG_USB_GSPCA_SN9C20X=m
 CONFIG_USB_GSPCA_SONIXB=m
 CONFIG_USB_GSPCA_SONIXJ=m
+CONFIG_USB_GSPCA_SPCA1528=m
 CONFIG_USB_GSPCA_SPCA500=m
 CONFIG_USB_GSPCA_SPCA501=m
 CONFIG_USB_GSPCA_SPCA505=m
 CONFIG_USB_GSPCA_SPCA506=m
 CONFIG_USB_GSPCA_SPCA508=m
 CONFIG_USB_GSPCA_SPCA561=m
-CONFIG_USB_GSPCA_SPCA1528=m
 CONFIG_USB_GSPCA_SQ905=m
 CONFIG_USB_GSPCA_SQ905C=m
 CONFIG_USB_GSPCA_SQ930X=m
@@ -4416,29 +4525,32 @@ CONFIG_USB_GSPCA_VC032X=m
 CONFIG_USB_GSPCA_VICAM=m
 CONFIG_USB_GSPCA_XIRLINK_CIT=m
 CONFIG_USB_GSPCA_ZC3XX=m
+CONFIG_USB_GL860=m
+CONFIG_USB_M5602=m
+CONFIG_USB_STV06XX=m
 CONFIG_USB_PWC=m
 # CONFIG_USB_PWC_DEBUG is not set
 CONFIG_USB_PWC_INPUT_EVDEV=y
-CONFIG_VIDEO_CPIA2=m
-CONFIG_USB_ZR364XX=m
-CONFIG_USB_STKWEBCAM=m
 CONFIG_USB_S2255=m
 CONFIG_VIDEO_USBTV=m
+CONFIG_USB_VIDEO_CLASS=m
+CONFIG_USB_VIDEO_CLASS_INPUT_EVDEV=y
+CONFIG_USB_ZR364XX=m
 
 #
 # Analog TV USB devices
 #
+CONFIG_VIDEO_GO7007=m
+CONFIG_VIDEO_GO7007_USB=m
+CONFIG_VIDEO_GO7007_LOADER=m
+CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m
+CONFIG_VIDEO_HDPVR=m
 CONFIG_VIDEO_PVRUSB2=m
 CONFIG_VIDEO_PVRUSB2_SYSFS=y
 CONFIG_VIDEO_PVRUSB2_DVB=y
 # CONFIG_VIDEO_PVRUSB2_DEBUGIFC is not set
-CONFIG_VIDEO_HDPVR=m
 CONFIG_VIDEO_STK1160_COMMON=m
 CONFIG_VIDEO_STK1160=m
-CONFIG_VIDEO_GO7007=m
-CONFIG_VIDEO_GO7007_USB=m
-CONFIG_VIDEO_GO7007_LOADER=m
-CONFIG_VIDEO_GO7007_USB_S2250_BOARD=m
 
 #
 # Analog/digital TV USB devices
@@ -4457,34 +4569,9 @@ CONFIG_VIDEO_TM6000_DVB=m
 #
 # Digital TV USB devices
 #
-CONFIG_DVB_USB=m
-# CONFIG_DVB_USB_DEBUG is not set
-CONFIG_DVB_USB_DIB3000MC=m
-CONFIG_DVB_USB_A800=m
-CONFIG_DVB_USB_DIBUSB_MB=m
-CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y
-CONFIG_DVB_USB_DIBUSB_MC=m
-CONFIG_DVB_USB_DIB0700=m
-CONFIG_DVB_USB_UMT_010=m
-CONFIG_DVB_USB_CXUSB=m
-# CONFIG_DVB_USB_CXUSB_ANALOG is not set
-CONFIG_DVB_USB_M920X=m
-CONFIG_DVB_USB_DIGITV=m
-CONFIG_DVB_USB_VP7045=m
-CONFIG_DVB_USB_VP702X=m
-CONFIG_DVB_USB_GP8PSK=m
-CONFIG_DVB_USB_NOVA_T_USB2=m
-CONFIG_DVB_USB_TTUSB2=m
-CONFIG_DVB_USB_DTT200U=m
-CONFIG_DVB_USB_OPERA1=m
-CONFIG_DVB_USB_AF9005=m
-CONFIG_DVB_USB_AF9005_REMOTE=m
-CONFIG_DVB_USB_PCTV452E=m
-CONFIG_DVB_USB_DW2102=m
-CONFIG_DVB_USB_CINERGY_T2=m
-CONFIG_DVB_USB_DTV5100=m
-CONFIG_DVB_USB_AZ6027=m
-CONFIG_DVB_USB_TECHNISAT_USB2=m
+CONFIG_DVB_AS102=m
+CONFIG_DVB_B2C2_FLEXCOP_USB=m
+# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set
 CONFIG_DVB_USB_V2=m
 CONFIG_DVB_USB_AF9015=m
 CONFIG_DVB_USB_AF9035=m
@@ -4492,19 +4579,44 @@ CONFIG_DVB_USB_ANYSEE=m
 CONFIG_DVB_USB_AU6610=m
 CONFIG_DVB_USB_AZ6007=m
 CONFIG_DVB_USB_CE6230=m
+CONFIG_DVB_USB_DVBSKY=m
 CONFIG_DVB_USB_EC168=m
 CONFIG_DVB_USB_GL861=m
 CONFIG_DVB_USB_LME2510=m
 CONFIG_DVB_USB_MXL111SF=m
 CONFIG_DVB_USB_RTL28XXU=m
-CONFIG_DVB_USB_DVBSKY=m
 CONFIG_DVB_USB_ZD1301=m
+CONFIG_DVB_USB=m
+# CONFIG_DVB_USB_DEBUG is not set
+CONFIG_DVB_USB_A800=m
+CONFIG_DVB_USB_AF9005=m
+CONFIG_DVB_USB_AF9005_REMOTE=m
+CONFIG_DVB_USB_AZ6027=m
+CONFIG_DVB_USB_CINERGY_T2=m
+CONFIG_DVB_USB_CXUSB=m
+# CONFIG_DVB_USB_CXUSB_ANALOG is not set
+CONFIG_DVB_USB_DIB0700=m
+CONFIG_DVB_USB_DIB3000MC=m
+CONFIG_DVB_USB_DIBUSB_MB=m
+CONFIG_DVB_USB_DIBUSB_MB_FAULTY=y
+CONFIG_DVB_USB_DIBUSB_MC=m
+CONFIG_DVB_USB_DIGITV=m
+CONFIG_DVB_USB_DTT200U=m
+CONFIG_DVB_USB_DTV5100=m
+CONFIG_DVB_USB_DW2102=m
+CONFIG_DVB_USB_GP8PSK=m
+CONFIG_DVB_USB_M920X=m
+CONFIG_DVB_USB_NOVA_T_USB2=m
+CONFIG_DVB_USB_OPERA1=m
+CONFIG_DVB_USB_PCTV452E=m
+CONFIG_DVB_USB_TECHNISAT_USB2=m
+CONFIG_DVB_USB_TTUSB2=m
+CONFIG_DVB_USB_UMT_010=m
+CONFIG_DVB_USB_VP702X=m
+CONFIG_DVB_USB_VP7045=m
+CONFIG_SMS_USB_DRV=m
 CONFIG_DVB_TTUSB_BUDGET=m
 CONFIG_DVB_TTUSB_DEC=m
-CONFIG_SMS_USB_DRV=m
-CONFIG_DVB_B2C2_FLEXCOP_USB=m
-# CONFIG_DVB_B2C2_FLEXCOP_USB_DEBUG is not set
-CONFIG_DVB_AS102=m
 
 #
 # Webcam, TV (analog/digital) USB devices
@@ -4534,6 +4646,7 @@ CONFIG_VIDEO_TW686X=m
 #
 # Media capture/analog TV support
 #
+CONFIG_VIDEO_DT3155=m
 CONFIG_VIDEO_IVTV=m
 CONFIG_VIDEO_IVTV_ALSA=m
 CONFIG_VIDEO_FB_IVTV=m
@@ -4541,11 +4654,11 @@ CONFIG_VIDEO_FB_IVTV=m
 CONFIG_VIDEO_HEXIUM_GEMINI=m
 CONFIG_VIDEO_HEXIUM_ORION=m
 CONFIG_VIDEO_MXB=m
-CONFIG_VIDEO_DT3155=m
 
 #
 # Media capture/analog/hybrid TV support
 #
+# CONFIG_VIDEO_BT848 is not set
 CONFIG_VIDEO_CX18=m
 CONFIG_VIDEO_CX18_ALSA=m
 CONFIG_VIDEO_CX23885=m
@@ -4559,7 +4672,6 @@ CONFIG_VIDEO_CX88_DVB=m
 CONFIG_VIDEO_CX88_ENABLE_VP3054=y
 CONFIG_VIDEO_CX88_VP3054=m
 CONFIG_VIDEO_CX88_MPEG=m
-# CONFIG_VIDEO_BT848 is not set
 CONFIG_VIDEO_SAA7134=m
 CONFIG_VIDEO_SAA7134_ALSA=m
 CONFIG_VIDEO_SAA7134_RC=y
@@ -4570,178 +4682,167 @@ CONFIG_VIDEO_SAA7164=m
 #
 # Media digital TV PCI Adapters
 #
-CONFIG_DVB_BUDGET_CORE=m
-CONFIG_DVB_BUDGET=m
-CONFIG_DVB_BUDGET_CI=m
-CONFIG_DVB_BUDGET_AV=m
 CONFIG_DVB_B2C2_FLEXCOP_PCI=m
 # CONFIG_DVB_B2C2_FLEXCOP_PCI_DEBUG is not set
-CONFIG_DVB_PLUTO2=m
+CONFIG_DVB_DDBRIDGE=m
+CONFIG_DVB_DDBRIDGE_MSIENABLE=y
 CONFIG_DVB_DM1105=m
-CONFIG_DVB_PT1=m
-CONFIG_DVB_PT3=m
 CONFIG_MANTIS_CORE=m
 CONFIG_DVB_MANTIS=m
 CONFIG_DVB_HOPPER=m
 CONFIG_DVB_NGENE=m
-CONFIG_DVB_DDBRIDGE=m
-CONFIG_DVB_DDBRIDGE_MSIENABLE=y
+CONFIG_DVB_PLUTO2=m
+CONFIG_DVB_PT1=m
+CONFIG_DVB_PT3=m
 CONFIG_DVB_SMIPCIE=m
+CONFIG_DVB_BUDGET_CORE=m
+CONFIG_DVB_BUDGET=m
+CONFIG_DVB_BUDGET_CI=m
+CONFIG_DVB_BUDGET_AV=m
 # CONFIG_VIDEO_IPU3_CIO2 is not set
 # CONFIG_RADIO_ADAPTERS is not set
-CONFIG_MEDIA_COMMON_OPTIONS=y
-
-#
-# common driver options
-#
-CONFIG_VIDEO_CX2341X=m
-CONFIG_VIDEO_TVEEPROM=m
-CONFIG_TTPCI_EEPROM=m
-CONFIG_CYPRESS_FIRMWARE=m
-CONFIG_VIDEOBUF2_CORE=m
-CONFIG_VIDEOBUF2_V4L2=m
-CONFIG_VIDEOBUF2_MEMOPS=m
-CONFIG_VIDEOBUF2_DMA_CONTIG=m
-CONFIG_VIDEOBUF2_VMALLOC=m
-CONFIG_VIDEOBUF2_DMA_SG=m
-CONFIG_VIDEOBUF2_DVB=m
-CONFIG_DVB_B2C2_FLEXCOP=m
-CONFIG_VIDEO_SAA7146=m
-CONFIG_VIDEO_SAA7146_VV=m
-CONFIG_SMS_SIANO_MDTV=m
-CONFIG_SMS_SIANO_RC=y
+CONFIG_MEDIA_PLATFORM_DRIVERS=y
 CONFIG_V4L_PLATFORM_DRIVERS=y
-CONFIG_VIDEO_CAFE_CCIC=m
-# CONFIG_VIDEO_VIA_CAMERA is not set
-# CONFIG_VIDEO_CADENCE is not set
-# CONFIG_VIDEO_ASPEED is not set
+# CONFIG_SDR_PLATFORM_DRIVERS is not set
+# CONFIG_DVB_PLATFORM_DRIVERS is not set
 CONFIG_V4L_MEM2MEM_DRIVERS=y
 CONFIG_VIDEO_MEM2MEM_DEINTERLACE=m
-# CONFIG_DVB_PLATFORM_DRIVERS is not set
-# CONFIG_SDR_PLATFORM_DRIVERS is not set
 
 #
-# MMC/SDIO DVB adapters
+# Allegro DVT media platform drivers
 #
-# CONFIG_SMS_SDIO_DRV is not set
-# CONFIG_V4L_TEST_DRIVERS is not set
-# CONFIG_DVB_TEST_DRIVERS is not set
-# end of Media drivers
 
 #
-# Media ancillary drivers
+# Amlogic media platform drivers
 #
-CONFIG_MEDIA_ATTACH=y
 
 #
-# IR I2C driver auto-selected by 'Autoselect ancillary drivers'
+# Amphion drivers
 #
-CONFIG_VIDEO_IR_I2C=m
 
 #
-# Audio decoders, processors and mixers
+# Aspeed media platform drivers
 #
-# CONFIG_VIDEO_TVAUDIO is not set
-# CONFIG_VIDEO_TDA7432 is not set
-CONFIG_VIDEO_TDA9840=m
-CONFIG_VIDEO_TEA6415C=m
-CONFIG_VIDEO_TEA6420=m
-CONFIG_VIDEO_MSP3400=m
-CONFIG_VIDEO_CS3308=m
-CONFIG_VIDEO_CS5345=m
-CONFIG_VIDEO_CS53L32A=m
-# CONFIG_VIDEO_TLV320AIC23B is not set
-CONFIG_VIDEO_UDA1342=m
-CONFIG_VIDEO_WM8775=m
-CONFIG_VIDEO_WM8739=m
-CONFIG_VIDEO_VP27SMPX=m
-CONFIG_VIDEO_SONY_BTF_MPX=m
-# end of Audio decoders, processors and mixers
+# CONFIG_VIDEO_ASPEED is not set
 
 #
-# RDS decoders
+# Atmel media platform drivers
 #
-CONFIG_VIDEO_SAA6588=m
-# end of RDS decoders
 
 #
-# Video decoders
+# Cadence media platform drivers
 #
-# CONFIG_VIDEO_ADV7180 is not set
-# CONFIG_VIDEO_ADV7183 is not set
-# CONFIG_VIDEO_ADV7604 is not set
-# CONFIG_VIDEO_ADV7842 is not set
-CONFIG_VIDEO_BT819=m
-CONFIG_VIDEO_BT856=m
-CONFIG_VIDEO_BT866=m
-CONFIG_VIDEO_KS0127=m
-# CONFIG_VIDEO_ML86V7667 is not set
-CONFIG_VIDEO_SAA7110=m
-CONFIG_VIDEO_SAA711X=m
-# CONFIG_VIDEO_TC358743 is not set
-# CONFIG_VIDEO_TVP514X is not set
-CONFIG_VIDEO_TVP5150=m
-# CONFIG_VIDEO_TVP7002 is not set
-CONFIG_VIDEO_TW2804=m
-CONFIG_VIDEO_TW9903=m
-CONFIG_VIDEO_TW9906=m
-# CONFIG_VIDEO_TW9910 is not set
-CONFIG_VIDEO_VPX3220=m
+# CONFIG_VIDEO_CADENCE_CSI2RX is not set
+# CONFIG_VIDEO_CADENCE_CSI2TX is not set
 
 #
-# Video and audio decoders
+# Chips&Media media platform drivers
 #
-CONFIG_VIDEO_SAA717X=m
-CONFIG_VIDEO_CX25840=m
-# end of Video decoders
 
 #
-# Video encoders
+# Intel media platform drivers
 #
-CONFIG_VIDEO_SAA7127=m
-CONFIG_VIDEO_SAA7185=m
-CONFIG_VIDEO_ADV7170=m
-CONFIG_VIDEO_ADV7175=m
-# CONFIG_VIDEO_ADV7343 is not set
-# CONFIG_VIDEO_ADV7393 is not set
-# CONFIG_VIDEO_ADV7511 is not set
-# CONFIG_VIDEO_AD9389B is not set
-# CONFIG_VIDEO_AK881X is not set
-# CONFIG_VIDEO_THS8200 is not set
-# end of Video encoders
 
 #
-# Video improvement chips
+# Marvell media platform drivers
 #
-CONFIG_VIDEO_UPD64031A=m
-CONFIG_VIDEO_UPD64083=m
-# end of Video improvement chips
+CONFIG_VIDEO_CAFE_CCIC=m
 
 #
-# Audio/Video compression chips
+# Mediatek media platform drivers
 #
-CONFIG_VIDEO_SAA6752HS=m
-# end of Audio/Video compression chips
 
 #
-# SDR tuner chips
+# NVidia media platform drivers
 #
-# CONFIG_SDR_MAX2175 is not set
-# end of SDR tuner chips
 
 #
-# Miscellaneous helper chips
+# NXP media platform drivers
 #
-# CONFIG_VIDEO_THS7303 is not set
-CONFIG_VIDEO_M52790=m
-# CONFIG_VIDEO_I2C is not set
-# CONFIG_VIDEO_ST_MIPID02 is not set
-# end of Miscellaneous helper chips
+
+#
+# Qualcomm media platform drivers
+#
+
+#
+# Renesas media platform drivers
+#
+
+#
+# Rockchip media platform drivers
+#
+
+#
+# Samsung media platform drivers
+#
+
+#
+# STMicroelectronics media platform drivers
+#
+
+#
+# Sunxi media platform drivers
+#
+
+#
+# Texas Instruments drivers
+#
+
+#
+# VIA media platform drivers
+#
+# CONFIG_VIDEO_VIA_CAMERA is not set
+
+#
+# Xilinx media platform drivers
+#
+
+#
+# MMC/SDIO DVB adapters
+#
+# CONFIG_SMS_SDIO_DRV is not set
+# CONFIG_V4L_TEST_DRIVERS is not set
+# CONFIG_DVB_TEST_DRIVERS is not set
+CONFIG_MEDIA_COMMON_OPTIONS=y
+
+#
+# common driver options
+#
+CONFIG_CYPRESS_FIRMWARE=m
+CONFIG_TTPCI_EEPROM=m
+CONFIG_VIDEO_CX2341X=m
+CONFIG_VIDEO_TVEEPROM=m
+CONFIG_DVB_B2C2_FLEXCOP=m
+CONFIG_VIDEO_SAA7146=m
+CONFIG_VIDEO_SAA7146_VV=m
+CONFIG_SMS_SIANO_MDTV=m
+CONFIG_SMS_SIANO_RC=y
+CONFIG_VIDEOBUF2_CORE=m
+CONFIG_VIDEOBUF2_V4L2=m
+CONFIG_VIDEOBUF2_MEMOPS=m
+CONFIG_VIDEOBUF2_DMA_CONTIG=m
+CONFIG_VIDEOBUF2_VMALLOC=m
+CONFIG_VIDEOBUF2_DMA_SG=m
+CONFIG_VIDEOBUF2_DVB=m
+# end of Media drivers
+
+#
+# Media ancillary drivers
+#
+CONFIG_MEDIA_ATTACH=y
+
+#
+# IR I2C driver auto-selected by 'Autoselect ancillary drivers'
+#
+CONFIG_VIDEO_IR_I2C=m
 
 #
 # Camera sensor devices
 #
+# CONFIG_VIDEO_AR0521 is not set
 # CONFIG_VIDEO_HI556 is not set
+# CONFIG_VIDEO_HI846 is not set
+# CONFIG_VIDEO_HI847 is not set
 # CONFIG_VIDEO_IMX208 is not set
 # CONFIG_VIDEO_IMX214 is not set
 # CONFIG_VIDEO_IMX219 is not set
@@ -4750,7 +4851,21 @@ CONFIG_VIDEO_M52790=m
 # CONFIG_VIDEO_IMX290 is not set
 # CONFIG_VIDEO_IMX319 is not set
 # CONFIG_VIDEO_IMX355 is not set
+# CONFIG_VIDEO_MT9M001 is not set
+# CONFIG_VIDEO_MT9M032 is not set
+CONFIG_VIDEO_MT9M111=m
+# CONFIG_VIDEO_MT9P031 is not set
+# CONFIG_VIDEO_MT9T001 is not set
+# CONFIG_VIDEO_MT9T112 is not set
+CONFIG_VIDEO_MT9V011=m
+# CONFIG_VIDEO_MT9V032 is not set
+# CONFIG_VIDEO_MT9V111 is not set
+# CONFIG_VIDEO_NOON010PC30 is not set
+# CONFIG_VIDEO_OG01A1B is not set
 # CONFIG_VIDEO_OV02A10 is not set
+# CONFIG_VIDEO_OV08D10 is not set
+# CONFIG_VIDEO_OV13858 is not set
+# CONFIG_VIDEO_OV13B10 is not set
 CONFIG_VIDEO_OV2640=m
 # CONFIG_VIDEO_OV2659 is not set
 # CONFIG_VIDEO_OV2680 is not set
@@ -4758,43 +4873,33 @@ CONFIG_VIDEO_OV2640=m
 # CONFIG_VIDEO_OV2740 is not set
 # CONFIG_VIDEO_OV5647 is not set
 # CONFIG_VIDEO_OV5648 is not set
-# CONFIG_VIDEO_OV6650 is not set
 # CONFIG_VIDEO_OV5670 is not set
 # CONFIG_VIDEO_OV5675 is not set
+# CONFIG_VIDEO_OV5693 is not set
 # CONFIG_VIDEO_OV5695 is not set
+# CONFIG_VIDEO_OV6650 is not set
 # CONFIG_VIDEO_OV7251 is not set
-# CONFIG_VIDEO_OV772X is not set
 CONFIG_VIDEO_OV7640=m
 CONFIG_VIDEO_OV7670=m
+# CONFIG_VIDEO_OV772X is not set
 # CONFIG_VIDEO_OV7740 is not set
 # CONFIG_VIDEO_OV8856 is not set
 # CONFIG_VIDEO_OV8865 is not set
 # CONFIG_VIDEO_OV9640 is not set
 # CONFIG_VIDEO_OV9650 is not set
 # CONFIG_VIDEO_OV9734 is not set
-# CONFIG_VIDEO_OV13858 is not set
-# CONFIG_VIDEO_VS6624 is not set
-# CONFIG_VIDEO_MT9M001 is not set
-# CONFIG_VIDEO_MT9M032 is not set
-CONFIG_VIDEO_MT9M111=m
-# CONFIG_VIDEO_MT9P031 is not set
-# CONFIG_VIDEO_MT9T001 is not set
-# CONFIG_VIDEO_MT9T112 is not set
-CONFIG_VIDEO_MT9V011=m
-# CONFIG_VIDEO_MT9V032 is not set
-# CONFIG_VIDEO_MT9V111 is not set
-# CONFIG_VIDEO_SR030PC30 is not set
-# CONFIG_VIDEO_NOON010PC30 is not set
-# CONFIG_VIDEO_M5MOLS is not set
 # CONFIG_VIDEO_RDACM20 is not set
 # CONFIG_VIDEO_RDACM21 is not set
 # CONFIG_VIDEO_RJ54N1 is not set
-# CONFIG_VIDEO_S5K6AA is not set
-# CONFIG_VIDEO_S5K6A3 is not set
 # CONFIG_VIDEO_S5K4ECGX is not set
 # CONFIG_VIDEO_S5K5BAF is not set
+# CONFIG_VIDEO_S5K6A3 is not set
+# CONFIG_VIDEO_S5K6AA is not set
+# CONFIG_VIDEO_SR030PC30 is not set
+# CONFIG_VIDEO_VS6624 is not set
 # CONFIG_VIDEO_CCS is not set
 # CONFIG_VIDEO_ET8EK8 is not set
+# CONFIG_VIDEO_M5MOLS is not set
 # end of Camera sensor devices
 
 #
@@ -4816,51 +4921,146 @@ CONFIG_VIDEO_MT9V011=m
 # end of Flash devices
 
 #
-# SPI helper chips
+# Audio decoders, processors and mixers
+#
+CONFIG_VIDEO_CS3308=m
+CONFIG_VIDEO_CS5345=m
+CONFIG_VIDEO_CS53L32A=m
+CONFIG_VIDEO_MSP3400=m
+CONFIG_VIDEO_SONY_BTF_MPX=m
+# CONFIG_VIDEO_TDA7432 is not set
+CONFIG_VIDEO_TDA9840=m
+CONFIG_VIDEO_TEA6415C=m
+CONFIG_VIDEO_TEA6420=m
+# CONFIG_VIDEO_TLV320AIC23B is not set
+# CONFIG_VIDEO_TVAUDIO is not set
+CONFIG_VIDEO_UDA1342=m
+CONFIG_VIDEO_VP27SMPX=m
+CONFIG_VIDEO_WM8739=m
+CONFIG_VIDEO_WM8775=m
+# end of Audio decoders, processors and mixers
+
+#
+# RDS decoders
+#
+CONFIG_VIDEO_SAA6588=m
+# end of RDS decoders
+
+#
+# Video decoders
+#
+# CONFIG_VIDEO_ADV7180 is not set
+# CONFIG_VIDEO_ADV7183 is not set
+# CONFIG_VIDEO_ADV7604 is not set
+# CONFIG_VIDEO_ADV7842 is not set
+CONFIG_VIDEO_BT819=m
+CONFIG_VIDEO_BT856=m
+CONFIG_VIDEO_BT866=m
+CONFIG_VIDEO_KS0127=m
+# CONFIG_VIDEO_ML86V7667 is not set
+CONFIG_VIDEO_SAA7110=m
+CONFIG_VIDEO_SAA711X=m
+# CONFIG_VIDEO_TC358743 is not set
+# CONFIG_VIDEO_TVP514X is not set
+CONFIG_VIDEO_TVP5150=m
+# CONFIG_VIDEO_TVP7002 is not set
+CONFIG_VIDEO_TW2804=m
+CONFIG_VIDEO_TW9903=m
+CONFIG_VIDEO_TW9906=m
+# CONFIG_VIDEO_TW9910 is not set
+CONFIG_VIDEO_VPX3220=m
+
+#
+# Video and audio decoders
+#
+CONFIG_VIDEO_SAA717X=m
+CONFIG_VIDEO_CX25840=m
+# end of Video decoders
+
+#
+# Video encoders
+#
+# CONFIG_VIDEO_AD9389B is not set
+CONFIG_VIDEO_ADV7170=m
+CONFIG_VIDEO_ADV7175=m
+# CONFIG_VIDEO_ADV7343 is not set
+# CONFIG_VIDEO_ADV7393 is not set
+# CONFIG_VIDEO_ADV7511 is not set
+# CONFIG_VIDEO_AK881X is not set
+CONFIG_VIDEO_SAA7127=m
+CONFIG_VIDEO_SAA7185=m
+# CONFIG_VIDEO_THS8200 is not set
+# end of Video encoders
+
+#
+# Video improvement chips
+#
+CONFIG_VIDEO_UPD64031A=m
+CONFIG_VIDEO_UPD64083=m
+# end of Video improvement chips
+
+#
+# Audio/Video compression chips
+#
+CONFIG_VIDEO_SAA6752HS=m
+# end of Audio/Video compression chips
+
+#
+# SDR tuner chips
+#
+# CONFIG_SDR_MAX2175 is not set
+# end of SDR tuner chips
+
+#
+# Miscellaneous helper chips
 #
-# end of SPI helper chips
+# CONFIG_VIDEO_I2C is not set
+CONFIG_VIDEO_M52790=m
+# CONFIG_VIDEO_ST_MIPID02 is not set
+# CONFIG_VIDEO_THS7303 is not set
+# end of Miscellaneous helper chips
 
 CONFIG_MEDIA_TUNER=m
 
 #
 # Customize TV tuners
 #
+CONFIG_MEDIA_TUNER_E4000=m
+CONFIG_MEDIA_TUNER_FC0011=m
+CONFIG_MEDIA_TUNER_FC0012=m
+CONFIG_MEDIA_TUNER_FC0013=m
+CONFIG_MEDIA_TUNER_FC2580=m
+CONFIG_MEDIA_TUNER_IT913X=m
+CONFIG_MEDIA_TUNER_M88RS6000T=m
+CONFIG_MEDIA_TUNER_MAX2165=m
+CONFIG_MEDIA_TUNER_MC44S803=m
+CONFIG_MEDIA_TUNER_MT2060=m
+CONFIG_MEDIA_TUNER_MT2063=m
+CONFIG_MEDIA_TUNER_MT20XX=m
+CONFIG_MEDIA_TUNER_MT2131=m
+CONFIG_MEDIA_TUNER_MT2266=m
+CONFIG_MEDIA_TUNER_MXL301RF=m
+CONFIG_MEDIA_TUNER_MXL5005S=m
+CONFIG_MEDIA_TUNER_MXL5007T=m
+CONFIG_MEDIA_TUNER_QM1D1B0004=m
+CONFIG_MEDIA_TUNER_QM1D1C0042=m
+CONFIG_MEDIA_TUNER_QT1010=m
+CONFIG_MEDIA_TUNER_R820T=m
+CONFIG_MEDIA_TUNER_SI2157=m
 CONFIG_MEDIA_TUNER_SIMPLE=m
+CONFIG_MEDIA_TUNER_TDA18212=m
+CONFIG_MEDIA_TUNER_TDA18218=m
 CONFIG_MEDIA_TUNER_TDA18250=m
-CONFIG_MEDIA_TUNER_TDA8290=m
-CONFIG_MEDIA_TUNER_TDA827X=m
 CONFIG_MEDIA_TUNER_TDA18271=m
+CONFIG_MEDIA_TUNER_TDA827X=m
+CONFIG_MEDIA_TUNER_TDA8290=m
 CONFIG_MEDIA_TUNER_TDA9887=m
 CONFIG_MEDIA_TUNER_TEA5761=m
 CONFIG_MEDIA_TUNER_TEA5767=m
-CONFIG_MEDIA_TUNER_MT20XX=m
-CONFIG_MEDIA_TUNER_MT2060=m
-CONFIG_MEDIA_TUNER_MT2063=m
-CONFIG_MEDIA_TUNER_MT2266=m
-CONFIG_MEDIA_TUNER_MT2131=m
-CONFIG_MEDIA_TUNER_QT1010=m
+CONFIG_MEDIA_TUNER_TUA9001=m
 CONFIG_MEDIA_TUNER_XC2028=m
-CONFIG_MEDIA_TUNER_XC5000=m
 CONFIG_MEDIA_TUNER_XC4000=m
-CONFIG_MEDIA_TUNER_MXL5005S=m
-CONFIG_MEDIA_TUNER_MXL5007T=m
-CONFIG_MEDIA_TUNER_MC44S803=m
-CONFIG_MEDIA_TUNER_MAX2165=m
-CONFIG_MEDIA_TUNER_TDA18218=m
-CONFIG_MEDIA_TUNER_FC0011=m
-CONFIG_MEDIA_TUNER_FC0012=m
-CONFIG_MEDIA_TUNER_FC0013=m
-CONFIG_MEDIA_TUNER_TDA18212=m
-CONFIG_MEDIA_TUNER_E4000=m
-CONFIG_MEDIA_TUNER_FC2580=m
-CONFIG_MEDIA_TUNER_M88RS6000T=m
-CONFIG_MEDIA_TUNER_TUA9001=m
-CONFIG_MEDIA_TUNER_SI2157=m
-CONFIG_MEDIA_TUNER_IT913X=m
-CONFIG_MEDIA_TUNER_R820T=m
-CONFIG_MEDIA_TUNER_MXL301RF=m
-CONFIG_MEDIA_TUNER_QM1D1C0042=m
-CONFIG_MEDIA_TUNER_QM1D1B0004=m
+CONFIG_MEDIA_TUNER_XC5000=m
 # end of Customize TV tuners
 
 #
@@ -4870,125 +5070,125 @@ CONFIG_MEDIA_TUNER_QM1D1B0004=m
 #
 # Multistandard (satellite) frontends
 #
+CONFIG_DVB_M88DS3103=m
+CONFIG_DVB_MXL5XX=m
 CONFIG_DVB_STB0899=m
 CONFIG_DVB_STB6100=m
 CONFIG_DVB_STV090x=m
 CONFIG_DVB_STV0910=m
 CONFIG_DVB_STV6110x=m
 CONFIG_DVB_STV6111=m
-CONFIG_DVB_MXL5XX=m
-CONFIG_DVB_M88DS3103=m
 
 #
 # Multistandard (cable + terrestrial) frontends
 #
 CONFIG_DVB_DRXK=m
-CONFIG_DVB_TDA18271C2DD=m
-CONFIG_DVB_SI2165=m
 CONFIG_DVB_MN88472=m
 CONFIG_DVB_MN88473=m
+CONFIG_DVB_SI2165=m
+CONFIG_DVB_TDA18271C2DD=m
 
 #
 # DVB-S (satellite) frontends
 #
 # CONFIG_DVB_CX24110 is not set
+CONFIG_DVB_CX24116=m
+CONFIG_DVB_CX24117=m
+CONFIG_DVB_CX24120=m
 CONFIG_DVB_CX24123=m
+CONFIG_DVB_DS3000=m
+CONFIG_DVB_MB86A16=m
 CONFIG_DVB_MT312=m
-CONFIG_DVB_ZL10036=m
-CONFIG_DVB_ZL10039=m
 CONFIG_DVB_S5H1420=m
-CONFIG_DVB_STV0288=m
+CONFIG_DVB_SI21XX=m
 CONFIG_DVB_STB6000=m
+CONFIG_DVB_STV0288=m
 CONFIG_DVB_STV0299=m
-CONFIG_DVB_STV6110=m
 CONFIG_DVB_STV0900=m
-CONFIG_DVB_TDA8083=m
+CONFIG_DVB_STV6110=m
+CONFIG_DVB_TDA10071=m
 CONFIG_DVB_TDA10086=m
+CONFIG_DVB_TDA8083=m
 CONFIG_DVB_TDA8261=m
-CONFIG_DVB_VES1X93=m
-CONFIG_DVB_TUNER_ITD1000=m
-CONFIG_DVB_TUNER_CX24113=m
 CONFIG_DVB_TDA826X=m
-CONFIG_DVB_TUA6100=m
-CONFIG_DVB_CX24116=m
-CONFIG_DVB_CX24117=m
-CONFIG_DVB_CX24120=m
-CONFIG_DVB_SI21XX=m
 CONFIG_DVB_TS2020=m
-CONFIG_DVB_DS3000=m
-CONFIG_DVB_MB86A16=m
-CONFIG_DVB_TDA10071=m
+CONFIG_DVB_TUA6100=m
+CONFIG_DVB_TUNER_CX24113=m
+CONFIG_DVB_TUNER_ITD1000=m
+CONFIG_DVB_VES1X93=m
+CONFIG_DVB_ZL10036=m
+CONFIG_DVB_ZL10039=m
 
 #
 # DVB-T (terrestrial) frontends
 #
-# CONFIG_DVB_SP887X is not set
+CONFIG_DVB_AF9013=m
+CONFIG_DVB_AS102_FE=m
 CONFIG_DVB_CX22700=m
 CONFIG_DVB_CX22702=m
-# CONFIG_DVB_S5H1432 is not set
-CONFIG_DVB_DRXD=m
-CONFIG_DVB_L64781=m
-CONFIG_DVB_TDA1004X=m
-CONFIG_DVB_NXT6000=m
-CONFIG_DVB_MT352=m
-CONFIG_DVB_ZL10353=m
+CONFIG_DVB_CXD2820R=m
+CONFIG_DVB_CXD2841ER=m
 CONFIG_DVB_DIB3000MB=m
 CONFIG_DVB_DIB3000MC=m
 CONFIG_DVB_DIB7000M=m
 CONFIG_DVB_DIB7000P=m
 # CONFIG_DVB_DIB9000 is not set
-CONFIG_DVB_TDA10048=m
-CONFIG_DVB_AF9013=m
+CONFIG_DVB_DRXD=m
 CONFIG_DVB_EC100=m
-CONFIG_DVB_STV0367=m
-CONFIG_DVB_CXD2820R=m
-CONFIG_DVB_CXD2841ER=m
+CONFIG_DVB_GP8PSK_FE=m
+CONFIG_DVB_L64781=m
+CONFIG_DVB_MT352=m
+CONFIG_DVB_NXT6000=m
 CONFIG_DVB_RTL2830=m
 CONFIG_DVB_RTL2832=m
 CONFIG_DVB_RTL2832_SDR=m
+# CONFIG_DVB_S5H1432 is not set
 CONFIG_DVB_SI2168=m
-CONFIG_DVB_AS102_FE=m
+# CONFIG_DVB_SP887X is not set
+CONFIG_DVB_STV0367=m
+CONFIG_DVB_TDA10048=m
+CONFIG_DVB_TDA1004X=m
 CONFIG_DVB_ZD1301_DEMOD=m
-CONFIG_DVB_GP8PSK_FE=m
+CONFIG_DVB_ZL10353=m
 
 #
 # DVB-C (cable) frontends
 #
-CONFIG_DVB_VES1820=m
+CONFIG_DVB_STV0297=m
 CONFIG_DVB_TDA10021=m
 CONFIG_DVB_TDA10023=m
-CONFIG_DVB_STV0297=m
+CONFIG_DVB_VES1820=m
 
 #
 # ATSC (North American/Korean Terrestrial/Cable DTV) frontends
 #
-CONFIG_DVB_NXT200X=m
-# CONFIG_DVB_OR51211 is not set
-CONFIG_DVB_OR51132=m
+CONFIG_DVB_AU8522=m
+CONFIG_DVB_AU8522_DTV=m
+CONFIG_DVB_AU8522_V4L=m
 CONFIG_DVB_BCM3510=m
-CONFIG_DVB_LGDT330X=m
+CONFIG_DVB_LG2160=m
 CONFIG_DVB_LGDT3305=m
 CONFIG_DVB_LGDT3306A=m
-CONFIG_DVB_LG2160=m
+CONFIG_DVB_LGDT330X=m
+CONFIG_DVB_MXL692=m
+CONFIG_DVB_NXT200X=m
+CONFIG_DVB_OR51132=m
+# CONFIG_DVB_OR51211 is not set
 CONFIG_DVB_S5H1409=m
-CONFIG_DVB_AU8522=m
-CONFIG_DVB_AU8522_DTV=m
-CONFIG_DVB_AU8522_V4L=m
 CONFIG_DVB_S5H1411=m
-CONFIG_DVB_MXL692=m
 
 #
 # ISDB-T (terrestrial) frontends
 #
-CONFIG_DVB_S921=m
 CONFIG_DVB_DIB8000=m
 CONFIG_DVB_MB86A20S=m
+CONFIG_DVB_S921=m
 
 #
 # ISDB-S (satellite) & ISDB-T (terrestrial) frontends
 #
-CONFIG_DVB_TC90522=m
 # CONFIG_DVB_MN88443X is not set
+CONFIG_DVB_TC90522=m
 
 #
 # Digital terrestrial only tuners/PLL
@@ -5000,25 +5200,25 @@ CONFIG_DVB_TUNER_DIB0090=m
 #
 # SEC control devices for DVB-S
 #
-CONFIG_DVB_DRX39XYJ=m
-CONFIG_DVB_LNBH25=m
-# CONFIG_DVB_LNBH29 is not set
-CONFIG_DVB_LNBP21=m
-CONFIG_DVB_LNBP22=m
+CONFIG_DVB_A8293=m
+CONFIG_DVB_AF9033=m
+# CONFIG_DVB_ASCOT2E is not set
+CONFIG_DVB_ATBM8830=m
+# CONFIG_DVB_HELENE is not set
+# CONFIG_DVB_HORUS3A is not set
 CONFIG_DVB_ISL6405=m
 CONFIG_DVB_ISL6421=m
 CONFIG_DVB_ISL6423=m
-CONFIG_DVB_A8293=m
+CONFIG_DVB_IX2505V=m
 # CONFIG_DVB_LGS8GL5 is not set
 CONFIG_DVB_LGS8GXX=m
-CONFIG_DVB_ATBM8830=m
-CONFIG_DVB_TDA665x=m
-CONFIG_DVB_IX2505V=m
+CONFIG_DVB_LNBH25=m
+# CONFIG_DVB_LNBH29 is not set
+CONFIG_DVB_LNBP21=m
+CONFIG_DVB_LNBP22=m
 CONFIG_DVB_M88RS2000=m
-CONFIG_DVB_AF9033=m
-# CONFIG_DVB_HORUS3A is not set
-# CONFIG_DVB_ASCOT2E is not set
-# CONFIG_DVB_HELENE is not set
+CONFIG_DVB_TDA665x=m
+CONFIG_DVB_DRX39XYJ=m
 
 #
 # Common Interface (EN50221) controller drivers
@@ -5036,30 +5236,35 @@ CONFIG_DVB_SP2=m
 #
 # Graphics support
 #
+CONFIG_APERTURE_HELPERS=y
 CONFIG_AGP=y
 CONFIG_AGP_AMD64=y
 CONFIG_AGP_INTEL=y
 CONFIG_AGP_SIS=y
 CONFIG_AGP_VIA=y
 CONFIG_INTEL_GTT=y
-CONFIG_VGA_ARB=y
-CONFIG_VGA_ARB_MAX_GPUS=16
 CONFIG_VGA_SWITCHEROO=y
 CONFIG_DRM=m
 CONFIG_DRM_MIPI_DSI=y
-# CONFIG_DRM_DP_AUX_CHARDEV is not set
 # CONFIG_DRM_DEBUG_SELFTEST is not set
 CONFIG_DRM_KMS_HELPER=m
 # CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS is not set
+# CONFIG_DRM_DEBUG_MODESET_LOCK is not set
 CONFIG_DRM_FBDEV_EMULATION=y
 CONFIG_DRM_FBDEV_OVERALLOC=100
 # CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM is not set
 # CONFIG_DRM_LOAD_EDID_FIRMWARE is not set
+CONFIG_DRM_DISPLAY_HELPER=m
+CONFIG_DRM_DISPLAY_DP_HELPER=y
+CONFIG_DRM_DISPLAY_HDCP_HELPER=y
+CONFIG_DRM_DISPLAY_HDMI_HELPER=y
+# CONFIG_DRM_DP_AUX_CHARDEV is not set
 # CONFIG_DRM_DP_CEC is not set
 CONFIG_DRM_TTM=m
+CONFIG_DRM_BUDDY=m
 CONFIG_DRM_VRAM_HELPER=m
 CONFIG_DRM_TTM_HELPER=m
-CONFIG_DRM_GEM_SHMEM_HELPER=y
+CONFIG_DRM_GEM_SHMEM_HELPER=m
 CONFIG_DRM_SCHED=m
 
 #
@@ -5110,7 +5315,7 @@ CONFIG_DRM_I915_FORCE_PROBE=""
 CONFIG_DRM_I915_CAPTURE_ERROR=y
 CONFIG_DRM_I915_COMPRESS_ERROR=y
 CONFIG_DRM_I915_USERPTR=y
-CONFIG_DRM_I915_GVT=y
+CONFIG_DRM_I915_PXP=y
 
 #
 # drm/i915 Debugging
@@ -5178,9 +5383,13 @@ CONFIG_DRM_XEN=y
 CONFIG_DRM_XEN_FRONTEND=m
 CONFIG_DRM_VBOXVIDEO=m
 CONFIG_DRM_GUD=m
+CONFIG_DRM_SSD130X=m
+CONFIG_DRM_SSD130X_I2C=m
 CONFIG_DRM_HYPERV=m
 # CONFIG_DRM_LEGACY is not set
 CONFIG_DRM_PANEL_ORIENTATION_QUIRKS=y
+CONFIG_DRM_NOMODESET=y
+CONFIG_DRM_PRIVACY_SCREEN=y
 
 #
 # Frame buffer Devices
@@ -5190,7 +5399,6 @@ CONFIG_FB_NOTIFY=y
 CONFIG_FB=y
 CONFIG_FIRMWARE_EDID=y
 CONFIG_FB_DDC=m
-CONFIG_FB_BOOT_VESA_SUPPORT=y
 CONFIG_FB_CFB_FILLRECT=y
 CONFIG_FB_CFB_COPYAREA=y
 CONFIG_FB_CFB_IMAGEBLIT=y
@@ -5345,10 +5553,12 @@ CONFIG_SND_MAX_CARDS=32
 CONFIG_SND_PROC_FS=y
 CONFIG_SND_VERBOSE_PROCFS=y
 CONFIG_SND_VERBOSE_PRINTK=y
+CONFIG_SND_CTL_FAST_LOOKUP=y
 CONFIG_SND_DEBUG=y
 # CONFIG_SND_DEBUG_VERBOSE is not set
 CONFIG_SND_PCM_XRUN_DEBUG=y
-# CONFIG_SND_CTL_VALIDATION is not set
+CONFIG_SND_CTL_INPUT_VALIDATION=y
+# CONFIG_SND_CTL_DEBUG is not set
 CONFIG_SND_VMASTER=y
 CONFIG_SND_DMA_SGBUF=y
 CONFIG_SND_CTL_LED=m
@@ -5565,6 +5775,7 @@ CONFIG_HID_KYE=y
 # CONFIG_HID_UCLOGIC is not set
 # CONFIG_HID_WALTOP is not set
 # CONFIG_HID_VIEWSONIC is not set
+# CONFIG_HID_XIAOMI is not set
 CONFIG_HID_GYRATION=m
 # CONFIG_HID_ICADE is not set
 # CONFIG_HID_ITE is not set
@@ -5574,6 +5785,7 @@ CONFIG_HID_KENSINGTON=y
 CONFIG_HID_LCPOWER=m
 CONFIG_HID_LED=m
 CONFIG_HID_LENOVO=m
+# CONFIG_HID_LETSKETCH is not set
 CONFIG_HID_LOGITECH=y
 CONFIG_HID_LOGITECH_DJ=m
 CONFIG_HID_LOGITECH_HIDPP=m
@@ -5584,10 +5796,12 @@ CONFIG_HID_LOGITECH_HIDPP=m
 # CONFIG_HID_MAGICMOUSE is not set
 # CONFIG_HID_MALTRON is not set
 # CONFIG_HID_MAYFLASH is not set
+# CONFIG_HID_MEGAWORLD_FF is not set
 # CONFIG_HID_REDRAGON is not set
 CONFIG_HID_MICROSOFT=y
 CONFIG_HID_MONTEREY=y
 # CONFIG_HID_MULTITOUCH is not set
+# CONFIG_HID_NINTENDO is not set
 # CONFIG_HID_NTI is not set
 # CONFIG_HID_NTRIG is not set
 CONFIG_HID_ORTEK=m
@@ -5601,13 +5815,14 @@ CONFIG_HID_PICOLCD_LCD=y
 CONFIG_HID_PICOLCD_LEDS=y
 CONFIG_HID_PICOLCD_CIR=y
 # CONFIG_HID_PLANTRONICS is not set
-# CONFIG_HID_PLAYSTATION is not set
+# CONFIG_HID_RAZER is not set
 # CONFIG_HID_PRIMAX is not set
 # CONFIG_HID_RETRODE is not set
 CONFIG_HID_ROCCAT=m
 CONFIG_HID_SAITEK=m
 CONFIG_HID_SAMSUNG=m
 CONFIG_HID_SEMITEK=m
+# CONFIG_HID_SIGMAMICRO is not set
 # CONFIG_HID_SONY is not set
 CONFIG_HID_SPEEDLINK=m
 # CONFIG_HID_STEAM is not set
@@ -5719,6 +5934,7 @@ CONFIG_USB_SL811_HCD_ISO=y
 CONFIG_USB_HCD_BCMA=m
 CONFIG_USB_HCD_SSB=m
 # CONFIG_USB_HCD_TEST_MODE is not set
+CONFIG_USB_XEN_HCD=m
 
 #
 # USB Device Class drivers
@@ -5901,13 +6117,18 @@ CONFIG_TYPEC_FUSB302=m
 CONFIG_TYPEC_UCSI=m
 # CONFIG_UCSI_CCG is not set
 CONFIG_UCSI_ACPI=m
+CONFIG_UCSI_STM32G0=m
 # CONFIG_TYPEC_TPS6598X is not set
+CONFIG_TYPEC_ANX7411=m
+CONFIG_TYPEC_RT1719=m
 # CONFIG_TYPEC_HD3SS3220 is not set
 # CONFIG_TYPEC_STUSB160X is not set
+CONFIG_TYPEC_WUSB3801=m
 
 #
 # USB Type-C Multiplexer/DeMultiplexer Switch support
 #
+CONFIG_TYPEC_MUX_FSA4480=m
 # CONFIG_TYPEC_MUX_PI3USB30532 is not set
 # end of USB Type-C Multiplexer/DeMultiplexer Switch support
 
@@ -5953,6 +6174,16 @@ CONFIG_MMC_CQHCI=m
 # CONFIG_MMC_TOSHIBA_PCI is not set
 # CONFIG_MMC_MTK is not set
 CONFIG_MMC_SDHCI_XENON=m
+CONFIG_SCSI_UFSHCD=m
+CONFIG_SCSI_UFS_BSG=y
+CONFIG_SCSI_UFS_CRYPTO=y
+# CONFIG_SCSI_UFS_HPB is not set
+# CONFIG_SCSI_UFS_HWMON is not set
+CONFIG_SCSI_UFSHCD_PCI=m
+CONFIG_SCSI_UFS_DWC_TC_PCI=m
+CONFIG_SCSI_UFSHCD_PLATFORM=m
+CONFIG_SCSI_UFS_CDNS_PLATFORM=m
+CONFIG_SCSI_UFS_DWC_TC_PLATFORM=m
 # CONFIG_MEMSTICK is not set
 CONFIG_NEW_LEDS=y
 CONFIG_LEDS_CLASS=y
@@ -5974,7 +6205,6 @@ CONFIG_LEDS_GPIO=m
 CONFIG_LEDS_LP3944=m
 # CONFIG_LEDS_LP3952 is not set
 # CONFIG_LEDS_LP50XX is not set
-CONFIG_LEDS_CLEVO_MAIL=m
 CONFIG_LEDS_PCA955X=m
 # CONFIG_LEDS_PCA955X_GPIO is not set
 CONFIG_LEDS_PCA963X=m
@@ -5984,6 +6214,7 @@ CONFIG_LEDS_LT3593=m
 CONFIG_LEDS_TCA6507=m
 # CONFIG_LEDS_TLC591XX is not set
 CONFIG_LEDS_LM355x=m
+CONFIG_LEDS_IS31FL319X=m
 
 #
 # LED driver for blink(1) USB RGB LED is under Special HID drivers (HID_THINGM)
@@ -5999,6 +6230,10 @@ CONFIG_LEDS_NIC78BX=m
 # Flash and Torch LED drivers
 #
 
+#
+# RGB LED drivers
+#
+
 #
 # LED Triggers
 #
@@ -6023,6 +6258,10 @@ CONFIG_LEDS_TRIGGER_NETDEV=m
 # CONFIG_LEDS_TRIGGER_PATTERN is not set
 CONFIG_LEDS_TRIGGER_AUDIO=m
 CONFIG_LEDS_TRIGGER_TTY=m
+
+#
+# Simple LED drivers
+#
 # CONFIG_ACCESSIBILITY is not set
 # CONFIG_INFINIBAND is not set
 CONFIG_EDAC_ATOMIC_SCRUB=y
@@ -6220,13 +6459,18 @@ CONFIG_VFIO_PCI_INTX=y
 CONFIG_VFIO_PCI=m
 CONFIG_VFIO_PCI_VGA=y
 CONFIG_VFIO_PCI_IGD=y
+CONFIG_MLX5_VFIO_PCI=m
 # CONFIG_VFIO_MDEV is not set
 CONFIG_IRQ_BYPASS_MANAGER=m
 CONFIG_VIRT_DRIVERS=y
+CONFIG_VMGENID=y
 # CONFIG_VBOXGUEST is not set
 # CONFIG_NITRO_ENCLAVES is not set
+CONFIG_EFI_SECRET=m
+CONFIG_VIRTIO_ANCHOR=y
 CONFIG_VIRTIO=y
 CONFIG_VIRTIO_PCI_LIB=y
+CONFIG_VIRTIO_PCI_LIB_LEGACY=y
 CONFIG_VIRTIO_MENU=y
 CONFIG_VIRTIO_PCI=y
 CONFIG_VIRTIO_PCI_LEGACY=y
@@ -6268,6 +6512,7 @@ CONFIG_XEN_GNTDEV=m
 CONFIG_XEN_GRANT_DEV_ALLOC=m
 # CONFIG_XEN_GRANT_DMA_ALLOC is not set
 CONFIG_SWIOTLB_XEN=y
+CONFIG_XEN_PCI_STUB=y
 CONFIG_XEN_PCIDEV_BACKEND=m
 # CONFIG_XEN_PVCALLS_FRONTEND is not set
 CONFIG_XEN_PVCALLS_BACKEND=y
@@ -6281,6 +6526,9 @@ CONFIG_XEN_ACPI=y
 CONFIG_XEN_SYMS=y
 CONFIG_XEN_HAVE_VPMU=y
 CONFIG_XEN_FRONT_PGDIR_SHBUF=m
+CONFIG_XEN_GRANT_DMA_OPS=y
+CONFIG_XEN_VIRTIO=y
+# CONFIG_XEN_VIRTIO_FORCE_GRANT is not set
 # end of Xen driver support
 
 # CONFIG_GREYBUS is not set
@@ -6292,43 +6540,45 @@ CONFIG_RTL8192U=m
 CONFIG_RTL8723BS=m
 CONFIG_R8712U=m
 CONFIG_R8188EU=m
-CONFIG_88EU_AP_MODE=y
 # CONFIG_RTS5208 is not set
 # CONFIG_VT6655 is not set
 # CONFIG_VT6656 is not set
 # CONFIG_FB_SM750 is not set
 # CONFIG_STAGING_MEDIA is not set
-
-#
-# Android
-#
-# end of Android
-
 CONFIG_LTE_GDM724X=m
-# CONFIG_GS_FPGABOOT is not set
-# CONFIG_UNISYSSPAR is not set
 # CONFIG_KS7010 is not set
 # CONFIG_FIELDBUS_DEV is not set
 CONFIG_QLGE=m
-# CONFIG_WFX is not set
+# CONFIG_VME_BUS is not set
+# CONFIG_CHROME_PLATFORMS is not set
+# CONFIG_MELLANOX_PLATFORM is not set
+CONFIG_SURFACE_PLATFORMS=y
+# CONFIG_SURFACE_3_POWER_OPREGION is not set
+# CONFIG_SURFACE_GPE is not set
+CONFIG_SURFACE_HOTPLUG=m
+# CONFIG_SURFACE_PRO3_BUTTON is not set
 CONFIG_X86_PLATFORM_DEVICES=y
 CONFIG_ACPI_WMI=m
 CONFIG_WMI_BMOF=m
 # CONFIG_HUAWEI_WMI is not set
 CONFIG_MXM_WMI=m
 # CONFIG_PEAQ_WMI is not set
+# CONFIG_NVIDIA_WMI_EC_BACKLIGHT is not set
 # CONFIG_XIAOMI_WMI is not set
 CONFIG_GIGABYTE_WMI=m
+# CONFIG_YOGABOOK_WMI is not set
 CONFIG_ACERHDF=m
 # CONFIG_ACER_WIRELESS is not set
 CONFIG_ACER_WMI=m
 CONFIG_AMD_PMC=m
+CONFIG_AMD_HSMP=m
 CONFIG_ADV_SWBUTTON=m
 # CONFIG_APPLE_GMUX is not set
 CONFIG_ASUS_LAPTOP=m
 # CONFIG_ASUS_WIRELESS is not set
 CONFIG_ASUS_WMI=m
 CONFIG_ASUS_NB_WMI=m
+# CONFIG_ASUS_TF103C_DOCK is not set
 CONFIG_MERAKI_MX100=m
 CONFIG_EEEPC_LAPTOP=m
 CONFIG_EEEPC_WMI=m
@@ -6381,18 +6631,28 @@ CONFIG_THINKPAD_LMI=m
 
 # CONFIG_INTEL_WMI_SBL_FW_UPDATE is not set
 # CONFIG_INTEL_WMI_THUNDERBOLT is not set
+
+#
+# Intel Uncore Frequency Control
+#
+# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set
+# end of Intel Uncore Frequency Control
+
 # CONFIG_INTEL_HID_EVENT is not set
 # CONFIG_INTEL_VBTN is not set
 CONFIG_INTEL_INT0002_VGPIO=m
 CONFIG_INTEL_OAKTRAIL=m
+CONFIG_INTEL_ISHTP_ECLITE=m
 # CONFIG_INTEL_PUNIT_IPC is not set
 CONFIG_INTEL_RST=m
+# CONFIG_INTEL_SDSI is not set
 # CONFIG_INTEL_SMARTCONNECT is not set
 CONFIG_INTEL_TURBO_MAX_3=y
-# CONFIG_INTEL_UNCORE_FREQ_CONTROL is not set
+CONFIG_INTEL_VSEC=m
 CONFIG_MSI_LAPTOP=m
 CONFIG_MSI_WMI=m
 # CONFIG_PCENGINES_APU2 is not set
+# CONFIG_BARCO_P50_GPIO is not set
 CONFIG_SAMSUNG_LAPTOP=m
 CONFIG_SAMSUNG_Q10=m
 # CONFIG_TOSHIBA_BT_RFKILL is not set
@@ -6406,32 +6666,17 @@ CONFIG_SONY_LAPTOP=m
 CONFIG_SONYPI_COMPAT=y
 # CONFIG_SYSTEM76_ACPI is not set
 CONFIG_TOPSTAR_LAPTOP=m
-# CONFIG_I2C_MULTI_INSTANTIATE is not set
 # CONFIG_MLX_PLATFORM is not set
 CONFIG_FW_ATTR_CLASS=m
 CONFIG_INTEL_IPS=m
 # CONFIG_INTEL_SCU_PCI is not set
 # CONFIG_INTEL_SCU_PLATFORM is not set
-CONFIG_PMC_ATOM=y
-# CONFIG_CHROME_PLATFORMS is not set
-# CONFIG_MELLANOX_PLATFORM is not set
-CONFIG_SURFACE_PLATFORMS=y
-# CONFIG_SURFACE_3_BUTTON is not set
-# CONFIG_SURFACE_3_POWER_OPREGION is not set
-# CONFIG_SURFACE_GPE is not set
-CONFIG_SURFACE_HOTPLUG=m
-# CONFIG_SURFACE_PRO3_BUTTON is not set
+# CONFIG_SIEMENS_SIMATIC_IPC is not set
+# CONFIG_WINMATE_FM07_KEYS is not set
+CONFIG_P2SB=y
 CONFIG_HAVE_CLK=y
 CONFIG_HAVE_CLK_PREPARE=y
 CONFIG_COMMON_CLK=y
-
-#
-# Clock driver for ARM Reference designs
-#
-# CONFIG_ICST is not set
-# CONFIG_CLK_SP810 is not set
-# end of Clock driver for ARM Reference designs
-
 # CONFIG_COMMON_CLK_MAX9485 is not set
 # CONFIG_COMMON_CLK_SI5341 is not set
 # CONFIG_COMMON_CLK_SI5351 is not set
@@ -6467,7 +6712,7 @@ CONFIG_IOMMU_DEFAULT_DMA_STRICT=y
 # CONFIG_IOMMU_DEFAULT_DMA_LAZY is not set
 # CONFIG_IOMMU_DEFAULT_PASSTHROUGH is not set
 CONFIG_IOMMU_DMA=y
-CONFIG_IOMMU_SVA_LIB=y
+CONFIG_IOMMU_SVA=y
 CONFIG_AMD_IOMMU=y
 CONFIG_AMD_IOMMU_V2=y
 CONFIG_DMAR_TABLE=y
@@ -6514,6 +6759,11 @@ CONFIG_VIRTIO_IOMMU=m
 #
 # end of NXP/Freescale QorIQ SoC drivers
 
+#
+# fujitsu SoC drivers
+#
+# end of fujitsu SoC drivers
+
 #
 # i.MX SoC drivers
 #
@@ -6571,7 +6821,6 @@ CONFIG_EXTCON_USBC_TUSB320=m
 CONFIG_MEMORY=y
 # CONFIG_IIO is not set
 # CONFIG_NTB is not set
-# CONFIG_VME_BUS is not set
 # CONFIG_PWM is not set
 
 #
@@ -6582,7 +6831,9 @@ CONFIG_MADERA_IRQ=m
 
 # CONFIG_IPACK_BUS is not set
 CONFIG_RESET_CONTROLLER=y
+CONFIG_RESET_SIMPLE=y
 # CONFIG_RESET_TI_SYSCON is not set
+# CONFIG_RESET_TI_TPS380X is not set
 
 #
 # PHY Subsystem
@@ -6590,7 +6841,13 @@ CONFIG_RESET_CONTROLLER=y
 CONFIG_GENERIC_PHY=y
 # CONFIG_USB_LGM_PHY is not set
 # CONFIG_PHY_CAN_TRANSCEIVER is not set
+
+#
+# PHY drivers for Broadcom platforms
+#
 # CONFIG_BCM_KONA_USB2_PHY is not set
+# end of PHY drivers for Broadcom platforms
+
 # CONFIG_PHY_PXA_28NM_HSIC is not set
 # CONFIG_PHY_PXA_28NM_USB2 is not set
 # CONFIG_PHY_QCOM_USB_HS is not set
@@ -6613,16 +6870,14 @@ CONFIG_RAS=y
 #
 # Android
 #
-# CONFIG_ANDROID is not set
+# CONFIG_ANDROID_BINDER_IPC is not set
 # end of Android
 
 CONFIG_LIBNVDIMM=m
 CONFIG_BLK_DEV_PMEM=m
-CONFIG_ND_BLK=m
 CONFIG_ND_CLAIM=y
 CONFIG_ND_BTT=m
 CONFIG_BTT=y
-CONFIG_DAX_DRIVER=y
 CONFIG_DAX=y
 # CONFIG_DEV_DAX is not set
 CONFIG_NVMEM=y
@@ -6640,12 +6895,13 @@ CONFIG_NVMEM_SYSFS=y
 # CONFIG_FPGA is not set
 # CONFIG_TEE is not set
 CONFIG_PM_OPP=y
-# CONFIG_UNISYS_VISORBUS is not set
 # CONFIG_SIOX is not set
 # CONFIG_SLIMBUS is not set
 # CONFIG_INTERCONNECT is not set
 # CONFIG_COUNTER is not set
 # CONFIG_MOST is not set
+# CONFIG_PECI is not set
+# CONFIG_HTE is not set
 # end of Device Drivers
 
 #
@@ -6691,7 +6947,6 @@ CONFIG_BTRFS_ASSERT=y
 # CONFIG_NILFS2_FS is not set
 # CONFIG_F2FS_FS is not set
 # CONFIG_ZONEFS_FS is not set
-# CONFIG_FS_DAX is not set
 CONFIG_FS_POSIX_ACL=y
 CONFIG_EXPORTFS=y
 # CONFIG_EXPORTFS_BLOCK_OPS is not set
@@ -6728,6 +6983,8 @@ CONFIG_FSCACHE_STATS=y
 # CONFIG_FSCACHE_DEBUG is not set
 CONFIG_CACHEFILES=m
 # CONFIG_CACHEFILES_DEBUG is not set
+# CONFIG_CACHEFILES_ERROR_INJECTION is not set
+# CONFIG_CACHEFILES_ONDEMAND is not set
 # end of Caches
 
 #
@@ -6774,6 +7031,7 @@ CONFIG_TMPFS_POSIX_ACL=y
 CONFIG_TMPFS_XATTR=y
 # CONFIG_TMPFS_INODE64 is not set
 # CONFIG_HUGETLBFS is not set
+CONFIG_ARCH_WANT_HUGETLB_PAGE_OPTIMIZE_VMEMMAP=y
 CONFIG_MEMFD_CREATE=y
 CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
 CONFIG_CONFIGFS_FS=m
@@ -6839,7 +7097,6 @@ CONFIG_NFS_DISABLE_UDP_SUPPORT=y
 CONFIG_NFS_V4_2_READ_PLUS=y
 CONFIG_NFSD=m
 CONFIG_NFSD_V2_ACL=y
-CONFIG_NFSD_V3=y
 CONFIG_NFSD_V3_ACL=y
 CONFIG_NFSD_V4=y
 # CONFIG_NFSD_BLOCKLAYOUT is not set
@@ -6927,6 +7184,7 @@ CONFIG_NLS_MAC_ROMANIAN=m
 CONFIG_NLS_MAC_TURKISH=m
 CONFIG_NLS_UTF8=m
 CONFIG_DLM=m
+# CONFIG_DLM_DEPRECATED_API is not set
 # CONFIG_DLM_DEBUG is not set
 # CONFIG_UNICODE is not set
 CONFIG_IO_WQ=y
@@ -6949,8 +7207,6 @@ CONFIG_SECURITYFS=y
 # CONFIG_INTEL_TXT is not set
 CONFIG_HAVE_HARDENED_USERCOPY_ALLOCATOR=y
 CONFIG_HARDENED_USERCOPY=y
-CONFIG_HARDENED_USERCOPY_FALLBACK=y
-CONFIG_HARDENED_USERCOPY_PAGESPAN=y
 CONFIG_FORTIFY_SOURCE=y
 # CONFIG_STATIC_USERMODEHELPER is not set
 # CONFIG_SECURITY_SMACK is not set
@@ -6992,6 +7248,12 @@ CONFIG_INIT_ON_ALLOC_DEFAULT_ON=y
 CONFIG_CC_HAS_ZERO_CALL_USED_REGS=y
 CONFIG_ZERO_CALL_USED_REGS=y
 # end of Memory initialization
+
+# CONFIG_RANDSTRUCT_NONE is not set
+# CONFIG_RANDSTRUCT_FULL is not set
+CONFIG_RANDSTRUCT_PERFORMANCE=y
+CONFIG_RANDSTRUCT=y
+CONFIG_GCC_PLUGIN_RANDSTRUCT=y
 # end of Kernel hardening options
 # end of Security options
 
@@ -7043,12 +7305,13 @@ CONFIG_CRYPTO_ENGINE=m
 #
 CONFIG_CRYPTO_RSA=y
 CONFIG_CRYPTO_DH=m
+CONFIG_CRYPTO_DH_RFC7919_GROUPS=y
 CONFIG_CRYPTO_ECC=y
 CONFIG_CRYPTO_ECDH=m
 CONFIG_CRYPTO_ECDSA=y
 # CONFIG_CRYPTO_ECRDSA is not set
-CONFIG_CRYPTO_SM2=m
-# CONFIG_CRYPTO_CURVE25519 is not set
+# CONFIG_CRYPTO_SM2 is not set
+CONFIG_CRYPTO_CURVE25519=m
 CONFIG_CRYPTO_CURVE25519_X86=m
 
 #
@@ -7073,11 +7336,13 @@ CONFIG_CRYPTO_ECB=y
 CONFIG_CRYPTO_LRW=y
 # CONFIG_CRYPTO_OFB is not set
 CONFIG_CRYPTO_PCBC=m
-CONFIG_CRYPTO_XTS=y
+CONFIG_CRYPTO_XCTR=m
+CONFIG_CRYPTO_XTS=m
 CONFIG_CRYPTO_KEYWRAP=m
 # CONFIG_CRYPTO_NHPOLY1305_SSE2 is not set
 # CONFIG_CRYPTO_NHPOLY1305_AVX2 is not set
 # CONFIG_CRYPTO_ADIANTUM is not set
+CONFIG_CRYPTO_HCTR2=m
 CONFIG_CRYPTO_ESSIV=m
 
 #
@@ -7100,7 +7365,10 @@ CONFIG_CRYPTO_BLAKE2B=m
 CONFIG_CRYPTO_BLAKE2S_X86=y
 CONFIG_CRYPTO_CRCT10DIF=y
 CONFIG_CRYPTO_CRCT10DIF_PCLMUL=m
+CONFIG_CRYPTO_CRC64_ROCKSOFT=y
 CONFIG_CRYPTO_GHASH=m
+CONFIG_CRYPTO_POLYVAL=m
+CONFIG_CRYPTO_POLYVAL_CLMUL_NI=m
 CONFIG_CRYPTO_POLY1305=m
 CONFIG_CRYPTO_POLY1305_X86_64=m
 CONFIG_CRYPTO_MD4=m
@@ -7114,7 +7382,8 @@ CONFIG_CRYPTO_SHA512_SSSE3=m
 CONFIG_CRYPTO_SHA256=y
 CONFIG_CRYPTO_SHA512=y
 CONFIG_CRYPTO_SHA3=m
-CONFIG_CRYPTO_SM3=m
+# CONFIG_CRYPTO_SM3_GENERIC is not set
+# CONFIG_CRYPTO_SM3_AVX_X86_64 is not set
 # CONFIG_CRYPTO_STREEBOG is not set
 CONFIG_CRYPTO_WP512=m
 CONFIG_CRYPTO_GHASH_CLMUL_NI_INTEL=m
@@ -7146,11 +7415,12 @@ CONFIG_CRYPTO_KHAZAD=m
 CONFIG_CRYPTO_CHACHA20=m
 CONFIG_CRYPTO_CHACHA20_X86_64=m
 CONFIG_CRYPTO_SEED=m
+# CONFIG_CRYPTO_ARIA is not set
 CONFIG_CRYPTO_SERPENT=m
 CONFIG_CRYPTO_SERPENT_SSE2_X86_64=m
 CONFIG_CRYPTO_SERPENT_AVX_X86_64=m
 CONFIG_CRYPTO_SERPENT_AVX2_X86_64=m
-# CONFIG_CRYPTO_SM4 is not set
+# CONFIG_CRYPTO_SM4_GENERIC is not set
 # CONFIG_CRYPTO_SM4_AESNI_AVX_X86_64 is not set
 # CONFIG_CRYPTO_SM4_AESNI_AVX2_X86_64 is not set
 CONFIG_CRYPTO_TEA=m
@@ -7213,8 +7483,8 @@ CONFIG_CRYPTO_DEV_NITROX=m
 CONFIG_CRYPTO_DEV_NITROX_CNN55XX=m
 CONFIG_CRYPTO_DEV_CHELSIO=m
 CONFIG_CRYPTO_DEV_VIRTIO=m
-# CONFIG_CRYPTO_DEV_SAFEXCEL is not set
-# CONFIG_CRYPTO_DEV_AMLOGIC_GXL is not set
+CONFIG_CRYPTO_DEV_SAFEXCEL=m
+CONFIG_CRYPTO_DEV_AMLOGIC_GXL=m
 CONFIG_ASYMMETRIC_KEY_TYPE=y
 CONFIG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
 CONFIG_X509_CERTIFICATE_PARSER=y
@@ -7222,6 +7492,7 @@ CONFIG_X509_CERTIFICATE_PARSER=y
 CONFIG_PKCS7_MESSAGE_PARSER=y
 # CONFIG_PKCS7_TEST_KEY is not set
 # CONFIG_SIGNED_PE_FILE_VERIFICATION is not set
+# CONFIG_FIPS_SIGNATURE_SELFTEST is not set
 
 #
 # Certificates for signature checking
@@ -7248,7 +7519,6 @@ CONFIG_BITREVERSE=y
 CONFIG_GENERIC_STRNCPY_FROM_USER=y
 CONFIG_GENERIC_STRNLEN_USER=y
 CONFIG_GENERIC_NET_UTILS=y
-CONFIG_GENERIC_FIND_FIRST_BIT=y
 CONFIG_CORDIC=m
 # CONFIG_PRIME_NUMBERS is not set
 CONFIG_RATIONAL=y
@@ -7277,6 +7547,7 @@ CONFIG_CRYPTO_ARCH_HAVE_LIB_POLY1305=m
 CONFIG_CRYPTO_LIB_POLY1305_GENERIC=m
 CONFIG_CRYPTO_LIB_POLY1305=m
 CONFIG_CRYPTO_LIB_CHACHA20POLY1305=m
+CONFIG_CRYPTO_LIB_SHA1=y
 CONFIG_CRYPTO_LIB_SHA256=y
 # end of Crypto library routines
 
@@ -7284,6 +7555,7 @@ CONFIG_LIB_MEMNEQ=y
 CONFIG_CRC_CCITT=y
 CONFIG_CRC16=y
 CONFIG_CRC_T10DIF=y
+CONFIG_CRC64_ROCKSOFT=y
 CONFIG_CRC_ITU_T=m
 CONFIG_CRC32=y
 # CONFIG_CRC32_SELFTEST is not set
@@ -7291,7 +7563,7 @@ CONFIG_CRC32_SLICEBY8=y
 # CONFIG_CRC32_SLICEBY4 is not set
 # CONFIG_CRC32_SARWATE is not set
 # CONFIG_CRC32_BIT is not set
-CONFIG_CRC64=m
+CONFIG_CRC64=y
 CONFIG_CRC4=m
 CONFIG_CRC7=m
 CONFIG_LIBCRC32C=y
@@ -7314,6 +7586,7 @@ CONFIG_XZ_DEC_IA64=y
 CONFIG_XZ_DEC_ARM=y
 CONFIG_XZ_DEC_ARMTHUMB=y
 CONFIG_XZ_DEC_SPARC=y
+# CONFIG_XZ_DEC_MICROLZMA is not set
 CONFIG_XZ_DEC_BCJ=y
 # CONFIG_XZ_DEC_TEST is not set
 CONFIG_DECOMPRESS_GZIP=y
@@ -7339,6 +7612,7 @@ CONFIG_DMA_OPS=y
 CONFIG_NEED_SG_DMA_LENGTH=y
 CONFIG_NEED_DMA_MAP_STATE=y
 CONFIG_ARCH_DMA_ADDR_T_64BIT=y
+CONFIG_ARCH_HAS_FORCE_DMA_UNENCRYPTED=y
 CONFIG_SWIOTLB=y
 # CONFIG_DMA_API_DEBUG is not set
 CONFIG_SGL_ALLOC=y
@@ -7373,6 +7647,7 @@ CONFIG_OBJAGG=m
 # end of Library routines
 
 CONFIG_PLDMFW=y
+CONFIG_POLYNOMIAL=m
 
 #
 # Kernel hacking
@@ -7394,10 +7669,16 @@ CONFIG_SYMBOLIC_ERRNAME=y
 CONFIG_DEBUG_BUGVERBOSE=y
 # end of printk and dmesg options
 
+CONFIG_DEBUG_KERNEL=y
+CONFIG_DEBUG_MISC=y
+
 #
 # Compile-time checks and compiler options
 #
-# CONFIG_DEBUG_INFO is not set
+CONFIG_DEBUG_INFO_NONE=y
+# CONFIG_DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT is not set
+# CONFIG_DEBUG_INFO_DWARF4 is not set
+# CONFIG_DEBUG_INFO_DWARF5 is not set
 CONFIG_FRAME_WARN=2048
 CONFIG_STRIP_ASM_SYMS=y
 # CONFIG_READABLE_ASM is not set
@@ -7405,7 +7686,7 @@ CONFIG_STRIP_ASM_SYMS=y
 # CONFIG_DEBUG_SECTION_MISMATCH is not set
 CONFIG_SECTION_MISMATCH_WARN_ONLY=y
 # CONFIG_DEBUG_FORCE_FUNCTION_ALIGN_64B is not set
-CONFIG_STACK_VALIDATION=y
+CONFIG_OBJTOOL=y
 # CONFIG_VMLINUX_MAP is not set
 # CONFIG_DEBUG_FORCE_WEAK_PER_CPU is not set
 # end of Compile-time checks and compiler options
@@ -7424,15 +7705,22 @@ CONFIG_HAVE_KCSAN_COMPILER=y
 # CONFIG_KCSAN is not set
 # end of Generic Kernel Debugging Instruments
 
-CONFIG_DEBUG_KERNEL=y
-CONFIG_DEBUG_MISC=y
+#
+# Networking Debugging
+#
+# CONFIG_NET_DEV_REFCNT_TRACKER is not set
+# CONFIG_NET_NS_REFCNT_TRACKER is not set
+# CONFIG_DEBUG_NET is not set
+# end of Networking Debugging
 
 #
 # Memory Debugging
 #
 # CONFIG_PAGE_EXTENSION is not set
 # CONFIG_DEBUG_PAGEALLOC is not set
+# CONFIG_SLUB_DEBUG is not set
 # CONFIG_PAGE_OWNER is not set
+# CONFIG_PAGE_TABLE_CHECK is not set
 CONFIG_PAGE_POISONING=y
 # CONFIG_DEBUG_PAGE_REF is not set
 # CONFIG_DEBUG_RODATA_TEST is not set
@@ -7441,7 +7729,6 @@ CONFIG_DEBUG_WX=y
 CONFIG_GENERIC_PTDUMP=y
 CONFIG_PTDUMP_CORE=y
 # CONFIG_DEBUG_OBJECTS is not set
-# CONFIG_SLUB_STATS is not set
 CONFIG_HAVE_DEBUG_KMEMLEAK=y
 # CONFIG_DEBUG_KMEMLEAK is not set
 # CONFIG_DEBUG_STACK_USAGE is not set
@@ -7464,6 +7751,7 @@ CONFIG_HAVE_ARCH_KFENCE=y
 CONFIG_KFENCE=y
 CONFIG_KFENCE_SAMPLE_INTERVAL=100
 CONFIG_KFENCE_NUM_OBJECTS=255
+# CONFIG_KFENCE_DEFERRABLE is not set
 CONFIG_KFENCE_STATIC_KEYS=y
 CONFIG_KFENCE_STRESS_TEST_FAULTS=0
 # end of Memory Debugging
@@ -7479,12 +7767,10 @@ CONFIG_PANIC_TIMEOUT=0
 CONFIG_LOCKUP_DETECTOR=y
 CONFIG_SOFTLOCKUP_DETECTOR=y
 # CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC is not set
-CONFIG_BOOTPARAM_SOFTLOCKUP_PANIC_VALUE=0
 CONFIG_HARDLOCKUP_DETECTOR_PERF=y
 CONFIG_HARDLOCKUP_CHECK_TIMESTAMP=y
 CONFIG_HARDLOCKUP_DETECTOR=y
 # CONFIG_BOOTPARAM_HARDLOCKUP_PANIC is not set
-CONFIG_BOOTPARAM_HARDLOCKUP_PANIC_VALUE=0
 # CONFIG_DETECT_HUNG_TASK is not set
 # CONFIG_WQ_WATCHDOG is not set
 # CONFIG_TEST_LOCKUP is not set
@@ -7499,6 +7785,7 @@ CONFIG_SCHEDSTATS=y
 # end of Scheduler Debugging
 
 # CONFIG_DEBUG_TIMEKEEPING is not set
+# CONFIG_DEBUG_PREEMPT is not set
 
 #
 # Lock Debugging (spinlocks, mutexes, etc...)
@@ -7544,6 +7831,7 @@ CONFIG_STACKTRACE=y
 # CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_RCU_REF_SCALE_TEST is not set
 CONFIG_RCU_CPU_STALL_TIMEOUT=60
+CONFIG_RCU_EXP_CPU_STALL_TIMEOUT=0
 # CONFIG_RCU_TRACE is not set
 # CONFIG_RCU_EQS_DEBUG is not set
 # end of RCU Debugging
@@ -7553,6 +7841,7 @@ CONFIG_RCU_CPU_STALL_TIMEOUT=60
 # CONFIG_LATENCYTOP is not set
 CONFIG_USER_STACKTRACE_SUPPORT=y
 CONFIG_NOP_TRACER=y
+CONFIG_HAVE_RETHOOK=y
 CONFIG_HAVE_FUNCTION_TRACER=y
 CONFIG_HAVE_FUNCTION_GRAPH_TRACER=y
 CONFIG_HAVE_DYNAMIC_FTRACE=y
@@ -7564,6 +7853,8 @@ CONFIG_HAVE_SYSCALL_TRACEPOINTS=y
 CONFIG_HAVE_FENTRY=y
 CONFIG_HAVE_OBJTOOL_MCOUNT=y
 CONFIG_HAVE_C_RECORDMCOUNT=y
+CONFIG_HAVE_BUILDTIME_MCOUNT_SORT=y
+CONFIG_BUILDTIME_MCOUNT_SORT=y
 CONFIG_TRACER_MAX_TRACE=y
 CONFIG_TRACE_CLOCK=y
 CONFIG_RING_BUFFER=y
@@ -7580,9 +7871,11 @@ CONFIG_DYNAMIC_FTRACE=y
 CONFIG_DYNAMIC_FTRACE_WITH_REGS=y
 CONFIG_DYNAMIC_FTRACE_WITH_DIRECT_CALLS=y
 CONFIG_DYNAMIC_FTRACE_WITH_ARGS=y
+# CONFIG_FPROBE is not set
 CONFIG_FUNCTION_PROFILER=y
 CONFIG_STACK_TRACER=y
 # CONFIG_IRQSOFF_TRACER is not set
+# CONFIG_PREEMPT_TRACER is not set
 CONFIG_SCHED_TRACER=y
 # CONFIG_HWLAT_TRACER is not set
 # CONFIG_OSNOISE_TRACER is not set
@@ -7607,11 +7900,15 @@ CONFIG_RING_BUFFER_BENCHMARK=m
 # CONFIG_TRACE_EVAL_MAP_FILE is not set
 # CONFIG_FTRACE_RECORD_RECURSION is not set
 # CONFIG_FTRACE_STARTUP_TEST is not set
+# CONFIG_FTRACE_SORT_STARTUP_TEST is not set
 # CONFIG_RING_BUFFER_STARTUP_TEST is not set
 # CONFIG_RING_BUFFER_VALIDATE_TIME_DELTAS is not set
 # CONFIG_PREEMPTIRQ_DELAY_TEST is not set
+# CONFIG_RV is not set
 # CONFIG_PROVIDE_OHCI1394_DMA_INIT is not set
 # CONFIG_SAMPLES is not set
+CONFIG_HAVE_SAMPLE_FTRACE_DIRECT=y
+CONFIG_HAVE_SAMPLE_FTRACE_DIRECT_MULTI=y
 CONFIG_ARCH_HAS_DEVMEM_IS_ALLOWED=y
 CONFIG_STRICT_DEVMEM=y
 CONFIG_IO_STRICT_DEVMEM=y
index a1b32cc25668ef2642c4b764273b6f4bf29bc1cd..f70111aae158abea5fd31ca1bb2484cbc33601d4 100644 (file)
--- a/lfs/linux
+++ b/lfs/linux
 
 include Config
 
-VER         = 5.15.68
-ARM_PATCHES = 5.15-ipfire5
+VER         = 6.0-rc7
 
 THISAPP    = linux-$(VER)
-DL_FILE    = linux-$(VER).tar.xz
+DL_FILE    = linux-$(VER).tar.gz
 DL_FROM    = $(URL_IPFIRE)
 DIR_APP    = $(DIR_SRC)/$(THISAPP)
 CFLAGS     =
@@ -72,14 +71,11 @@ endif
 ###############################################################################
 # Top-level Rules
 ###############################################################################
-objects =$(DL_FILE) \
-       arm-multi-patches-$(ARM_PATCHES).patch.xz
+objects = $(DL_FILE)
 
 $(DL_FILE)                                     = $(URL_IPFIRE)/$(DL_FILE)
-arm-multi-patches-$(ARM_PATCHES).patch.xz      = $(URL_IPFIRE)/arm-multi-patches-$(ARM_PATCHES).patch.xz
 
-$(DL_FILE)_BLAKE2 = b97474cbe59654ac29a5f514c08a85db9ec330f58e08de53386d4fcedeab3845d6ea5b55e478a49fa94466eda296f80c7835704e2a13d1d56f6e38ed51953ca1
-arm-multi-patches-$(ARM_PATCHES).patch.xz_BLAKE2 = 58a70e757a9121a0aac83604a37aa787ec7ac0ee4970c5a3ac3bcb2dbaca32b00089cae6c0da5cf2fe0a2e156427b5165c6a86e0371a3e896f4c7cdd699c34a0
+$(DL_FILE)_BLAKE2 = 6fc5613ffb1f435c5f14095a699d1b475926e1e08a4017de5fd5cb9a8d0d1545743d9ee9d4e98844eb91c2b1868f83e738a48a809fa68489f812a3f9b0c4eadc
 
 install : $(TARGET)
 
@@ -116,7 +112,7 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        ln -svf linux-$(VER) $(DIR_SRC)/linux
 
        # Layer7-patch
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux/linux-5.15.59-layer7.patch
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux/linux-6.0-layer7.patch
 
        # DVB Patches
        cd $(DIR_APP) && patch -Np2 < $(DIR_SRC)/src/patches/v4l-dvb_fix_tua6034_pll.patch
@@ -143,17 +139,9 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        # https://bugzilla.ipfire.org/show_bug.cgi?id=12760
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux/linux-5.15-NFQUEUE-Hold-RCU-read-lock-while-calling-nf_reinject.patch
 
-       # https://bugzilla.ipfire.org/show_bug.cgi?id=12889
-       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux/devtmpfs-mount-with-noexec-and-nosuid.patch
-
-ifeq "$(BUILD_ARCH)" "armv6l"
        # Apply Arm-multiarch kernel patches.
-       cd $(DIR_APP) && xzcat $(DIR_DL)/arm-multi-patches-$(ARM_PATCHES).patch.xz | patch -Np1
-endif
-ifeq "$(BUILD_ARCH)" "aarch64"
-       # Apply Arm-multiarch kernel patches.
-       cd $(DIR_APP) && xzcat $(DIR_DL)/arm-multi-patches-$(ARM_PATCHES).patch.xz | patch -Np1
-endif
+       cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux/linux-6.0-ipfire-arm-patches.patch
+
        cd $(DIR_APP) && patch -Np1 < $(DIR_SRC)/src/patches/linux/linux-3.14.79-amba-fix.patch
 
 ifeq "$(KCFG)" "-headers"
diff --git a/src/patches/linux/devtmpfs-mount-with-noexec-and-nosuid.patch b/src/patches/linux/devtmpfs-mount-with-noexec-and-nosuid.patch
deleted file mode 100644 (file)
index 222b7b6..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-From 28f0c335dd4a1a4b44b3e6c6402825a93132e1a4 Mon Sep 17 00:00:00 2001
-From: Kees Cook <keescook@chromium.org>
-Date: Wed, 22 Dec 2021 17:50:20 +0500
-Subject: devtmpfs: mount with noexec and nosuid
-
-devtmpfs is writable. Add the noexec and nosuid as default mount flags
-to prevent code execution from /dev. The systems who don't use systemd
-and who rely on CONFIG_DEVTMPFS_MOUNT=y are the ones to be protected by
-this patch. Other systems are fine with the udev solution.
-
-No sane program should be relying on executing from /dev. So this patch
-reduces the attack surface. It doesn't prevent any specific attack, but
-it reduces the possibility that someone can use /dev as a place to put
-executable code. Chrome OS has been carrying this patch for several
-years. It seems trivial and simple solution to improve the protection of
-/dev when CONFIG_DEVTMPFS_MOUNT=y.
-
-Original patch:
-https://lore.kernel.org/lkml/20121120215059.GA1859@www.outflux.net/
-
-Cc: ellyjones@chromium.org
-Cc: Kay Sievers <kay@vrfy.org>
-Cc: Roland Eggner <edvx1@systemanalysen.net>
-Co-developed-by: Muhammad Usama Anjum <usama.anjum@collabora.com>
-Signed-off-by: Kees Cook <keescook@chromium.org>
-Signed-off-by: Muhammad Usama Anjum <usama.anjum@collabora.com>
-Link: https://lore.kernel.org/r/YcMfDOyrg647RCmd@debian-BULLSEYE-live-builder-AMD64
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/base/Kconfig    | 11 +++++++++++
- drivers/base/devtmpfs.c | 10 ++++++++--
- 2 files changed, 19 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
-index ffcbe2bc460eb..6f04b831a5c04 100644
---- a/drivers/base/Kconfig
-+++ b/drivers/base/Kconfig
-@@ -62,6 +62,17 @@ config DEVTMPFS_MOUNT
-         rescue mode with init=/bin/sh, even when the /dev directory
-         on the rootfs is completely empty.
-+config DEVTMPFS_SAFE
-+      bool "Use nosuid,noexec mount options on devtmpfs"
-+      depends on DEVTMPFS
-+      help
-+        This instructs the kernel to include the MS_NOEXEC and MS_NOSUID mount
-+        flags when mounting devtmpfs.
-+
-+        Notice: If enabled, things like /dev/mem cannot be mmapped
-+        with the PROT_EXEC flag. This can break, for example, non-KMS
-+        video drivers.
-+
- config STANDALONE
-       bool "Select only drivers that don't need compile-time external firmware"
-       default y
-diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c
-index 8be352ab4ddbf..1e2c2d3882e2c 100644
---- a/drivers/base/devtmpfs.c
-+++ b/drivers/base/devtmpfs.c
-@@ -29,6 +29,12 @@
- #include <uapi/linux/mount.h>
- #include "base.h"
-+#ifdef CONFIG_DEVTMPFS_SAFE
-+#define DEVTMPFS_MFLAGS       (MS_SILENT | MS_NOEXEC | MS_NOSUID)
-+#else
-+#define DEVTMPFS_MFLAGS       (MS_SILENT)
-+#endif
-+
- static struct task_struct *thread;
- static int __initdata mount_dev = IS_ENABLED(CONFIG_DEVTMPFS_MOUNT);
-@@ -363,7 +369,7 @@ int __init devtmpfs_mount(void)
-       if (!thread)
-               return 0;
--      err = init_mount("devtmpfs", "dev", "devtmpfs", MS_SILENT, NULL);
-+      err = init_mount("devtmpfs", "dev", "devtmpfs", DEVTMPFS_MFLAGS, NULL);
-       if (err)
-               printk(KERN_INFO "devtmpfs: error mounting %i\n", err);
-       else
-@@ -412,7 +418,7 @@ static noinline int __init devtmpfs_setup(void *p)
-       err = ksys_unshare(CLONE_NEWNS);
-       if (err)
-               goto out;
--      err = init_mount("devtmpfs", "/", "devtmpfs", MS_SILENT, NULL);
-+      err = init_mount("devtmpfs", "/", "devtmpfs", DEVTMPFS_MFLAGS, NULL);
-       if (err)
-               goto out;
-       init_chdir("/.."); /* will traverse into overmounted root */
--- 
-cgit 
-
diff --git a/src/patches/linux/linux-6.0-ipfire-arm-patches.patch b/src/patches/linux/linux-6.0-ipfire-arm-patches.patch
new file mode 100644 (file)
index 0000000..ba4f1f2
--- /dev/null
@@ -0,0 +1,885 @@
+From f28f1cb18fa436b30e19790324ace0bfda723a6b Mon Sep 17 00:00:00 2001
+From: Import from armbian <no@mail>
+Date: Thu, 1 Mar 2018 11:13:06 +0100
+Subject: [PATCH 01/17] sunxi: fix xradio interrupt opi zero
+
+---
+ arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dts | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dts b/arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dts
+index 3706216ffb40..7b42ab8b5180 100644
+--- a/arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dts
++++ b/arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dts
+@@ -49,6 +49,7 @@
+ #include <dt-bindings/gpio/gpio.h>
+ #include <dt-bindings/input/input.h>
++#include <dt-bindings/pinctrl/sun4i-a10.h>
+ / {
+       model = "Xunlong Orange Pi Zero";
+@@ -151,6 +152,10 @@ &mmc1 {
+        */
+       xr819: sdio_wifi@1 {
+               reg = <1>;
++              compatible = "xradio,xr819";
++              interrupt-parent = <&pio>;
++              interrupts = <6 10 IRQ_TYPE_EDGE_RISING>;
++              interrupt-names = "host-wake";
+       };
+ };
+-- 
+2.30.2
+
+
+From b9b6e272d357dcfed30a26e8b248f7082d7e1f8e Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Thu, 1 Mar 2018 13:37:33 +0100
+Subject: [PATCH 02/17] sunxi: add default led trigger
+ (bananapi,bananapro,lamobo r1)
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm/boot/dts/sun7i-a20-bananapi.dts  | 1 +
+ arch/arm/boot/dts/sun7i-a20-bananapro.dts | 2 ++
+ arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts | 1 +
+ 3 files changed, 4 insertions(+)
+
+diff --git a/arch/arm/boot/dts/sun7i-a20-bananapi.dts b/arch/arm/boot/dts/sun7i-a20-bananapi.dts
+index 46ecf9db2324..64ce00ffabea 100644
+--- a/arch/arm/boot/dts/sun7i-a20-bananapi.dts
++++ b/arch/arm/boot/dts/sun7i-a20-bananapi.dts
+@@ -80,6 +80,7 @@ leds {
+               led {
+                       label = "bananapi:green:usr";
+                       gpios = <&pio 7 24 GPIO_ACTIVE_HIGH>;
++                      linux,default-trigger = "heartbeat";
+               };
+       };
+diff --git a/arch/arm/boot/dts/sun7i-a20-bananapro.dts b/arch/arm/boot/dts/sun7i-a20-bananapro.dts
+index e22f0e8bb17a..7adb895200a2 100644
+--- a/arch/arm/boot/dts/sun7i-a20-bananapro.dts
++++ b/arch/arm/boot/dts/sun7i-a20-bananapro.dts
+@@ -66,11 +66,13 @@ leds {
+               led-0 {
+                       label = "bananapro:blue:usr";
+                       gpios = <&pio 6 2 GPIO_ACTIVE_HIGH>;
++                      linux,default-trigger = "heartbeat";
+               };
+               led-1 {
+                       label = "bananapro:green:usr";
+                       gpios = <&pio 7 24 GPIO_ACTIVE_HIGH>;
++                      linux,default-trigger = "mmc0";
+               };
+       };
+diff --git a/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts b/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts
+index 97518afe4658..7947bbef2a02 100644
+--- a/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts
++++ b/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts
+@@ -78,6 +78,7 @@ leds {
+               led {
+                       label = "lamobo_r1:green:usr";
+                       gpios = <&pio 7 24 GPIO_ACTIVE_HIGH>;
++                      linux,default-trigger = "heartbeat";
+               };
+       };
+-- 
+2.30.2
+
+
+From aad64b51d6e4067eba1b814155ee80a59d431b48 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Mon, 5 Mar 2018 11:30:33 +0100
+Subject: [PATCH 03/17] sunxi: dt: IPFire changes for nanopi
+
+enable all usb
+change led trigger
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm/boot/dts/sun8i-h3-nanopi.dtsi | 19 ++++++++++++++++++-
+ 1 file changed, 18 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi b/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
+index cf8413fba6c1..a7dc91c192e7 100644
+--- a/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
++++ b/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi
+@@ -63,13 +63,14 @@ leds {
+               led-0 {
+                       label = "nanopi:blue:status";
+                       gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>;
+-                      linux,default-trigger = "heartbeat";
++                      linux,default-trigger = "mmc0";
+               };
+               led-1 {
+                       label = "nanopi:green:pwr";
+                       gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>;
+                       default-state = "on";
++                      linux,default-trigger = "heartbeat";
+               };
+       };
+@@ -85,6 +86,14 @@ key-0 {
+       };
+ };
++&ehci1 {
++      status = "okay";
++};
++
++&ehci2 {
++      status = "okay";
++};
++
+ &ehci3 {
+       status = "okay";
+ };
+@@ -96,6 +105,14 @@ &mmc0 {
+       vmmc-supply = <&reg_vcc3v3>;
+ };
++&ohci1 {
++      status = "okay";
++};
++
++&ohci2 {
++      status = "okay";
++};
++
+ &ohci3 {
+       status = "okay";
+ };
+-- 
+2.30.2
+
+
+From e92a6d68cd69a29bd32889c1bf65bde083558a3d Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Mon, 5 Mar 2018 11:32:33 +0100
+Subject: [PATCH 04/17] sunxi: dt: apply IPFire changes for orangepi zero
+
+change led trigger
+enable all usb
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ .../boot/dts/sun8i-h2-plus-orangepi-zero.dts  | 20 ++++++++++++++++++-
+ 1 file changed, 19 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dts b/arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dts
+index 7b42ab8b5180..d6898676ab7f 100644
+--- a/arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dts
++++ b/arch/arm/boot/dts/sun8i-h2-plus-orangepi-zero.dts
+@@ -72,12 +72,14 @@ leds {
+               pwr_led {
+                       label = "orangepi:green:pwr";
+                       gpios = <&r_pio 0 10 GPIO_ACTIVE_HIGH>;
+-                      default-state = "on";
++                      linux,default-trigger = "heartbeat";
+               };
+               status_led {
+                       label = "orangepi:red:status";
+                       gpios = <&pio 0 17 GPIO_ACTIVE_HIGH>;
++                      linux,default-trigger = "mmc0";
++
+               };
+       };
+@@ -125,6 +127,14 @@ &ehci1 {
+       status = "okay";
+ };
++&ehci2 {
++      status = "okay";
++};
++
++&ehci3 {
++      status = "okay";
++};
++
+ &emac {
+       phy-handle = <&int_mii_phy>;
+       phy-mode = "mii";
+@@ -167,6 +177,14 @@ &ohci1 {
+       status = "okay";
+ };
++&ohci2 {
++      status = "okay";
++};
++
++&ohci3 {
++      status = "okay";
++};
++
+ &spi0 {
+       /* Disable SPI NOR by default: it optional on Orange Pi Zero boards */
+       status = "disabled";
+-- 
+2.30.2
+
+
+From 3f091ef44b289fca483644783e6fe22a65ff7d20 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Fri, 5 Nov 2021 09:59:53 +0100
+Subject: [PATCH 05/17] sunxi: dt: nanopi-r1 add usb-ethernet node
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts b/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
+index 42cd1131adf3..4fa6b86566a3 100644
+--- a/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
++++ b/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
+@@ -15,7 +15,8 @@ / {
+       aliases {
+               serial1 = &uart1;
+               ethernet0 = &emac;
+-              ethernet1 = &wifi;
++              ethernet1 = &usbr8152;
++              ethernet2 = &wifi;
+       };
+       reg_gmac_3v3: gmac-3v3 {
+@@ -69,8 +70,15 @@ &cpu0 {
+       cpu-supply = <&reg_vdd_cpux>;
+ };
++
+ &ehci1 {
+       status = "okay";
++      #address-cells = <1>;
++      #size-cells = <0>;
++      usbr8152: usbether@1 {
++              compatible = "usb0bda,8152";
++              reg = <1>;
++    };
+ };
+ &ehci2 {
+@@ -121,7 +129,7 @@ &mmc2 {
+ };
+ &ohci1 {
+-      status = "okay";
++      status = "disabled";
+ };
+ &ohci2 {
+-- 
+2.30.2
+
+
+From 4f56c67d31a87f3f0433093cad110ca75d61ea61 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Fri, 5 Nov 2021 10:04:31 +0100
+Subject: [PATCH 06/17] sunxi: dt: nanopi-r1 swap serial ports.
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts b/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
+index 4fa6b86566a3..4722af018302 100644
+--- a/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
++++ b/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
+@@ -13,7 +13,8 @@ / {
+       compatible = "friendlyarm,nanopi-r1", "allwinner,sun8i-h3";
+       aliases {
+-              serial1 = &uart1;
++              serial0 = &uart1;
++              serial1 = &uart0;
+               ethernet0 = &emac;
+               ethernet1 = &usbr8152;
+               ethernet2 = &wifi;
+-- 
+2.30.2
+
+
+From aa559d027e1c306ad289795c3b9f939f60c31ecd Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Sat, 6 Nov 2021 09:52:22 +0100
+Subject: [PATCH 07/17] sunxi: dt: nanopi-r1 fix led nodes
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts | 28 ++++++++++++++++--------
+ 1 file changed, 19 insertions(+), 9 deletions(-)
+
+diff --git a/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts b/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
+index 4722af018302..1a5ebaad4fea 100644
+--- a/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
++++ b/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
+@@ -53,16 +53,26 @@ wifi_pwrseq: wifi_pwrseq {
+       };
+       leds {
+-              led-2 {
+-                      function = LED_FUNCTION_WAN;
+-                      color = <LED_COLOR_ID_GREEN>;
+-                      gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */
++              // delete wrong nodes imported from sun8i-h3-nanopi.dtsi
++              /delete-node/ led-0;
++              /delete-node/ led-1;
++
++              led-0 {
++                      label = "nanopi-r1:red:status";
++                      gpios = <&pio 0 10 GPIO_ACTIVE_HIGH>;
++                      linux,default-trigger = "heartbeat";
+               };
+-
+-              led-3 {
+-                      function = LED_FUNCTION_LAN;
+-                      color = <LED_COLOR_ID_GREEN>;
+-                      gpios = <&pio 0 9 GPIO_ACTIVE_HIGH>; /* PA9 */
++              led-1 {
++                      label = "nanopi-r1:green:wan";
++                      gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>;
++                      default-state = "off";
++                      linux,default-trigger = "netdev";
++              };
++              led-2 {
++                      label = "nanopi-r1:green:lan";
++                      gpios = <&pio 0 9 GPIO_ACTIVE_HIGH>;
++                      default-state = "off";
++                      linux,default-trigger = "netdev";
+               };
+       };
+ };
+-- 
+2.30.2
+
+
+From d9a4096936e12a9e7a79330469b903b19ce05d0a Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Thu, 3 Jun 2021 17:57:37 +0200
+Subject: [PATCH 08/17] sunxi: dts: fix usb on Lamobo R1 and BananaPi M1
+
+somewhere is a bug in the OTG port code. If this is enabled no usb port is working.
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm/boot/dts/sun7i-a20-bananapi.dts  | 23 ++++++++---------------
+ arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts | 18 +++++++++++++-----
+ 2 files changed, 21 insertions(+), 20 deletions(-)
+
+diff --git a/arch/arm/boot/dts/sun7i-a20-bananapi.dts b/arch/arm/boot/dts/sun7i-a20-bananapi.dts
+index 64ce00ffabea..7fae987e101d 100644
+--- a/arch/arm/boot/dts/sun7i-a20-bananapi.dts
++++ b/arch/arm/boot/dts/sun7i-a20-bananapi.dts
+@@ -189,7 +189,7 @@ &ohci1 {
+ };
+ &otg_sram {
+-      status = "okay";
++      status = "disabled";
+ };
+ &pio {
+@@ -277,17 +277,11 @@ &reg_ldo2 {
+       regulator-name = "avcc";
+ };
++/*
+ &reg_usb0_vbus {
+       status = "okay";
+ };
+-
+-&reg_usb1_vbus {
+-      status = "okay";
+-};
+-
+-&reg_usb2_vbus {
+-      status = "okay";
+-};
++*/
+ &spi0 {
+       pinctrl-names = "default";
+@@ -317,7 +311,7 @@ &uart7 {
+ &usb_otg {
+       dr_mode = "otg";
+-      status = "okay";
++      status = "disabled";
+ };
+ &usb_power_supply {
+@@ -325,10 +319,9 @@ &usb_power_supply {
+ };
+ &usbphy {
+-      usb0_id_det-gpios = <&pio 7 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; /* PH4 */
+-      usb0_vbus_power-supply = <&usb_power_supply>;
+-      usb0_vbus-supply = <&reg_usb0_vbus>;
+-      usb1_vbus-supply = <&reg_usb1_vbus>;
+-      usb2_vbus-supply = <&reg_usb2_vbus>;
++//    usb0_id_det-gpios = <&pio 7 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; /* PH4 */
++//    usb0_vbus_power-supply = <&usb_power_supply>;
++//    usb0_vbus-supply = <&reg_usb0_vbus>;
++      /* USB host ports (usb1 and 2) are always connected to vcc (+5v) */
+       status = "okay";
+ };
+diff --git a/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts b/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts
+index 7947bbef2a02..481e4eb9ed04 100644
+--- a/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts
++++ b/arch/arm/boot/dts/sun7i-a20-lamobo-r1.dts
+@@ -225,7 +225,7 @@ &ohci0 {
+ };
+ &otg_sram {
+-      status = "okay";
++      status = "disabled";
+ };
+ #include "axp209.dtsi"
+@@ -268,11 +268,15 @@ &reg_ldo2 {
+       regulator-name = "avcc";
+ };
++/*
+ &reg_usb0_vbus {
+       status = "okay";
+ };
++*/
+ &reg_usb2_vbus {
++      /* Not really the power but connected to the WAKE pin
++         of the wlan module */
+       gpio = <&pio 7 12 GPIO_ACTIVE_HIGH>; /* PH12 */
+       status = "okay";
+ };
+@@ -305,17 +309,21 @@ &uart7 {
+ &usb_otg {
+       dr_mode = "otg";
+-      status = "okay";
++      status = "disabled";
+ };
++/*
+ &usb_power_supply {
+       status = "okay";
+ };
++*/
+ &usbphy {
+-      usb0_id_det-gpios = <&pio 7 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; /* PH4 */
+-      usb0_vbus_power-supply = <&usb_power_supply>;
+-      usb0_vbus-supply = <&reg_usb0_vbus>;
++      //usb0_id_det-gpios = <&pio 7 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; /* PH4 */
++      //usb0_vbus_power-supply = <&usb_power_supply>;
++      //usb0_vbus-supply = <&reg_usb0_vbus>;
++      /* USB host port (usb1) is connected to vcc (+5v) */
++      /* USB2 is connected to the wlan board */
+       usb2_vbus-supply = <&reg_usb2_vbus>;
+       status = "okay";
+ };
+-- 
+2.30.2
+
+
+From d5129738a0ec3eb26b6ac6d4391e4ac703a72b32 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Tue, 9 Nov 2021 08:52:11 +0100
+Subject: [PATCH 09/17] rockchip: dt: nanopi-r2s: change button from restart to
+ power
+
+this is to proper shutdown via acpi with this button.
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
+index 1445b879ac7a..35b76d7e8ab4 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
+@@ -35,9 +35,9 @@ keys {
+               pinctrl-names = "default";
+               key-reset {
+-                      label = "reset";
++                      label = "power";
+                       gpios = <&gpio0 RK_PA0 GPIO_ACTIVE_LOW>;
+-                      linux,code = <KEY_RESTART>;
++                      linux,code = <KEY_POWER>;
+                       debounce-interval = <50>;
+               };
+       };
+-- 
+2.30.2
+
+
+From f76bd1346ecc2a38cb9f7e9a7995823e0905bf1c Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Tue, 9 Nov 2021 08:55:06 +0100
+Subject: [PATCH 10/17] rockchip: dt: nanopi-r2s: change sysled trigger to
+ heartbeat
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
+index 35b76d7e8ab4..16caf1e32259 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s.dts
+@@ -56,6 +56,7 @@ sys_led: led-1 {
+                       gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>;
+                       label = "nanopi-r2s:red:sys";
+                       default-state = "on";
++                      linux,default-trigger = "heartbeat";
+               };
+               wan_led: led-2 {
+-- 
+2.30.2
+
+
+From 83b23be84b364253a67b8bd937c1b20cd8df2190 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Wed, 10 Nov 2021 21:25:32 +0100
+Subject: [PATCH 11/17] sunxi: dt: Nanopi R1 fix model string
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts b/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
+index 1a5ebaad4fea..b1628f137a48 100644
+--- a/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
++++ b/arch/arm/boot/dts/sun8i-h3-nanopi-r1.dts
+@@ -9,7 +9,7 @@
+ #include <dt-bindings/leds/common.h>
+ / {
+-      model = "FriendlyARM NanoPi R1";
++      model = "FriendlyElec NanoPi-R1";
+       compatible = "friendlyarm,nanopi-r1", "allwinner,sun8i-h3";
+       aliases {
+-- 
+2.30.2
+
+
+From f158d229fed835bcf24767e497a445391cd683d0 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Tue, 25 Jan 2022 18:04:28 +0100
+Subject: [PATCH 12/17] rockchip: dt: nanopi-r4s: fix led names and button
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
+index fe5b52610010..9125f013438d 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
+@@ -28,18 +28,19 @@ gpio-leds {
+               lan_led: led-lan {
+                       gpios = <&gpio1 RK_PA1 GPIO_ACTIVE_HIGH>;
+-                      label = "green:lan";
++                      label = "nanopi-r4s:green:lan";
+               };
+               sys_led: led-sys {
+                       gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_HIGH>;
+-                      label = "red:power";
++                      label = "nanopi-r4s:green:sys";
+                       default-state = "on";
++                      linux,default-trigger = "heartbeat";
+               };
+               wan_led: led-wan {
+                       gpios = <&gpio1 RK_PA0 GPIO_ACTIVE_HIGH>;
+-                      label = "green:wan";
++                      label = "nanopi-r4s:green:wan";
+               };
+       };
+@@ -51,8 +52,8 @@ gpio-keys {
+               key-reset {
+                       debounce-interval = <50>;
+                       gpios = <&gpio1 RK_PC6 GPIO_ACTIVE_LOW>;
+-                      label = "reset";
+-                      linux,code = <KEY_RESTART>;
++                      label = "power";
++                      linux,code = <KEY_POWER>;
+               };
+       };
+-- 
+2.30.2
+
+
+From 341797ce40f6dd8679988bc0bd32ecf2e8f95876 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Fri, 28 Jan 2022 17:20:56 +0100
+Subject: [PATCH 13/17] rockchip: dt: nanopi-r4s: add realtek pci devicenode
+
+this is needed to set the mac address via u-boot
+---
+ .../arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
+index 9125f013438d..5a60460bd974 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s.dts
+@@ -19,6 +19,10 @@ / {
+       model = "FriendlyElec NanoPi R4S";
+       compatible = "friendlyarm,nanopi-r4s", "rockchip,rk3399";
++      aliases {
++              ethernet1 = &r8169;
++      };
++
+       /delete-node/ display-subsystem;
+       gpio-leds {
+@@ -77,6 +81,17 @@ &pcie0 {
+       max-link-speed = <1>;
+       num-lanes = <1>;
+       vpcie3v3-supply = <&vcc3v3_sys>;
++
++      pcie@0 {
++              reg = <0x00000000 0 0 0 0>;
++              #address-cells = <3>;
++              #size-cells = <2>;
++
++              r8169: pcie@0,0 {
++                      reg = <0x000000 0 0 0 0>;
++                      local-mac-address = [ 00 00 00 00 00 00 ];
++              };
++      };
+ };
+ &pinctrl {
+-- 
+2.30.2
+
+
+From c655056cad7b089c10665e0ad0398fda49e03c01 Mon Sep 17 00:00:00 2001
+From: Jonas Karlman <jonas@kwiboo.se>
+Date: Sun, 17 Feb 2019 22:14:38 +0000
+Subject: [PATCH 14/17] mmc: core: set initial signal voltage on power off
+
+Some boards have SD card connectors where the power rail cannot be switched
+off by the driver. If the card has not been power cycled, it may still be
+using 1.8V signaling after a warm re-boot. Bootroms expecting 3.3V signaling
+will fail to boot from a UHS card that continue to use 1.8V signaling.
+
+Set initial signal voltage in mmc_power_off() to allow re-boot to function.
+
+This fixes re-boot with UHS cards on Asus Tinker Board (Rockchip RK3288),
+same issue have been seen on some Rockchip RK3399 boards.
+
+I am sending this as a RFC because I have no insights into SD/MMC subsystem,
+this change fix a re-boot issue on my boards and does not break emmc/sdio.
+Is this an acceptable workaround? Any advice is appreciated.
+
+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
+---
+ drivers/mmc/core/core.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
+index ef53a2578824..d4c53074154a 100644
+--- a/drivers/mmc/core/core.c
++++ b/drivers/mmc/core/core.c
+@@ -1358,6 +1358,14 @@ void mmc_power_off(struct mmc_host *host)
+       if (host->ios.power_mode == MMC_POWER_OFF)
+               return;
++      mmc_set_initial_signal_voltage(host);
++
++      /*
++       * This delay should be sufficient to allow the power supply
++       * to reach the minimum voltage.
++       */
++      mmc_delay(host->ios.power_delay_ms);
++
+       mmc_pwrseq_power_off(host);
+       host->ios.clock = 0;
+-- 
+2.30.2
+
+
+From df00ce67c9481321e895247cb259e8e254e03895 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Sat, 5 Feb 2022 15:35:57 +0000
+Subject: [PATCH 15/17] pcie-rockchip-host: try again if training fail.
+
+on NanoPi R4S the training of the pcie often fails at first try
+so this try again some times.
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ drivers/pci/controller/pcie-rockchip-host.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/pci/controller/pcie-rockchip-host.c b/drivers/pci/controller/pcie-rockchip-host.c
+index 7352b5ff8d35..08d97c552886 100644
+--- a/drivers/pci/controller/pcie-rockchip-host.c
++++ b/drivers/pci/controller/pcie-rockchip-host.c
+@@ -962,8 +962,16 @@ static int rockchip_pcie_probe(struct platform_device *pdev)
+       }
+       err = rockchip_pcie_host_init_port(rockchip);
+-      if (err)
+-              goto err_vpcie;
++      if (err) {
++              dev_err(dev, "failed to init port, try again...\n");
++              err = rockchip_pcie_host_init_port(rockchip);
++              if (err) {
++                      dev_err(dev, "failed to init port, last try in 500ms.\n");
++                      mdelay(500);
++                      err = rockchip_pcie_host_init_port(rockchip);
++                      if (err) goto err_vpcie;
++              }
++      }
+       err = rockchip_pcie_init_irq_domain(rockchip);
+       if (err < 0)
+-- 
+2.30.2
+
+
+From 5c5185545f5a896bf0219ac777527d18ce5f07fc Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Fri, 11 Feb 2022 09:34:40 +0000
+Subject: [PATCH 16/17] rockchip: dt: add overclocked NanoPi R4S
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm64/boot/dts/rockchip/Makefile         |  1 +
+ .../dts/rockchip/rk3399-nanopi-r4s-oc.dts     | 27 +++++++++++++++++++
+ 2 files changed, 28 insertions(+)
+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s-oc.dts
+
+diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile
+index ef79a672804a..20908e47e446 100644
+--- a/arch/arm64/boot/dts/rockchip/Makefile
++++ b/arch/arm64/boot/dts/rockchip/Makefile
+@@ -40,6 +40,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-m4b.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-neo4.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4s.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-nanopi-r4s-oc.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-orangepi.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-pinebook-pro.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3399-puma-haikou.dtb
+diff --git a/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s-oc.dts b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s-oc.dts
+new file mode 100644
+index 000000000000..80ac91d5d12d
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3399-nanopi-r4s-oc.dts
+@@ -0,0 +1,27 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++/*
++ * FriendlyElec NanoPC-R4S OC
++ *
++ * Overclock NanoPi R4S to 2Ghz/1.5Ghz
++ */
++
++/dts-v1/;
++#include "rk3399-nanopi-r4s.dts"
++
++/ {
++      model = "FriendlyElec NanoPi R4S OC";
++
++      cluster0_opp: opp-table0 {
++              opp06 {
++                      opp-hz = /bits/ 64 <1512000000>;
++                      opp-microvolt = <1150000 1150000 1250000>;
++              };
++      };
++
++      cluster1_opp: opp-table1 {
++              opp08 {
++                      opp-hz = /bits/ 64 <20160000000>;
++                      opp-microvolt = <1250000 1250000 1250000>;
++              };
++      };
++};
+-- 
+2.30.2
+
+
+From edd7694578391f5236d8ab7732a0362e3f9f4d34 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Fri, 11 Feb 2022 16:12:47 +0000
+Subject: [PATCH 17/17] rockchip: dt: add overclocked NanoPi R2S
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ arch/arm64/boot/dts/rockchip/Makefile         |  1 +
+ .../dts/rockchip/rk3328-nanopi-r2s-oc.dts     | 25 +++++++++++++++++++
+ 2 files changed, 26 insertions(+)
+ create mode 100644 arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s-oc.dts
+
+diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile
+index 20908e47e446..58fc1f11f0a2 100644
+--- a/arch/arm64/boot/dts/rockchip/Makefile
++++ b/arch/arm64/boot/dts/rockchip/Makefile
+@@ -11,6 +11,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3326-odroid-go2.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-a1.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-evb.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s.dtb
++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-nanopi-r2s-oc.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock64.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-rock-pi-e.dtb
+ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3328-roc-cc.dtb
+diff --git a/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s-oc.dts b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s-oc.dts
+new file mode 100644
+index 000000000000..a614acbc801a
+--- /dev/null
++++ b/arch/arm64/boot/dts/rockchip/rk3328-nanopi-r2s-oc.dts
+@@ -0,0 +1,25 @@
++// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
++/*
++ * overclock Nanopi R2S to 1.5 Ghz
++ */
++
++/dts-v1/;
++
++#include "rk3328-nanopi-r2s.dts"
++
++/ {
++      model = "FriendlyElec NanoPi R2S OC";
++
++      cpu0_opp_table: opp_table0 {
++              opp-1392000000 {
++                      opp-hz = /bits/ 64 <1392000000>;
++                      opp-microvolt = <1350000>;
++                      clock-latency-ns = <40000>;
++              };
++              opp-1512000000 {
++                      opp-hz = /bits/ 64 <1512000000>;
++                      opp-microvolt = <1400000>;
++                      clock-latency-ns = <40000>;
++              };
++      };
++};
+-- 
+2.30.2
+
diff --git a/src/patches/linux/linux-6.0-layer7.patch b/src/patches/linux/linux-6.0-layer7.patch
new file mode 100644 (file)
index 0000000..87c3201
--- /dev/null
@@ -0,0 +1,2771 @@
+From bd9e501ca1067e117f638f546ec9c38fe32bf62b Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Mon, 6 Mar 2017 08:47:23 +0100
+Subject: [PATCH 01/11] netfilter: import layer7 patchset
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ include/linux/netfilter/xt_layer7.h     |   13 +
+ include/net/netfilter/nf_conntrack.h    |   16 +
+ net/netfilter/Kconfig                   |   20 +
+ net/netfilter/Makefile                  |    1 +
+ net/netfilter/nf_conntrack_standalone.c |    5 +
+ net/netfilter/regexp/regexp.c           | 1197 +++++++++++++++++++++++
+ net/netfilter/regexp/regexp.h           |   41 +
+ net/netfilter/regexp/regmagic.h         |    5 +
+ net/netfilter/regexp/regsub.c           |   95 ++
+ net/netfilter/xt_layer7.c               |  658 +++++++++++++
+ 10 files changed, 2051 insertions(+)
+ create mode 100644 include/linux/netfilter/xt_layer7.h
+ create mode 100644 net/netfilter/regexp/regexp.c
+ create mode 100644 net/netfilter/regexp/regexp.h
+ create mode 100644 net/netfilter/regexp/regmagic.h
+ create mode 100644 net/netfilter/regexp/regsub.c
+ create mode 100644 net/netfilter/xt_layer7.c
+
+diff --git a/include/linux/netfilter/xt_layer7.h b/include/linux/netfilter/xt_layer7.h
+new file mode 100644
+index 000000000000..147cd6477858
+--- /dev/null
++++ b/include/linux/netfilter/xt_layer7.h
+@@ -0,0 +1,13 @@
++#ifndef _XT_LAYER7_H
++#define _XT_LAYER7_H
++
++#define MAX_PATTERN_LEN 8192
++#define MAX_PROTOCOL_LEN 256
++
++struct xt_layer7_info {
++    char protocol[MAX_PROTOCOL_LEN];
++    char pattern[MAX_PATTERN_LEN];
++    u_int8_t invert;
++};
++
++#endif /* _XT_LAYER7_H */
+diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h
+index 6a2019aaa464..7e67b38553dc 100644
+--- a/include/net/netfilter/nf_conntrack.h
++++ b/include/net/netfilter/nf_conntrack.h
+@@ -121,6 +121,22 @@ struct nf_conn {
+       /* Extensions */
+       struct nf_ct_ext *ext;
++#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || \
++    defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
++      struct {
++              /*
++               * e.g. "http". NULL before decision. "unknown" after decision
++               * if no match.
++               */
++              char *app_proto;
++              /*
++               * application layer data so far. NULL after match decision.
++               */
++              char *app_data;
++              unsigned int app_data_len;
++      } layer7;
++#endif
++
+       /* Storage reserved for other modules, must be the last member */
+       union nf_conntrack_proto proto;
+ };
+diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig
+index 4b8d04640ff3..9d2140704720 100644
+--- a/net/netfilter/Kconfig
++++ b/net/netfilter/Kconfig
+@@ -1401,6 +1401,26 @@ config NETFILTER_XT_MATCH_L2TP
+       To compile it as a module, choose M here. If unsure, say N.
++config NETFILTER_XT_MATCH_LAYER7
++      tristate '"layer7" match support'
++      depends on NETFILTER_XTABLES
++      depends on NETFILTER_ADVANCED
++      depends on NF_CONNTRACK
++      help
++        Say Y if you want to be able to classify connections (and their
++        packets) based on regular expression matching of their application
++        layer data.   This is one way to classify applications such as
++        peer-to-peer filesharing systems that do not always use the same
++        port.
++
++        To compile it as a module, choose M here.  If unsure, say N.
++
++config NETFILTER_XT_MATCH_LAYER7_DEBUG
++      bool 'Layer 7 debugging output'
++      depends on NETFILTER_XT_MATCH_LAYER7
++      help
++        Say Y to get lots of debugging output.
++
+ config NETFILTER_XT_MATCH_LENGTH
+       tristate '"length" match support'
+       depends on NETFILTER_ADVANCED
+diff --git a/net/netfilter/Makefile b/net/netfilter/Makefile
+index 06df49ea6329..163cd30cf30e 100644
+--- a/net/netfilter/Makefile
++++ b/net/netfilter/Makefile
+@@ -206,6 +206,7 @@ obj-$(CONFIG_NETFILTER_XT_MATCH_RECENT) += xt_recent.o
+ obj-$(CONFIG_NETFILTER_XT_MATCH_SCTP) += xt_sctp.o
+ obj-$(CONFIG_NETFILTER_XT_MATCH_SOCKET) += xt_socket.o
+ obj-$(CONFIG_NETFILTER_XT_MATCH_STATE) += xt_state.o
++obj-$(CONFIG_NETFILTER_XT_MATCH_LAYER7) += xt_layer7.o
+ obj-$(CONFIG_NETFILTER_XT_MATCH_STATISTIC) += xt_statistic.o
+ obj-$(CONFIG_NETFILTER_XT_MATCH_STRING) += xt_string.o
+ obj-$(CONFIG_NETFILTER_XT_MATCH_TCPMSS) += xt_tcpmss.o
+diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c
+index 4ffe84c5a82c..69918be0a52f 100644
+--- a/net/netfilter/nf_conntrack_standalone.c
++++ b/net/netfilter/nf_conntrack_standalone.c
+@@ -373,6 +373,11 @@ static int ct_seq_show(struct seq_file *s, void *v)
+       ct_show_zone(s, ct, NF_CT_DEFAULT_ZONE_DIR);
+       ct_show_delta_time(s, ct);
++#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
++      if(ct->layer7.app_proto)
++              seq_printf(s, "l7proto=%s ", ct->layer7.app_proto);
++#endif
++
+       seq_printf(s, "use=%u\n", refcount_read(&ct->ct_general.use));
+       if (seq_has_overflowed(s))
+diff --git a/net/netfilter/regexp/regexp.c b/net/netfilter/regexp/regexp.c
+new file mode 100644
+index 000000000000..900698886531
+--- /dev/null
++++ b/net/netfilter/regexp/regexp.c
+@@ -0,0 +1,1197 @@
++/*
++ * regcomp and regexec -- regsub and regerror are elsewhere
++ * @(#)regexp.c       1.3 of 18 April 87
++ *
++ *    Copyright (c) 1986 by University of Toronto.
++ *    Written by Henry Spencer.  Not derived from licensed software.
++ *
++ *    Permission is granted to anyone to use this software for any
++ *    purpose on any computer system, and to redistribute it freely,
++ *    subject to the following restrictions:
++ *
++ *    1. The author is not responsible for the consequences of use of
++ *            this software, no matter how awful, even if they arise
++ *            from defects in it.
++ *
++ *    2. The origin of this software must not be misrepresented, either
++ *            by explicit claim or by omission.
++ *
++ *    3. Altered versions must be plainly marked as such, and must not
++ *            be misrepresented as being the original software.
++ *
++ * Beware that some of this code is subtly aware of the way operator
++ * precedence is structured in regular expressions.  Serious changes in
++ * regular-expression syntax might require a total rethink.
++ *
++ * This code was modified by Ethan Sommer to work within the kernel
++ * (it now uses kmalloc etc..)
++ *
++ * Modified slightly by Matthew Strait to use more modern C.
++ */
++
++#include "regexp.h"
++#include "regmagic.h"
++
++/* added by ethan and matt.  Lets it work in both kernel and user space.
++(So iptables can use it, for instance.)  Yea, it goes both ways... */
++#if __KERNEL__
++  #define malloc(foo) kmalloc(foo,GFP_ATOMIC)
++#else
++  #define printk(format,args...) printf(format,##args)
++#endif
++
++void regerror(char * s)
++{
++        printk("<3>Regexp: %s\n", s);
++        /* NOTREACHED */
++}
++
++/*
++ * The "internal use only" fields in regexp.h are present to pass info from
++ * compile to execute that permits the execute phase to run lots faster on
++ * simple cases.  They are:
++ *
++ * regstart   char that must begin a match; '\0' if none obvious
++ * reganch    is the match anchored (at beginning-of-line only)?
++ * regmust    string (pointer into program) that match must include, or NULL
++ * regmlen    length of regmust string
++ *
++ * Regstart and reganch permit very fast decisions on suitable starting points
++ * for a match, cutting down the work a lot.  Regmust permits fast rejection
++ * of lines that cannot possibly match.  The regmust tests are costly enough
++ * that regcomp() supplies a regmust only if the r.e. contains something
++ * potentially expensive (at present, the only such thing detected is * or +
++ * at the start of the r.e., which can involve a lot of backup).  Regmlen is
++ * supplied because the test in regexec() needs it and regcomp() is computing
++ * it anyway.
++ */
++
++/*
++ * Structure for regexp "program".  This is essentially a linear encoding
++ * of a nondeterministic finite-state machine (aka syntax charts or
++ * "railroad normal form" in parsing technology).  Each node is an opcode
++ * plus a "next" pointer, possibly plus an operand.  "Next" pointers of
++ * all nodes except BRANCH implement concatenation; a "next" pointer with
++ * a BRANCH on both ends of it is connecting two alternatives.  (Here we
++ * have one of the subtle syntax dependencies:  an individual BRANCH (as
++ * opposed to a collection of them) is never concatenated with anything
++ * because of operator precedence.)  The operand of some types of node is
++ * a literal string; for others, it is a node leading into a sub-FSM.  In
++ * particular, the operand of a BRANCH node is the first node of the branch.
++ * (NB this is *not* a tree structure:  the tail of the branch connects
++ * to the thing following the set of BRANCHes.)  The opcodes are:
++ */
++
++/* definition number  opnd?   meaning */
++#define       END     0       /* no   End of program. */
++#define       BOL     1       /* no   Match "" at beginning of line. */
++#define       EOL     2       /* no   Match "" at end of line. */
++#define       ANY     3       /* no   Match any one character. */
++#define       ANYOF   4       /* str  Match any character in this string. */
++#define       ANYBUT  5       /* str  Match any character not in this string. */
++#define       BRANCH  6       /* node Match this alternative, or the next... */
++#define       BACK    7       /* no   Match "", "next" ptr points backward. */
++#define       EXACTLY 8       /* str  Match this string. */
++#define       NOTHING 9       /* no   Match empty string. */
++#define       STAR    10      /* node Match this (simple) thing 0 or more times. */
++#define       PLUS    11      /* node Match this (simple) thing 1 or more times. */
++#define       OPEN    20      /* no   Mark this point in input as start of #n. */
++                      /*      OPEN+1 is number 1, etc. */
++#define       CLOSE   30      /* no   Analogous to OPEN. */
++
++/*
++ * Opcode notes:
++ *
++ * BRANCH     The set of branches constituting a single choice are hooked
++ *            together with their "next" pointers, since precedence prevents
++ *            anything being concatenated to any individual branch.  The
++ *            "next" pointer of the last BRANCH in a choice points to the
++ *            thing following the whole choice.  This is also where the
++ *            final "next" pointer of each individual branch points; each
++ *            branch starts with the operand node of a BRANCH node.
++ *
++ * BACK               Normal "next" pointers all implicitly point forward; BACK
++ *            exists to make loop structures possible.
++ *
++ * STAR,PLUS  '?', and complex '*' and '+', are implemented as circular
++ *            BRANCH structures using BACK.  Simple cases (one character
++ *            per match) are implemented with STAR and PLUS for speed
++ *            and to minimize recursive plunges.
++ *
++ * OPEN,CLOSE ...are numbered at compile time.
++ */
++
++/*
++ * A node is one char of opcode followed by two chars of "next" pointer.
++ * "Next" pointers are stored as two 8-bit pieces, high order first.  The
++ * value is a positive offset from the opcode of the node containing it.
++ * An operand, if any, simply follows the node.  (Note that much of the
++ * code generation knows about this implicit relationship.)
++ *
++ * Using two bytes for the "next" pointer is vast overkill for most things,
++ * but allows patterns to get big without disasters.
++ */
++#define       OP(p)   (*(p))
++#define       NEXT(p) (((*((p)+1)&0377)<<8) + (*((p)+2)&0377))
++#define       OPERAND(p)      ((p) + 3)
++
++/*
++ * See regmagic.h for one further detail of program structure.
++ */
++
++
++/*
++ * Utility definitions.
++ */
++#ifndef CHARBITS
++#define       UCHARAT(p)      ((int)*(unsigned char *)(p))
++#else
++#define       UCHARAT(p)      ((int)*(p)&CHARBITS)
++#endif
++
++#define       FAIL(m) { regerror(m); return(NULL); }
++#define       ISMULT(c)       ((c) == '*' || (c) == '+' || (c) == '?')
++#define       META    "^$.[()|?+*\\"
++
++/*
++ * Flags to be passed up and down.
++ */
++#define       HASWIDTH        01      /* Known never to match null string. */
++#define       SIMPLE          02      /* Simple enough to be STAR/PLUS operand. */
++#define       SPSTART         04      /* Starts with * or +. */
++#define       WORST           0       /* Worst case. */
++
++/*
++ * Global work variables for regcomp().
++ */
++struct match_globals {
++char *reginput;               /* String-input pointer. */
++char *regbol;         /* Beginning of input, for ^ check. */
++char **regstartp;     /* Pointer to startp array. */
++char **regendp;               /* Ditto for endp. */
++char *regparse;               /* Input-scan pointer. */
++int regnpar;          /* () count. */
++char regdummy;
++char *regcode;                /* Code-emit pointer; &regdummy = don't. */
++long regsize;         /* Code size. */
++};
++
++/*
++ * Forward declarations for regcomp()'s friends.
++ */
++#ifndef STATIC
++#define       STATIC  static
++#endif
++STATIC char *reg(struct match_globals *g, int paren,int *flagp);
++STATIC char *regbranch(struct match_globals *g, int *flagp);
++STATIC char *regpiece(struct match_globals *g, int *flagp);
++STATIC char *regatom(struct match_globals *g, int *flagp);
++STATIC char *regnode(struct match_globals *g, char op);
++STATIC char *regnext(struct match_globals *g, char *p);
++STATIC void regc(struct match_globals *g, char b);
++STATIC void reginsert(struct match_globals *g, char op, char *opnd);
++STATIC void regtail(struct match_globals *g, char *p, char *val);
++STATIC void regoptail(struct match_globals *g, char *p, char *val);
++
++
++__kernel_size_t my_strcspn(const char *s1,const char *s2)
++{
++        char *scan1;
++        char *scan2;
++        int count;
++
++        count = 0;
++        for (scan1 = (char *)s1; *scan1 != '\0'; scan1++) {
++                for (scan2 = (char *)s2; *scan2 != '\0';)       /* ++ moved down. */
++                        if (*scan1 == *scan2++)
++                                return(count);
++                count++;
++        }
++        return(count);
++}
++
++/*
++ - regcomp - compile a regular expression into internal code
++ *
++ * We can't allocate space until we know how big the compiled form will be,
++ * but we can't compile it (and thus know how big it is) until we've got a
++ * place to put the code.  So we cheat:  we compile it twice, once with code
++ * generation turned off and size counting turned on, and once "for real".
++ * This also means that we don't allocate space until we are sure that the
++ * thing really will compile successfully, and we never have to move the
++ * code and thus invalidate pointers into it.  (Note that it has to be in
++ * one piece because free() must be able to free it all.)
++ *
++ * Beware that the optimization-preparation code in here knows about some
++ * of the structure of the compiled regexp.
++ */
++regexp *
++regcomp(char *exp,int *patternsize)
++{
++      register regexp *r;
++      register char *scan;
++      register char *longest;
++      register int len;
++      int flags;
++      struct match_globals g;
++      
++      /* commented out by ethan
++         extern char *malloc();
++      */
++
++      if (exp == NULL)
++              FAIL("NULL argument");
++
++      /* First pass: determine size, legality. */
++      g.regparse = exp;
++      g.regnpar = 1;
++      g.regsize = 0L;
++      g.regcode = &g.regdummy;
++      regc(&g, MAGIC);
++      if (reg(&g, 0, &flags) == NULL)
++              return(NULL);
++
++      /* Small enough for pointer-storage convention? */
++      if (g.regsize >= 32767L)                /* Probably could be 65535L. */
++              FAIL("regexp too big");
++
++      /* Allocate space. */
++      *patternsize=sizeof(regexp) + (unsigned)g.regsize;
++      r = (regexp *)malloc(sizeof(regexp) + (unsigned)g.regsize);
++      if (r == NULL)
++              FAIL("out of space");
++
++      /* Second pass: emit code. */
++      g.regparse = exp;
++      g.regnpar = 1;
++      g.regcode = r->program;
++      regc(&g, MAGIC);
++      if (reg(&g, 0, &flags) == NULL)
++              return(NULL);
++
++      /* Dig out information for optimizations. */
++      r->regstart = '\0';     /* Worst-case defaults. */
++      r->reganch = 0;
++      r->regmust = NULL;
++      r->regmlen = 0;
++      scan = r->program+1;                    /* First BRANCH. */
++      if (OP(regnext(&g, scan)) == END) {             /* Only one top-level choice. */
++              scan = OPERAND(scan);
++
++              /* Starting-point info. */
++              if (OP(scan) == EXACTLY)
++                      r->regstart = *OPERAND(scan);
++              else if (OP(scan) == BOL)
++                      r->reganch++;
++
++              /*
++               * If there's something expensive in the r.e., find the
++               * longest literal string that must appear and make it the
++               * regmust.  Resolve ties in favor of later strings, since
++               * the regstart check works with the beginning of the r.e.
++               * and avoiding duplication strengthens checking.  Not a
++               * strong reason, but sufficient in the absence of others.
++               */
++              if (flags&SPSTART) {
++                      longest = NULL;
++                      len = 0;
++                      for (; scan != NULL; scan = regnext(&g, scan))
++                              if (OP(scan) == EXACTLY && strlen(OPERAND(scan)) >= len) {
++                                      longest = OPERAND(scan);
++                                      len = strlen(OPERAND(scan));
++                              }
++                      r->regmust = longest;
++                      r->regmlen = len;
++              }
++      }
++
++      return(r);
++}
++
++/*
++ - reg - regular expression, i.e. main body or parenthesized thing
++ *
++ * Caller must absorb opening parenthesis.
++ *
++ * Combining parenthesis handling with the base level of regular expression
++ * is a trifle forced, but the need to tie the tails of the branches to what
++ * follows makes it hard to avoid.
++ */
++static char *
++reg(struct match_globals *g, int paren, int *flagp /* Parenthesized? */ )
++{
++      register char *ret;
++      register char *br;
++      register char *ender;
++      register int parno = 0; /* 0 makes gcc happy */
++      int flags;
++
++      *flagp = HASWIDTH;      /* Tentatively. */
++
++      /* Make an OPEN node, if parenthesized. */
++      if (paren) {
++              if (g->regnpar >= NSUBEXP)
++                      FAIL("too many ()");
++              parno = g->regnpar;
++              g->regnpar++;
++              ret = regnode(g, OPEN+parno);
++      } else
++              ret = NULL;
++
++      /* Pick up the branches, linking them together. */
++      br = regbranch(g, &flags);
++      if (br == NULL)
++              return(NULL);
++      if (ret != NULL)
++              regtail(g, ret, br);    /* OPEN -> first. */
++      else
++              ret = br;
++      if (!(flags&HASWIDTH))
++              *flagp &= ~HASWIDTH;
++      *flagp |= flags&SPSTART;
++      while (*g->regparse == '|') {
++              g->regparse++;
++              br = regbranch(g, &flags);
++              if (br == NULL)
++                      return(NULL);
++              regtail(g, ret, br);    /* BRANCH -> BRANCH. */
++              if (!(flags&HASWIDTH))
++                      *flagp &= ~HASWIDTH;
++              *flagp |= flags&SPSTART;
++      }
++
++      /* Make a closing node, and hook it on the end. */
++      ender = regnode(g, (paren) ? CLOSE+parno : END);        
++      regtail(g, ret, ender);
++
++      /* Hook the tails of the branches to the closing node. */
++      for (br = ret; br != NULL; br = regnext(g, br))
++              regoptail(g, br, ender);
++
++      /* Check for proper termination. */
++      if (paren && *g->regparse++ != ')') {
++              FAIL("unmatched ()");
++      } else if (!paren && *g->regparse != '\0') {
++              if (*g->regparse == ')') {
++                      FAIL("unmatched ()");
++              } else
++                      FAIL("junk on end");    /* "Can't happen". */
++              /* NOTREACHED */
++      }
++
++      return(ret);
++}
++
++/*
++ - regbranch - one alternative of an | operator
++ *
++ * Implements the concatenation operator.
++ */
++static char *
++regbranch(struct match_globals *g, int *flagp)
++{
++      register char *ret;
++      register char *chain;
++      register char *latest;
++      int flags;
++
++      *flagp = WORST;         /* Tentatively. */
++
++      ret = regnode(g, BRANCH);
++      chain = NULL;
++      while (*g->regparse != '\0' && *g->regparse != '|' && *g->regparse != ')') {
++              latest = regpiece(g, &flags);
++              if (latest == NULL)
++                      return(NULL);
++              *flagp |= flags&HASWIDTH;
++              if (chain == NULL)      /* First piece. */
++                      *flagp |= flags&SPSTART;
++              else
++                      regtail(g, chain, latest);
++              chain = latest;
++      }
++      if (chain == NULL)      /* Loop ran zero times. */
++              (void) regnode(g, NOTHING);
++
++      return(ret);
++}
++
++/*
++ - regpiece - something followed by possible [*+?]
++ *
++ * Note that the branching code sequences used for ? and the general cases
++ * of * and + are somewhat optimized:  they use the same NOTHING node as
++ * both the endmarker for their branch list and the body of the last branch.
++ * It might seem that this node could be dispensed with entirely, but the
++ * endmarker role is not redundant.
++ */
++static char *
++regpiece(struct match_globals *g, int *flagp)
++{
++      register char *ret;
++      register char op;
++      register char *next;
++      int flags;
++
++      ret = regatom(g, &flags);
++      if (ret == NULL)
++              return(NULL);
++
++      op = *g->regparse;
++      if (!ISMULT(op)) {
++              *flagp = flags;
++              return(ret);
++      }
++
++      if (!(flags&HASWIDTH) && op != '?')
++              FAIL("*+ operand could be empty");
++      *flagp = (op != '+') ? (WORST|SPSTART) : (WORST|HASWIDTH);
++
++      if (op == '*' && (flags&SIMPLE))
++              reginsert(g, STAR, ret);
++      else if (op == '*') {
++              /* Emit x* as (x&|), where & means "self". */
++              reginsert(g, BRANCH, ret);                      /* Either x */
++              regoptail(g, ret, regnode(g, BACK));            /* and loop */
++              regoptail(g, ret, ret);                 /* back */
++              regtail(g, ret, regnode(g, BRANCH));            /* or */
++              regtail(g, ret, regnode(g, NOTHING));           /* null. */
++      } else if (op == '+' && (flags&SIMPLE))
++              reginsert(g, PLUS, ret);
++      else if (op == '+') {
++              /* Emit x+ as x(&|), where & means "self". */
++              next = regnode(g, BRANCH);                      /* Either */
++              regtail(g, ret, next);
++              regtail(g, regnode(g, BACK), ret);              /* loop back */
++              regtail(g, next, regnode(g, BRANCH));           /* or */
++              regtail(g, ret, regnode(g, NOTHING));           /* null. */
++      } else if (op == '?') {
++              /* Emit x? as (x|) */
++              reginsert(g, BRANCH, ret);                      /* Either x */
++              regtail(g, ret, regnode(g, BRANCH));            /* or */
++              next = regnode(g, NOTHING);             /* null. */
++              regtail(g, ret, next);
++              regoptail(g, ret, next);
++      }
++      g->regparse++;
++      if (ISMULT(*g->regparse))
++              FAIL("nested *?+");
++
++      return(ret);
++}
++
++/*
++ - regatom - the lowest level
++ *
++ * Optimization:  gobbles an entire sequence of ordinary characters so that
++ * it can turn them into a single node, which is smaller to store and
++ * faster to run.  Backslashed characters are exceptions, each becoming a
++ * separate node; the code is simpler that way and it's not worth fixing.
++ */
++static char *
++regatom(struct match_globals *g, int *flagp)
++{
++      register char *ret;
++      int flags;
++
++      *flagp = WORST;         /* Tentatively. */
++
++      switch (*g->regparse++) {
++      case '^':
++              ret = regnode(g, BOL);
++              break;
++      case '$':
++              ret = regnode(g, EOL);
++              break;
++      case '.':
++              ret = regnode(g, ANY);
++              *flagp |= HASWIDTH|SIMPLE;
++              break;
++      case '[': {
++                      register int class;
++                      register int classend;
++
++                      if (*g->regparse == '^') {      /* Complement of range. */
++                              ret = regnode(g, ANYBUT);
++                              g->regparse++;
++                      } else
++                              ret = regnode(g, ANYOF);
++                      if (*g->regparse == ']' || *g->regparse == '-')
++                              regc(g, *g->regparse++);
++                      while (*g->regparse != '\0' && *g->regparse != ']') {
++                              if (*g->regparse == '-') {
++                                      g->regparse++;
++                                      if (*g->regparse == ']' || *g->regparse == '\0')
++                                              regc(g, '-');
++                                      else {
++                                              class = UCHARAT(g->regparse-2)+1;
++                                              classend = UCHARAT(g->regparse);
++                                              if (class > classend+1)
++                                                      FAIL("invalid [] range");
++                                              for (; class <= classend; class++)
++                                                      regc(g, class);
++                                              g->regparse++;
++                                      }
++                              } else
++                                      regc(g, *g->regparse++);
++                      }
++                      regc(g, '\0');
++                      if (*g->regparse != ']')
++                              FAIL("unmatched []");
++                      g->regparse++;
++                      *flagp |= HASWIDTH|SIMPLE;
++              }
++              break;
++      case '(':
++              ret = reg(g, 1, &flags);
++              if (ret == NULL)
++                      return(NULL);
++              *flagp |= flags&(HASWIDTH|SPSTART);
++              break;
++      case '\0':
++      case '|':
++      case ')':
++              FAIL("internal urp");   /* Supposed to be caught earlier. */
++              break;
++      case '?':
++      case '+':
++      case '*':
++              FAIL("?+* follows nothing");
++              break;
++      case '\\':
++              if (*g->regparse == '\0')
++                      FAIL("trailing \\");
++              ret = regnode(g, EXACTLY);
++              regc(g, *g->regparse++);
++              regc(g, '\0');
++              *flagp |= HASWIDTH|SIMPLE;
++              break;
++      default: {
++                      register int len;
++                      register char ender;
++
++                      g->regparse--;
++                      len = my_strcspn((const char *)g->regparse, (const char *)META);
++                      if (len <= 0)
++                              FAIL("internal disaster");
++                      ender = *(g->regparse+len);
++                      if (len > 1 && ISMULT(ender))
++                              len--;          /* Back off clear of ?+* operand. */
++                      *flagp |= HASWIDTH;
++                      if (len == 1)
++                              *flagp |= SIMPLE;
++                      ret = regnode(g, EXACTLY);
++                      while (len > 0) {
++                              regc(g, *g->regparse++);
++                              len--;
++                      }
++                      regc(g, '\0');
++              }
++              break;
++      }
++
++      return(ret);
++}
++
++/*
++ - regnode - emit a node
++ */
++static char *                 /* Location. */
++regnode(struct match_globals *g, char op)
++{
++      register char *ret;
++      register char *ptr;
++
++      ret = g->regcode;
++      if (ret == &g->regdummy) {
++              g->regsize += 3;
++              return(ret);
++      }
++
++      ptr = ret;
++      *ptr++ = op;
++      *ptr++ = '\0';          /* Null "next" pointer. */
++      *ptr++ = '\0';
++      g->regcode = ptr;
++
++      return(ret);
++}
++
++/*
++ - regc - emit (if appropriate) a byte of code
++ */
++static void
++regc(struct match_globals *g, char b)
++{
++      if (g->regcode != &g->regdummy)
++              *g->regcode++ = b;
++      else
++              g->regsize++;
++}
++
++/*
++ - reginsert - insert an operator in front of already-emitted operand
++ *
++ * Means relocating the operand.
++ */
++static void
++reginsert(struct match_globals *g, char op, char* opnd)
++{
++      register char *src;
++      register char *dst;
++      register char *place;
++
++      if (g->regcode == &g->regdummy) {
++              g->regsize += 3;
++              return;
++      }
++
++      src = g->regcode;
++      g->regcode += 3;
++      dst = g->regcode;
++      while (src > opnd)
++              *--dst = *--src;
++
++      place = opnd;           /* Op node, where operand used to be. */
++      *place++ = op;
++      *place++ = '\0';
++      *place++ = '\0';
++}
++
++/*
++ - regtail - set the next-pointer at the end of a node chain
++ */
++static void
++regtail(struct match_globals *g, char *p, char *val)
++{
++      register char *scan;
++      register char *temp;
++      register int offset;
++
++      if (p == &g->regdummy)
++              return;
++
++      /* Find last node. */
++      scan = p;
++      for (;;) {
++              temp = regnext(g, scan);
++              if (temp == NULL)
++                      break;
++              scan = temp;
++      }
++
++      if (OP(scan) == BACK)
++              offset = scan - val;
++      else
++              offset = val - scan;
++      *(scan+1) = (offset>>8)&0377;
++      *(scan+2) = offset&0377;
++}
++
++/*
++ - regoptail - regtail on operand of first argument; nop if operandless
++ */
++static void
++regoptail(struct match_globals *g, char *p, char *val)
++{
++      /* "Operandless" and "op != BRANCH" are synonymous in practice. */
++      if (p == NULL || p == &g->regdummy || OP(p) != BRANCH)
++              return;
++      regtail(g, OPERAND(p), val);
++}
++
++/*
++ * regexec and friends
++ */
++
++
++/*
++ * Forwards.
++ */
++STATIC int regtry(struct match_globals *g, regexp *prog, char *string);
++STATIC int regmatch(struct match_globals *g, char *prog);
++STATIC int regrepeat(struct match_globals *g, char *p);
++
++#ifdef DEBUG
++int regnarrate = 0;
++void regdump();
++STATIC char *regprop(char *op);
++#endif
++
++/*
++ - regexec - match a regexp against a string
++ */
++int
++regexec(regexp *prog, char *string)
++{
++      register char *s;
++      struct match_globals g;
++
++      /* Be paranoid... */
++      if (prog == NULL || string == NULL) {
++              printk("<3>Regexp: NULL parameter\n");
++              return(0);
++      }
++
++      /* Check validity of program. */
++      if (UCHARAT(prog->program) != MAGIC) {
++              printk("<3>Regexp: corrupted program\n");
++              return(0);
++      }
++
++      /* If there is a "must appear" string, look for it. */
++      if (prog->regmust != NULL) {
++              s = string;
++              while ((s = strchr(s, prog->regmust[0])) != NULL) {
++                      if (strncmp(s, prog->regmust, prog->regmlen) == 0)
++                              break;  /* Found it. */
++                      s++;
++              }
++              if (s == NULL)  /* Not present. */
++                      return(0);
++      }
++
++      /* Mark beginning of line for ^ . */
++      g.regbol = string;
++
++      /* Simplest case:  anchored match need be tried only once. */
++      if (prog->reganch)
++              return(regtry(&g, prog, string));
++
++      /* Messy cases:  unanchored match. */
++      s = string;
++      if (prog->regstart != '\0')
++              /* We know what char it must start with. */
++              while ((s = strchr(s, prog->regstart)) != NULL) {
++                      if (regtry(&g, prog, s))
++                              return(1);
++                      s++;
++              }
++      else
++              /* We don't -- general case. */
++              do {
++                      if (regtry(&g, prog, s))
++                              return(1);
++              } while (*s++ != '\0');
++
++      /* Failure. */
++      return(0);
++}
++
++/*
++ - regtry - try match at specific point
++ */
++static int                    /* 0 failure, 1 success */
++regtry(struct match_globals *g, regexp *prog, char *string)
++{
++      register int i;
++      register char **sp;
++      register char **ep;
++
++      g->reginput = string;
++      g->regstartp = prog->startp;
++      g->regendp = prog->endp;
++
++      sp = prog->startp;
++      ep = prog->endp;
++      for (i = NSUBEXP; i > 0; i--) {
++              *sp++ = NULL;
++              *ep++ = NULL;
++      }
++      if (regmatch(g, prog->program + 1)) {
++              prog->startp[0] = string;
++              prog->endp[0] = g->reginput;
++              return(1);
++      } else
++              return(0);
++}
++
++/*
++ - regmatch - main matching routine
++ *
++ * Conceptually the strategy is simple:  check to see whether the current
++ * node matches, call self recursively to see whether the rest matches,
++ * and then act accordingly.  In practice we make some effort to avoid
++ * recursion, in particular by going through "ordinary" nodes (that don't
++ * need to know whether the rest of the match failed) by a loop instead of
++ * by recursion.
++ */
++static int                    /* 0 failure, 1 success */
++regmatch(struct match_globals *g, char *prog)
++{
++      register char *scan = prog; /* Current node. */
++      char *next;                 /* Next node. */
++
++#ifdef DEBUG
++      if (scan != NULL && regnarrate)
++              fprintf(stderr, "%s(\n", regprop(scan));
++#endif
++      while (scan != NULL) {
++#ifdef DEBUG
++              if (regnarrate)
++                      fprintf(stderr, "%s...\n", regprop(scan));
++#endif
++              next = regnext(g, scan);
++
++              switch (OP(scan)) {
++              case BOL:
++                      if (g->reginput != g->regbol)
++                              return(0);
++                      break;
++              case EOL:
++                      if (*g->reginput != '\0')
++                              return(0);
++                      break;
++              case ANY:
++                      if (*g->reginput == '\0')
++                              return(0);
++                      g->reginput++;
++                      break;
++              case EXACTLY: {
++                              register int len;
++                              register char *opnd;
++
++                              opnd = OPERAND(scan);
++                              /* Inline the first character, for speed. */
++                              if (*opnd != *g->reginput)
++                                      return(0);
++                              len = strlen(opnd);
++                              if (len > 1 && strncmp(opnd, g->reginput, len) != 0)
++                                      return(0);
++                              g->reginput += len;
++                      }
++                      break;
++              case ANYOF:
++                      if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) == NULL)
++                              return(0);
++                      g->reginput++;
++                      break;
++              case ANYBUT:
++                      if (*g->reginput == '\0' || strchr(OPERAND(scan), *g->reginput) != NULL)
++                              return(0);
++                      g->reginput++;
++                      break;
++              case NOTHING:
++              case BACK:
++                      break;
++              case OPEN+1:
++              case OPEN+2:
++              case OPEN+3:
++              case OPEN+4:
++              case OPEN+5:
++              case OPEN+6:
++              case OPEN+7:
++              case OPEN+8:
++              case OPEN+9: {
++                              register int no;
++                              register char *save;
++
++                              no = OP(scan) - OPEN;
++                              save = g->reginput;
++
++                              if (regmatch(g, next)) {
++                                      /*
++                                       * Don't set startp if some later
++                                       * invocation of the same parentheses
++                                       * already has.
++                                       */
++                                      if (g->regstartp[no] == NULL)
++                                              g->regstartp[no] = save;
++                                      return(1);
++                              } else
++                                      return(0);
++                      }
++                      break;
++              case CLOSE+1:
++              case CLOSE+2:
++              case CLOSE+3:
++              case CLOSE+4:
++              case CLOSE+5:
++              case CLOSE+6:
++              case CLOSE+7:
++              case CLOSE+8:
++              case CLOSE+9:
++                      {
++                              register int no;
++                              register char *save;
++
++                              no = OP(scan) - CLOSE;
++                              save = g->reginput;
++
++                              if (regmatch(g, next)) {
++                                      /*
++                                       * Don't set endp if some later
++                                       * invocation of the same parentheses
++                                       * already has.
++                                       */
++                                      if (g->regendp[no] == NULL)
++                                              g->regendp[no] = save;
++                                      return(1);
++                              } else
++                                      return(0);
++                      }
++                      break;
++              case BRANCH: {
++                              register char *save;
++
++                              if (OP(next) != BRANCH)         /* No choice. */
++                                      next = OPERAND(scan);   /* Avoid recursion. */
++                              else {
++                                      do {
++                                              save = g->reginput;
++                                              if (regmatch(g, OPERAND(scan)))
++                                                      return(1);
++                                              g->reginput = save;
++                                              scan = regnext(g, scan);
++                                      } while (scan != NULL && OP(scan) == BRANCH);
++                                      return(0);
++                                      /* NOTREACHED */
++                              }
++                      }
++                      break;
++              case STAR:
++              case PLUS: {
++                              register char nextch;
++                              register int no;
++                              register char *save;
++                              register int min;
++
++                              /*
++                               * Lookahead to avoid useless match attempts
++                               * when we know what character comes next.
++                               */
++                              nextch = '\0';
++                              if (OP(next) == EXACTLY)
++                                      nextch = *OPERAND(next);
++                              min = (OP(scan) == STAR) ? 0 : 1;
++                              save = g->reginput;
++                              no = regrepeat(g, OPERAND(scan));
++                              while (no >= min) {
++                                      /* If it could work, try it. */
++                                      if (nextch == '\0' || *g->reginput == nextch)
++                                              if (regmatch(g, next))
++                                                      return(1);
++                                      /* Couldn't or didn't -- back up. */
++                                      no--;
++                                      g->reginput = save + no;
++                              }
++                              return(0);
++                      }
++                      break;
++              case END:
++                      return(1);      /* Success! */
++                      break;
++              default:
++                      printk("<3>Regexp: memory corruption\n");
++                      return(0);
++                      break;
++              }
++
++              scan = next;
++      }
++
++      /*
++       * We get here only if there's trouble -- normally "case END" is
++       * the terminating point.
++       */
++      printk("<3>Regexp: corrupted pointers\n");
++      return(0);
++}
++
++/*
++ - regrepeat - repeatedly match something simple, report how many
++ */
++static int
++regrepeat(struct match_globals *g, char *p)
++{
++      register int count = 0;
++      register char *scan;
++      register char *opnd;
++
++      scan = g->reginput;
++      opnd = OPERAND(p);
++      switch (OP(p)) {
++      case ANY:
++              count = strlen(scan);
++              scan += count;
++              break;
++      case EXACTLY:
++              while (*opnd == *scan) {
++                      count++;
++                      scan++;
++              }
++              break;
++      case ANYOF:
++              while (*scan != '\0' && strchr(opnd, *scan) != NULL) {
++                      count++;
++                      scan++;
++              }
++              break;
++      case ANYBUT:
++              while (*scan != '\0' && strchr(opnd, *scan) == NULL) {
++                      count++;
++                      scan++;
++              }
++              break;
++      default:                /* Oh dear.  Called inappropriately. */
++              printk("<3>Regexp: internal foulup\n");
++              count = 0;      /* Best compromise. */
++              break;
++      }
++      g->reginput = scan;
++
++      return(count);
++}
++
++/*
++ - regnext - dig the "next" pointer out of a node
++ */
++static char*
++regnext(struct match_globals *g, char *p)
++{
++      register int offset;
++
++      if (p == &g->regdummy)
++              return(NULL);
++
++      offset = NEXT(p);
++      if (offset == 0)
++              return(NULL);
++
++      if (OP(p) == BACK)
++              return(p-offset);
++      else
++              return(p+offset);
++}
++
++#ifdef DEBUG
++
++STATIC char *regprop();
++
++/*
++ - regdump - dump a regexp onto stdout in vaguely comprehensible form
++ */
++void
++regdump(regexp *r)
++{
++      register char *s;
++      register char op = EXACTLY;     /* Arbitrary non-END op. */
++      register char *next;
++      /* extern char *strchr(); */
++
++
++      s = r->program + 1;
++      while (op != END) {     /* While that wasn't END last time... */
++              op = OP(s);
++              printf("%2d%s", s-r->program, regprop(s));      /* Where, what. */
++              next = regnext(s);
++              if (next == NULL)               /* Next ptr. */
++                      printf("(0)");
++              else
++                      printf("(%d)", (s-r->program)+(next-s));
++              s += 3;
++              if (op == ANYOF || op == ANYBUT || op == EXACTLY) {
++                      /* Literal string, where present. */
++                      while (*s != '\0') {
++                              putchar(*s);
++                              s++;
++                      }
++                      s++;
++              }
++              putchar('\n');
++      }
++
++      /* Header fields of interest. */
++      if (r->regstart != '\0')
++              printf("start `%c' ", r->regstart);
++      if (r->reganch)
++              printf("anchored ");
++      if (r->regmust != NULL)
++              printf("must have \"%s\"", r->regmust);
++      printf("\n");
++}
++
++/*
++ - regprop - printable representation of opcode
++ */
++static char *
++regprop(char *op)
++{
++#define BUFLEN 50
++      register char *p;
++      static char buf[BUFLEN];
++
++      strcpy(buf, ":");
++
++      switch (OP(op)) {
++      case BOL:
++              p = "BOL";
++              break;
++      case EOL:
++              p = "EOL";
++              break;
++      case ANY:
++              p = "ANY";
++              break;
++      case ANYOF:
++              p = "ANYOF";
++              break;
++      case ANYBUT:
++              p = "ANYBUT";
++              break;
++      case BRANCH:
++              p = "BRANCH";
++              break;
++      case EXACTLY:
++              p = "EXACTLY";
++              break;
++      case NOTHING:
++              p = "NOTHING";
++              break;
++      case BACK:
++              p = "BACK";
++              break;
++      case END:
++              p = "END";
++              break;
++      case OPEN+1:
++      case OPEN+2:
++      case OPEN+3:
++      case OPEN+4:
++      case OPEN+5:
++      case OPEN+6:
++      case OPEN+7:
++      case OPEN+8:
++      case OPEN+9:
++              snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "OPEN%d", OP(op)-OPEN);
++              p = NULL;
++              break;
++      case CLOSE+1:
++      case CLOSE+2:
++      case CLOSE+3:
++      case CLOSE+4:
++      case CLOSE+5:
++      case CLOSE+6:
++      case CLOSE+7:
++      case CLOSE+8:
++      case CLOSE+9:
++              snprintf(buf+strlen(buf),BUFLEN-strlen(buf), "CLOSE%d", OP(op)-CLOSE);
++              p = NULL;
++              break;
++      case STAR:
++              p = "STAR";
++              break;
++      case PLUS:
++              p = "PLUS";
++              break;
++      default:
++              printk("<3>Regexp: corrupted opcode\n");
++              break;
++      }
++      if (p != NULL)
++              strncat(buf, p, BUFLEN-strlen(buf));
++      return(buf);
++}
++#endif
++
++
+diff --git a/net/netfilter/regexp/regexp.h b/net/netfilter/regexp/regexp.h
+new file mode 100644
+index 000000000000..a72eba71fb61
+--- /dev/null
++++ b/net/netfilter/regexp/regexp.h
+@@ -0,0 +1,41 @@
++/*
++ * Definitions etc. for regexp(3) routines.
++ *
++ * Caveat:  this is V8 regexp(3) [actually, a reimplementation thereof],
++ * not the System V one.
++ */
++
++#ifndef REGEXP_H
++#define REGEXP_H
++
++
++/*
++http://www.opensource.apple.com/darwinsource/10.3/expect-1/expect/expect.h ,
++which contains a version of this library, says:
++
++ *
++ * NSUBEXP must be at least 10, and no greater than 117 or the parser
++ * will not work properly.
++ *
++
++However, it looks rather like this library is limited to 10.  If you think
++otherwise, let us know.
++*/
++
++#define NSUBEXP  10
++typedef struct regexp {
++      char *startp[NSUBEXP];
++      char *endp[NSUBEXP];
++      char regstart;          /* Internal use only. */
++      char reganch;           /* Internal use only. */
++      char *regmust;          /* Internal use only. */
++      int regmlen;            /* Internal use only. */
++      char program[1];        /* Unwarranted chumminess with compiler. */
++} regexp;
++
++regexp * regcomp(char *exp, int *patternsize);
++int regexec(regexp *prog, char *string);
++void regsub(regexp *prog, char *source, char *dest);
++void regerror(char *s);
++
++#endif
+diff --git a/net/netfilter/regexp/regmagic.h b/net/netfilter/regexp/regmagic.h
+new file mode 100644
+index 000000000000..5acf4478ff71
+--- /dev/null
++++ b/net/netfilter/regexp/regmagic.h
+@@ -0,0 +1,5 @@
++/*
++ * The first byte of the regexp internal "program" is actually this magic
++ * number; the start node begins in the second byte.
++ */
++#define       MAGIC   0234
+diff --git a/net/netfilter/regexp/regsub.c b/net/netfilter/regexp/regsub.c
+new file mode 100644
+index 000000000000..339631f06f00
+--- /dev/null
++++ b/net/netfilter/regexp/regsub.c
+@@ -0,0 +1,95 @@
++/*
++ * regsub
++ * @(#)regsub.c       1.3 of 2 April 86
++ *
++ *    Copyright (c) 1986 by University of Toronto.
++ *    Written by Henry Spencer.  Not derived from licensed software.
++ *
++ *    Permission is granted to anyone to use this software for any
++ *    purpose on any computer system, and to redistribute it freely,
++ *    subject to the following restrictions:
++ *
++ *    1. The author is not responsible for the consequences of use of
++ *            this software, no matter how awful, even if they arise
++ *            from defects in it.
++ *
++ *    2. The origin of this software must not be misrepresented, either
++ *            by explicit claim or by omission.
++ *
++ *    3. Altered versions must be plainly marked as such, and must not
++ *            be misrepresented as being the original software.
++ *
++ *
++ * This code was modified by Ethan Sommer to work within the kernel
++ * (it now uses kmalloc etc..)
++ *
++ */
++#include "regexp.h"
++#include "regmagic.h"
++#include <linux/string.h>
++
++
++#ifndef CHARBITS
++#define       UCHARAT(p)      ((int)*(unsigned char *)(p))
++#else
++#define       UCHARAT(p)      ((int)*(p)&CHARBITS)
++#endif
++
++#if 0
++//void regerror(char * s)
++//{
++//        printk("regexp(3): %s", s);
++//        /* NOTREACHED */
++//}
++#endif
++
++/*
++ - regsub - perform substitutions after a regexp match
++ */
++void
++regsub(regexp * prog, char * source, char * dest)
++{
++      register char *src;
++      register char *dst;
++      register char c;
++      register int no;
++      register int len;
++      
++      /* Not necessary and gcc doesn't like it -MLS */
++      /*extern char *strncpy();*/
++
++      if (prog == NULL || source == NULL || dest == NULL) {
++              regerror("NULL parm to regsub");
++              return;
++      }
++      if (UCHARAT(prog->program) != MAGIC) {
++              regerror("damaged regexp fed to regsub");
++              return;
++      }
++
++      src = source;
++      dst = dest;
++      while ((c = *src++) != '\0') {
++              if (c == '&')
++                      no = 0;
++              else if (c == '\\' && '0' <= *src && *src <= '9')
++                      no = *src++ - '0';
++              else
++                      no = -1;
++
++              if (no < 0) {   /* Ordinary character. */
++                      if (c == '\\' && (*src == '\\' || *src == '&'))
++                              c = *src++;
++                      *dst++ = c;
++              } else if (prog->startp[no] != NULL && prog->endp[no] != NULL) {
++                      len = prog->endp[no] - prog->startp[no];
++                      (void) strncpy(dst, prog->startp[no], len);
++                      dst += len;
++                      if (len != 0 && *(dst-1) == '\0') {     /* strncpy hit NUL. */
++                              regerror("damaged match string");
++                              return;
++                      }
++              }
++      }
++      *dst++ = '\0';
++}
+diff --git a/net/netfilter/xt_layer7.c b/net/netfilter/xt_layer7.c
+new file mode 100644
+index 000000000000..af449055bc1c
+--- /dev/null
++++ b/net/netfilter/xt_layer7.c
+@@ -0,0 +1,658 @@
++/*
++  Kernel module to match application layer (OSI layer 7) data in connections.
++
++  http://l7-filter.sf.net
++
++  (C) 2003-2009 Matthew Strait and Ethan Sommer.
++
++  This program is free software; you can redistribute it and/or
++  modify it under the terms of the GNU General Public License
++  as published by the Free Software Foundation; either version
++  2 of the License, or (at your option) any later version.
++  http://www.gnu.org/licenses/gpl.txt
++
++  Based on ipt_string.c (C) 2000 Emmanuel Roger <winfield@freegates.be>,
++  xt_helper.c (C) 2002 Harald Welte and cls_layer7.c (C) 2003 Matthew Strait,
++  Ethan Sommer, Justin Levandoski.
++*/
++
++#include <linux/spinlock.h>
++#include <linux/version.h>
++#include <net/ip.h>
++#include <net/tcp.h>
++#include <linux/module.h>
++#include <linux/skbuff.h>
++#include <linux/netfilter.h>
++#include <net/netfilter/nf_conntrack.h>
++#include <net/netfilter/nf_conntrack_core.h>
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
++#include <net/netfilter/nf_conntrack_extend.h>
++#include <net/netfilter/nf_conntrack_acct.h>
++#endif
++#include <linux/netfilter/x_tables.h>
++#include <linux/netfilter/xt_layer7.h>
++#include <linux/ctype.h>
++#include <linux/proc_fs.h>
++
++#include "regexp/regexp.c"
++
++MODULE_LICENSE("GPL");
++MODULE_AUTHOR("Matthew Strait <quadong@users.sf.net>, Ethan Sommer <sommere@users.sf.net>");
++MODULE_DESCRIPTION("iptables application layer match module");
++MODULE_ALIAS("ipt_layer7");
++MODULE_VERSION("2.23");
++
++static int maxdatalen = 2048; // this is the default
++module_param(maxdatalen, int, 0444);
++MODULE_PARM_DESC(maxdatalen, "maximum bytes of data looked at by l7-filter");
++#ifdef CONFIG_NETFILTER_XT_MATCH_LAYER7_DEBUG
++      #define DPRINTK(format,args...) printk(format,##args)
++#else
++      #define DPRINTK(format,args...)
++#endif
++
++/* Number of packets whose data we look at.
++This can be modified through /proc/net/layer7_numpackets */
++static int num_packets = 10;
++
++static struct pattern_cache {
++      char * regex_string;
++      regexp * pattern;
++      struct pattern_cache * next;
++} * first_pattern_cache = NULL;
++
++DEFINE_SPINLOCK(l7_lock);
++
++static int total_acct_packets(struct nf_conn *ct)
++{
++#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 26)
++      BUG_ON(ct == NULL);
++      return (ct->counters[IP_CT_DIR_ORIGINAL].packets + ct->counters[IP_CT_DIR_REPLY].packets);
++#else
++      struct nf_conn_counter *acct;
++
++      BUG_ON(ct == NULL);
++      acct = nf_conn_acct_find(ct);
++      if (!acct)
++              return 0;
++        return (atomic64_read(&acct[IP_CT_DIR_ORIGINAL].packets) + atomic64_read(&acct[IP_CT_DIR_REPLY].packets));
++#endif
++}
++
++#ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
++/* Converts an unfriendly string into a friendly one by
++replacing unprintables with periods and all whitespace with " ". */
++static char * friendly_print(unsigned char * s)
++{
++      char * f = kmalloc(strlen(s) + 1, GFP_ATOMIC);
++      int i;
++
++      if(!f) {
++              if (net_ratelimit())
++                      printk(KERN_ERR "layer7: out of memory in "
++                                      "friendly_print, bailing.\n");
++              return NULL;
++      }
++
++      for(i = 0; i < strlen(s); i++){
++              if(isprint(s[i]) && s[i] < 128) f[i] = s[i];
++              else if(isspace(s[i]))          f[i] = ' ';
++              else                            f[i] = '.';
++      }
++      f[i] = '\0';
++      return f;
++}
++
++static char dec2hex(int i)
++{
++      switch (i) {
++              case 0 ... 9:
++                      return (i + '0');
++                      break;
++              case 10 ... 15:
++                      return (i - 10 + 'a');
++                      break;
++              default:
++                      if (net_ratelimit())
++                              printk("layer7: Problem in dec2hex\n");
++                      return '\0';
++      }
++}
++
++static char * hex_print(unsigned char * s)
++{
++      char * g = kmalloc(strlen(s)*3 + 1, GFP_ATOMIC);
++      int i;
++
++      if(!g) {
++             if (net_ratelimit())
++                      printk(KERN_ERR "layer7: out of memory in hex_print, "
++                                      "bailing.\n");
++             return NULL;
++      }
++
++      for(i = 0; i < strlen(s); i++) {
++              g[i*3    ] = dec2hex(s[i]/16);
++              g[i*3 + 1] = dec2hex(s[i]%16);
++              g[i*3 + 2] = ' ';
++      }
++      g[i*3] = '\0';
++
++      return g;
++}
++#endif // DEBUG
++
++/* Use instead of regcomp.  As we expect to be seeing the same regexps over and
++over again, it make sense to cache the results. */
++static regexp * compile_and_cache(const char * regex_string, 
++                                  const char * protocol)
++{
++      struct pattern_cache * node               = first_pattern_cache;
++      struct pattern_cache * last_pattern_cache = first_pattern_cache;
++      struct pattern_cache * tmp;
++      unsigned int len;
++
++      while (node != NULL) {
++              if (!strcmp(node->regex_string, regex_string))
++              return node->pattern;
++
++              last_pattern_cache = node;/* points at the last non-NULL node */
++              node = node->next;
++      }
++
++      /* If we reach the end of the list, then we have not yet cached
++         the pattern for this regex. Let's do that now.
++         Be paranoid about running out of memory to avoid list corruption. */
++      tmp = kmalloc(sizeof(struct pattern_cache), GFP_ATOMIC);
++
++      if(!tmp) {
++              if (net_ratelimit())
++                      printk(KERN_ERR "layer7: out of memory in "
++                                      "compile_and_cache, bailing.\n");
++              return NULL;
++      }
++
++      tmp->regex_string  = kmalloc(strlen(regex_string) + 1, GFP_ATOMIC);
++      tmp->pattern       = kmalloc(sizeof(struct regexp),    GFP_ATOMIC);
++      tmp->next = NULL;
++
++      if(!tmp->regex_string || !tmp->pattern) {
++              if (net_ratelimit())
++                      printk(KERN_ERR "layer7: out of memory in "
++                                      "compile_and_cache, bailing.\n");
++              kfree(tmp->regex_string);
++              kfree(tmp->pattern);
++              kfree(tmp);
++              return NULL;
++      }
++
++      /* Ok.  The new node is all ready now. */
++      node = tmp;
++
++      if(first_pattern_cache == NULL) /* list is empty */
++              first_pattern_cache = node; /* make node the beginning */
++      else
++              last_pattern_cache->next = node; /* attach node to the end */
++
++      /* copy the string and compile the regex */
++      len = strlen(regex_string);
++      DPRINTK("About to compile this: \"%s\"\n", regex_string);
++      node->pattern = regcomp((char *)regex_string, &len);
++      if ( !node->pattern ) {
++              if (net_ratelimit())
++                      printk(KERN_ERR "layer7: Error compiling regexp "
++                                      "\"%s\" (%s)\n", 
++                                      regex_string, protocol);
++              /* pattern is now cached as NULL, so we won't try again. */
++      }
++
++      strcpy(node->regex_string, regex_string);
++      return node->pattern;
++}
++
++static int can_handle(const struct sk_buff *skb)
++{
++      if(!ip_hdr(skb)) /* not IP */
++              return 0;
++      if(ip_hdr(skb)->protocol != IPPROTO_TCP &&
++         ip_hdr(skb)->protocol != IPPROTO_UDP &&
++         ip_hdr(skb)->protocol != IPPROTO_ICMP)
++              return 0;
++      return 1;
++}
++
++/* Returns offset the into the skb->data that the application data starts */
++static int app_data_offset(const struct sk_buff *skb)
++{
++      /* In case we are ported somewhere (ebtables?) where ip_hdr(skb)
++      isn't set, this can be gotten from 4*(skb->data[0] & 0x0f) as well. */
++      int ip_hl = 4*ip_hdr(skb)->ihl;
++
++      if( ip_hdr(skb)->protocol == IPPROTO_TCP ) {
++              /* 12 == offset into TCP header for the header length field.
++              Can't get this with skb->h.th->doff because the tcphdr
++              struct doesn't get set when routing (this is confirmed to be
++              true in Netfilter as well as QoS.) */
++              int tcp_hl = 4*(skb->data[ip_hl + 12] >> 4);
++
++              return ip_hl + tcp_hl;
++      } else if( ip_hdr(skb)->protocol == IPPROTO_UDP  ) {
++              return ip_hl + 8; /* UDP header is always 8 bytes */
++      } else if( ip_hdr(skb)->protocol == IPPROTO_ICMP ) {
++              return ip_hl + 8; /* ICMP header is 8 bytes */
++      } else {
++              if (net_ratelimit())
++                      printk(KERN_ERR "layer7: tried to handle unknown "
++                                      "protocol!\n");
++              return ip_hl + 8; /* something reasonable */
++      }
++}
++
++/* handles whether there's a match when we aren't appending data anymore */
++static int match_no_append(struct nf_conn * conntrack, 
++                           struct nf_conn * master_conntrack, 
++                           enum ip_conntrack_info ctinfo,
++                           enum ip_conntrack_info master_ctinfo,
++                           const struct xt_layer7_info * info)
++{
++      /* If we're in here, throw the app data away */
++      if(master_conntrack->layer7.app_data != NULL) {
++
++      #ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
++              if(!master_conntrack->layer7.app_proto) {
++                      char * f = 
++                        friendly_print(master_conntrack->layer7.app_data);
++                      char * g = 
++                        hex_print(master_conntrack->layer7.app_data);
++                      DPRINTK("\nl7-filter gave up after %d bytes "
++                              "(%d packets):\n%s\n",
++                              strlen(f), total_acct_packets(master_conntrack), f);
++                      kfree(f);
++                      DPRINTK("In hex: %s\n", g);
++                      kfree(g);
++              }
++      #endif
++
++              kfree(master_conntrack->layer7.app_data);
++              master_conntrack->layer7.app_data = NULL; /* don't free again */
++      }
++
++      if(master_conntrack->layer7.app_proto){
++              /* Here child connections set their .app_proto (for /proc) */
++              if(!conntrack->layer7.app_proto) {
++                      conntrack->layer7.app_proto = 
++                        kmalloc(strlen(master_conntrack->layer7.app_proto)+1, 
++                          GFP_ATOMIC);
++                      if(!conntrack->layer7.app_proto){
++                              if (net_ratelimit())
++                                      printk(KERN_ERR "layer7: out of memory "
++                                                      "in match_no_append, "
++                                                      "bailing.\n");
++                              return 1;
++                      }
++                      strcpy(conntrack->layer7.app_proto, 
++                              master_conntrack->layer7.app_proto);
++              }
++
++              return (!strcmp(master_conntrack->layer7.app_proto, 
++                              info->protocol));
++      }
++      else {
++              /* If not classified, set to "unknown" to distinguish from
++              connections that are still being tested. */
++              master_conntrack->layer7.app_proto = 
++                      kmalloc(strlen("unknown")+1, GFP_ATOMIC);
++              if(!master_conntrack->layer7.app_proto){
++                      if (net_ratelimit())
++                              printk(KERN_ERR "layer7: out of memory in "
++                                              "match_no_append, bailing.\n");
++                      return 1;
++              }
++              strcpy(master_conntrack->layer7.app_proto, "unknown");
++              return 0;
++      }
++}
++
++/* add the new app data to the conntrack.  Return number of bytes added. */
++static int add_data(struct nf_conn * master_conntrack,
++                    char * app_data, int appdatalen)
++{
++      int length = 0, i;
++      int oldlength = master_conntrack->layer7.app_data_len;
++
++      /* This is a fix for a race condition by Deti Fliegl. However, I'm not 
++         clear on whether the race condition exists or whether this really 
++         fixes it.  I might just be being dense... Anyway, if it's not really 
++         a fix, all it does is waste a very small amount of time. */
++      if(!master_conntrack->layer7.app_data) return 0;
++
++      /* Strip nulls. Make everything lower case (our regex lib doesn't
++      do case insensitivity).  Add it to the end of the current data. */
++      for(i = 0; i < maxdatalen-oldlength-1 &&
++                 i < appdatalen; i++) {
++              if(app_data[i] != '\0') {
++                      /* the kernel version of tolower mungs 'upper ascii' */
++                      master_conntrack->layer7.app_data[length+oldlength] =
++                              isascii(app_data[i])? 
++                                      tolower(app_data[i]) : app_data[i];
++                      length++;
++              }
++      }
++
++      master_conntrack->layer7.app_data[length+oldlength] = '\0';
++      master_conntrack->layer7.app_data_len = length + oldlength;
++
++      return length;
++}
++
++/* taken from drivers/video/modedb.c */
++static int my_atoi(const char *s)
++{
++      int val = 0;
++
++      for (;; s++) {
++              switch (*s) {
++                      case '0'...'9':
++                      val = 10*val+(*s-'0');
++                      break;
++              default:
++                      return val;
++              }
++      }
++}
++
++static int layer7_numpackets_proc_show(struct seq_file *s, void *p) {
++      seq_printf(s, "%d\n", num_packets);
++
++      return 0;
++}
++
++static int layer7_numpackets_proc_open(struct inode *inode, struct file *file) {
++      return single_open(file, layer7_numpackets_proc_show, NULL);
++}
++
++/* Read in num_packets from userland */
++static ssize_t layer7_numpackets_write_proc(struct file* file, const char __user *buffer,
++              size_t count, loff_t *data) {
++      char value[1024];
++      int new_num_packets;
++
++      if (copy_from_user(&value, buffer, sizeof(value)))
++              return -EFAULT;
++
++      new_num_packets = my_atoi(value);
++
++      if ((new_num_packets < 1) || (new_num_packets > 99)) {
++              printk(KERN_WARNING "layer7: numpackets must be between 1 and 99\n");
++              return -EFAULT;
++      }
++
++      num_packets = new_num_packets;
++
++      return count;
++}
++
++static bool
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
++match(const struct sk_buff *skbin, struct xt_action_param *par)
++#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
++match(const struct sk_buff *skbin, const struct xt_match_param *par)
++#else
++match(const struct sk_buff *skbin,
++      const struct net_device *in,
++      const struct net_device *out,
++      const struct xt_match *match,
++      const void *matchinfo,
++      int offset,
++      unsigned int protoff,
++      bool *hotdrop)
++#endif
++{
++      /* sidestep const without getting a compiler warning... */
++      struct sk_buff * skb = (struct sk_buff *)skbin; 
++
++      const struct xt_layer7_info * info = 
++      #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
++              par->matchinfo;
++      #else
++              matchinfo;
++      #endif
++
++      enum ip_conntrack_info master_ctinfo, ctinfo;
++      struct nf_conn *master_conntrack, *conntrack;
++      unsigned char * app_data;
++      unsigned int pattern_result, appdatalen;
++      regexp * comppattern;
++
++      /* Be paranoid/incompetent - lock the entire match function. */
++      spin_lock_bh(&l7_lock);
++
++      if(!can_handle(skb)){
++              DPRINTK("layer7: This is some protocol I can't handle.\n");
++              spin_unlock_bh(&l7_lock);
++              return info->invert;
++      }
++
++      /* Treat parent & all its children together as one connection, except
++      for the purpose of setting conntrack->layer7.app_proto in the actual
++      connection. This makes /proc/net/ip_conntrack more satisfying. */
++      if(!(conntrack = nf_ct_get(skb, &ctinfo)) ||
++         !(master_conntrack=nf_ct_get(skb,&master_ctinfo))){
++              DPRINTK("layer7: couldn't get conntrack.\n");
++              spin_unlock_bh(&l7_lock);
++              return info->invert;
++      }
++
++      /* Try to get a master conntrack (and its master etc) for FTP, etc. */
++      while (master_ct(master_conntrack) != NULL)
++              master_conntrack = master_ct(master_conntrack);
++
++      /* if we've classified it or seen too many packets */
++      if(total_acct_packets(master_conntrack) > num_packets ||
++         master_conntrack->layer7.app_proto) {
++
++              pattern_result = match_no_append(conntrack, master_conntrack, 
++                                               ctinfo, master_ctinfo, info);
++
++              /* skb->cb[0] == seen. Don't do things twice if there are 
++              multiple l7 rules. I'm not sure that using cb for this purpose 
++              is correct, even though it says "put your private variables 
++              there". But it doesn't look like it is being used for anything
++              else in the skbs that make it here. */
++              skb->cb[0] = 1; /* marking it seen here's probably irrelevant */
++
++              spin_unlock_bh(&l7_lock);
++              return (pattern_result ^ info->invert);
++      }
++
++      if(skb_is_nonlinear(skb)){
++              if(skb_linearize(skb) != 0){
++                      if (net_ratelimit())
++                              printk(KERN_ERR "layer7: failed to linearize "
++                                              "packet, bailing.\n");
++                      spin_unlock_bh(&l7_lock);
++                      return info->invert;
++              }
++      }
++
++      /* now that the skb is linearized, it's safe to set these. */
++      app_data = skb->data + app_data_offset(skb);
++      appdatalen = skb_tail_pointer(skb) - app_data;
++
++      /* the return value gets checked later, when we're ready to use it */
++      comppattern = compile_and_cache(info->pattern, info->protocol);
++
++      /* On the first packet of a connection, allocate space for app data */
++      if(total_acct_packets(master_conntrack) == 1 && !skb->cb[0] && 
++         !master_conntrack->layer7.app_data){
++              master_conntrack->layer7.app_data = 
++                      kmalloc(maxdatalen, GFP_ATOMIC);
++              if(!master_conntrack->layer7.app_data){
++                      if (net_ratelimit())
++                              printk(KERN_ERR "layer7: out of memory in "
++                                              "match, bailing.\n");
++                      spin_unlock_bh(&l7_lock);
++                      return info->invert;
++              }
++
++              master_conntrack->layer7.app_data[0] = '\0';
++      }
++
++      /* Can be here, but unallocated, if numpackets is increased near
++      the beginning of a connection */
++      if(master_conntrack->layer7.app_data == NULL){
++              spin_unlock_bh(&l7_lock);
++              return info->invert; /* unmatched */
++      }
++
++      if(!skb->cb[0]){
++              int newbytes;
++              newbytes = add_data(master_conntrack, app_data, appdatalen);
++
++              if(newbytes == 0) { /* didn't add any data */
++                      skb->cb[0] = 1;
++                      /* Didn't match before, not going to match now */
++                      spin_unlock_bh(&l7_lock);
++                      return info->invert;
++              }
++      }
++
++      /* If looking for "unknown", then never match.  "Unknown" means that
++      we've given up; we're still trying with these packets. */
++      if(!strcmp(info->protocol, "unknown")) {
++              pattern_result = 0;
++      /* If looking for "unset", then always match. "Unset" means that we
++      haven't yet classified the connection. */
++      } else if(!strcmp(info->protocol, "unset")) {
++              pattern_result = 2;
++              DPRINTK("layer7: matched unset: not yet classified "
++                      "(%d/%d packets)\n",
++                        total_acct_packets(master_conntrack), num_packets);
++      /* If the regexp failed to compile, don't bother running it */
++      } else if(comppattern && 
++                regexec(comppattern, master_conntrack->layer7.app_data)){
++              DPRINTK("layer7: matched %s\n", info->protocol);
++              pattern_result = 1;
++      } else pattern_result = 0;
++
++      if(pattern_result == 1) {
++              master_conntrack->layer7.app_proto = 
++                      kmalloc(strlen(info->protocol)+1, GFP_ATOMIC);
++              if(!master_conntrack->layer7.app_proto){
++                      if (net_ratelimit())
++                              printk(KERN_ERR "layer7: out of memory in "
++                                              "match, bailing.\n");
++                      spin_unlock_bh(&l7_lock);
++                      return (pattern_result ^ info->invert);
++              }
++              strcpy(master_conntrack->layer7.app_proto, info->protocol);
++      } else if(pattern_result > 1) { /* cleanup from "unset" */
++              pattern_result = 1;
++      }
++
++      /* mark the packet seen */
++      skb->cb[0] = 1;
++
++      spin_unlock_bh(&l7_lock);
++      return (pattern_result ^ info->invert);
++}
++
++// load nf_conntrack_ipv4
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
++static int
++#else
++static bool
++#endif
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
++check(const struct xt_mtchk_param *par)
++{
++        if (nf_ct_l3proto_try_module_get(par->match->family) < 0) {
++                printk(KERN_WARNING "can't load conntrack support for "
++                                    "proto=%d\n", par->match->family);
++#else
++check(const char *tablename, const void *inf,
++               const struct xt_match *match, void *matchinfo,
++               unsigned int hook_mask)
++{
++        if (nf_ct_l3proto_try_module_get(match->family) < 0) {
++                printk(KERN_WARNING "can't load conntrack support for "
++                                    "proto=%d\n", match->family);
++#endif
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
++              return -EINVAL;
++      }
++      return 0;
++#else
++                return 0;
++        }
++      return 1;
++#endif
++}
++
++
++#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 28)
++      static void destroy(const struct xt_mtdtor_param *par)
++      {
++              nf_ct_l3proto_module_put(par->match->family);
++      }
++#else
++      static void destroy(const struct xt_match *match, void *matchinfo)
++      {
++              nf_ct_l3proto_module_put(match->family);
++      }
++#endif
++
++static struct xt_match xt_layer7_match[] __read_mostly = {
++{
++      .name           = "layer7",
++      .family         = AF_INET,
++      .checkentry     = check,
++      .match          = match,
++      .destroy        = destroy,
++      .matchsize      = sizeof(struct xt_layer7_info),
++      .me             = THIS_MODULE
++}
++};
++
++static const struct file_operations layer7_numpackets_proc_fops = {
++      .owner   = THIS_MODULE,
++      .open    = layer7_numpackets_proc_open,
++      .read    = seq_read,
++      .llseek  = seq_lseek,
++      .release = single_release,
++      .write   = layer7_numpackets_write_proc,
++};
++
++static int __init xt_layer7_init(void)
++{
++      need_conntrack();
++
++      // Register proc interface
++      proc_create_data("layer7_numpackets", 0644,
++              init_net.proc_net, &layer7_numpackets_proc_fops, NULL);
++
++      if(maxdatalen < 1) {
++              printk(KERN_WARNING "layer7: maxdatalen can't be < 1, "
++                      "using 1\n");
++              maxdatalen = 1;
++      }
++      /* This is not a hard limit.  It's just here to prevent people from
++      bringing their slow machines to a grinding halt. */
++      else if(maxdatalen > 65536) {
++              printk(KERN_WARNING "layer7: maxdatalen can't be > 65536, "
++                      "using 65536\n");
++              maxdatalen = 65536;
++      }
++      return xt_register_matches(xt_layer7_match,
++                                 ARRAY_SIZE(xt_layer7_match));
++}
++
++static void __exit xt_layer7_fini(void)
++{
++      remove_proc_entry("layer7_numpackets", init_net.proc_net);
++      xt_unregister_matches(xt_layer7_match, ARRAY_SIZE(xt_layer7_match));
++}
++
++module_init(xt_layer7_init);
++module_exit(xt_layer7_fini);
++
+-- 
+2.30.2
+
+
+From b4a90d4a5283cb33b84998adf6cff7236dd0ee78 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Mon, 6 Mar 2017 08:50:15 +0100
+Subject: [PATCH 02/11] netfilter: layer7 fix wrong fuzzy match change
+
+patch has applied one hunk to a wrong place.
+This result in double free and crash the kernel.
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ net/netfilter/nf_conntrack_core.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
+index 1357a2729a4b..7cf2b36ca40c 100644
+--- a/net/netfilter/nf_conntrack_core.c
++++ b/net/netfilter/nf_conntrack_core.c
+@@ -601,6 +601,13 @@ void nf_ct_destroy(struct nf_conntrack *nfct)
+        */
+       nf_ct_remove_expectations(ct);
++#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
++      if(ct->layer7.app_proto)
++              kfree(ct->layer7.app_proto);
++      if(ct->layer7.app_data)
++              kfree(ct->layer7.app_data);
++#endif
++
+       if (ct->master)
+               nf_ct_put(ct->master);
+-- 
+2.30.2
+
+
+From f0ca5e10262f989e103d1a09f19df0bc5253e5fa Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Mon, 6 Mar 2017 08:54:01 +0100
+Subject: [PATCH 03/11] netfilter: layer7 change proto to NFPROTO_IPV4
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ net/netfilter/xt_layer7.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/netfilter/xt_layer7.c b/net/netfilter/xt_layer7.c
+index af449055bc1c..becbec0e8f9d 100644
+--- a/net/netfilter/xt_layer7.c
++++ b/net/netfilter/xt_layer7.c
+@@ -605,7 +605,7 @@ check(const char *tablename, const void *inf,
+ static struct xt_match xt_layer7_match[] __read_mostly = {
+ {
+       .name           = "layer7",
+-      .family         = AF_INET,
++      .family         = NFPROTO_IPV4,
+       .checkentry     = check,
+       .match          = match,
+       .destroy        = destroy,
+-- 
+2.30.2
+
+
+From b2277fb1e1d78881295f73e3f4ac8fcfe0ab0e4f Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Mon, 6 Mar 2017 09:15:09 +0100
+Subject: [PATCH 04/11] netfilter: layer7: ct memory optimization
+
+The original code reserves new memory for every ct entry
+for the protocol name.
+Now the strings are cached and all ct entries points to the
+same strings in the cace.
+This use less memory if many connections are there.
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ net/netfilter/nf_conntrack_core.c |  2 -
+ net/netfilter/xt_layer7.c         | 93 ++++++++++++++++++++-----------
+ 2 files changed, 59 insertions(+), 36 deletions(-)
+
+diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c
+index 7cf2b36ca40c..e0a4be0abce5 100644
+--- a/net/netfilter/nf_conntrack_core.c
++++ b/net/netfilter/nf_conntrack_core.c
+@@ -602,8 +602,6 @@ void nf_ct_destroy(struct nf_conntrack *nfct)
+       nf_ct_remove_expectations(ct);
+ #if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
+-      if(ct->layer7.app_proto)
+-              kfree(ct->layer7.app_proto);
+       if(ct->layer7.app_data)
+               kfree(ct->layer7.app_data);
+ #endif
+diff --git a/net/netfilter/xt_layer7.c b/net/netfilter/xt_layer7.c
+index becbec0e8f9d..ddf7fecc05c1 100644
+--- a/net/netfilter/xt_layer7.c
++++ b/net/netfilter/xt_layer7.c
+@@ -37,10 +37,10 @@
+ #include "regexp/regexp.c"
+ MODULE_LICENSE("GPL");
+-MODULE_AUTHOR("Matthew Strait <quadong@users.sf.net>, Ethan Sommer <sommere@users.sf.net>");
++MODULE_AUTHOR("Matthew Strait <quadong@users.sf.net>, Ethan Sommer <sommere@users.sf.net>, Arne Fitzenreiter <arne_f@ipfire.org>");
+ MODULE_DESCRIPTION("iptables application layer match module");
+ MODULE_ALIAS("ipt_layer7");
+-MODULE_VERSION("2.23");
++MODULE_VERSION("2.30");
+ static int maxdatalen = 2048; // this is the default
+ module_param(maxdatalen, int, 0444);
+@@ -61,6 +61,11 @@ static struct pattern_cache {
+       struct pattern_cache * next;
+ } * first_pattern_cache = NULL;
++static struct proto_cache {
++      char * proto_string;
++      struct proto_cache * next;
++} * first_proto_cache = NULL;
++
+ DEFINE_SPINLOCK(l7_lock);
+ static int total_acct_packets(struct nf_conn *ct)
+@@ -210,6 +215,55 @@ static regexp * compile_and_cache(const char * regex_string,
+       return node->pattern;
+ }
++static char * get_protostr_ptr(const char * protocol)
++{
++      struct proto_cache * node             = first_proto_cache;
++      struct proto_cache * last_proto_cache = first_proto_cache;
++      struct proto_cache * tmp;
++
++      while (node != NULL) {
++              if (!strcmp(node->proto_string, protocol))
++              return node->proto_string;
++
++              last_proto_cache = node;/* points at the last non-NULL node */
++              node = node->next;
++      }
++
++      /* If we reach the end of the list, then we have not yet cached protocol
++         Be paranoid about running out of memory to avoid list corruption. */
++      tmp = kmalloc(sizeof(struct proto_cache), GFP_ATOMIC);
++
++      if(!tmp) {
++              if (net_ratelimit())
++                      printk(KERN_ERR "layer7: out of memory in "
++                                      "proto_cache add, bailing.\n");
++              return NULL;
++      }
++
++      tmp->proto_string = kmalloc(strlen(protocol) + 1   , GFP_ATOMIC);
++      tmp->next = NULL;
++
++      if(!tmp->proto_string) {
++              if (net_ratelimit())
++                      printk(KERN_ERR "layer7: out of memory in "
++                                      "proto_cache add, bailing.\n");
++              kfree(tmp->proto_string);
++              kfree(tmp);
++              return NULL;
++      }
++
++      /* Ok.  The new node is all ready now. */
++      node = tmp;
++
++      if(first_proto_cache == NULL) /* list is empty */
++              first_proto_cache = node; /* make node the beginning */
++      else
++              last_proto_cache->next = node; /* attach node to the end */
++
++      strcpy(node->proto_string, protocol);
++      return node->proto_string;
++}
++
+ static int can_handle(const struct sk_buff *skb)
+ {
+       if(!ip_hdr(skb)) /* not IP */
+@@ -280,18 +334,7 @@ static int match_no_append(struct nf_conn * conntrack,
+       if(master_conntrack->layer7.app_proto){
+               /* Here child connections set their .app_proto (for /proc) */
+               if(!conntrack->layer7.app_proto) {
+-                      conntrack->layer7.app_proto = 
+-                        kmalloc(strlen(master_conntrack->layer7.app_proto)+1, 
+-                          GFP_ATOMIC);
+-                      if(!conntrack->layer7.app_proto){
+-                              if (net_ratelimit())
+-                                      printk(KERN_ERR "layer7: out of memory "
+-                                                      "in match_no_append, "
+-                                                      "bailing.\n");
+-                              return 1;
+-                      }
+-                      strcpy(conntrack->layer7.app_proto, 
+-                              master_conntrack->layer7.app_proto);
++                      conntrack->layer7.app_proto = master_conntrack->layer7.app_proto;
+               }
+               return (!strcmp(master_conntrack->layer7.app_proto, 
+@@ -300,15 +343,7 @@ static int match_no_append(struct nf_conn * conntrack,
+       else {
+               /* If not classified, set to "unknown" to distinguish from
+               connections that are still being tested. */
+-              master_conntrack->layer7.app_proto = 
+-                      kmalloc(strlen("unknown")+1, GFP_ATOMIC);
+-              if(!master_conntrack->layer7.app_proto){
+-                      if (net_ratelimit())
+-                              printk(KERN_ERR "layer7: out of memory in "
+-                                              "match_no_append, bailing.\n");
+-                      return 1;
+-              }
+-              strcpy(master_conntrack->layer7.app_proto, "unknown");
++              master_conntrack->layer7.app_proto = get_protostr_ptr("unknown");
+               return 0;
+       }
+ }
+@@ -508,7 +543,6 @@ match(const struct sk_buff *skbin,
+       if(!skb->cb[0]){
+               int newbytes;
+               newbytes = add_data(master_conntrack, app_data, appdatalen);
+-
+               if(newbytes == 0) { /* didn't add any data */
+                       skb->cb[0] = 1;
+                       /* Didn't match before, not going to match now */
+@@ -536,16 +570,7 @@ match(const struct sk_buff *skbin,
+       } else pattern_result = 0;
+       if(pattern_result == 1) {
+-              master_conntrack->layer7.app_proto = 
+-                      kmalloc(strlen(info->protocol)+1, GFP_ATOMIC);
+-              if(!master_conntrack->layer7.app_proto){
+-                      if (net_ratelimit())
+-                              printk(KERN_ERR "layer7: out of memory in "
+-                                              "match, bailing.\n");
+-                      spin_unlock_bh(&l7_lock);
+-                      return (pattern_result ^ info->invert);
+-              }
+-              strcpy(master_conntrack->layer7.app_proto, info->protocol);
++              master_conntrack->layer7.app_proto=get_protostr_ptr(info->protocol);
+       } else if(pattern_result > 1) { /* cleanup from "unset" */
+               pattern_result = 1;
+       }
+-- 
+2.30.2
+
+
+From 41745a08e9ca3e08f62a4ddd4602d9e79b0705ce Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Fri, 10 Mar 2017 00:50:26 +0100
+Subject: [PATCH 05/11] netfiler: layer7 don't use skb->cb for l7-seen flag
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ include/linux/skbuff.h    |  3 +++
+ net/netfilter/xt_layer7.c | 15 +++++----------
+ 2 files changed, 8 insertions(+), 10 deletions(-)
+
+diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
+index 18e163a3460d..4e67e8a73d6b 100644
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -883,6 +883,9 @@ struct sk_buff {
+ #if defined(CONFIG_NF_CONNTRACK) || defined(CONFIG_NF_CONNTRACK_MODULE)
+       unsigned long            _nfct;
++#endif
++#if defined(CONFIG_NETFILTER_XT_MATCH_LAYER7) || defined(CONFIG_NETFILTER_XT_MATCH_LAYER7_MODULE)
++      char                    layer7_flags[1];
+ #endif
+       unsigned int            len,
+                               data_len;
+diff --git a/net/netfilter/xt_layer7.c b/net/netfilter/xt_layer7.c
+index ddf7fecc05c1..bdbcd0fcfcda 100644
+--- a/net/netfilter/xt_layer7.c
++++ b/net/netfilter/xt_layer7.c
+@@ -489,12 +489,7 @@ match(const struct sk_buff *skbin,
+               pattern_result = match_no_append(conntrack, master_conntrack, 
+                                                ctinfo, master_ctinfo, info);
+-              /* skb->cb[0] == seen. Don't do things twice if there are 
+-              multiple l7 rules. I'm not sure that using cb for this purpose 
+-              is correct, even though it says "put your private variables 
+-              there". But it doesn't look like it is being used for anything
+-              else in the skbs that make it here. */
+-              skb->cb[0] = 1; /* marking it seen here's probably irrelevant */
++              skb->layer7_flags[0] = 1; /* marking it seen here's probably irrelevant */
+               spin_unlock_bh(&l7_lock);
+               return (pattern_result ^ info->invert);
+@@ -518,7 +513,7 @@ match(const struct sk_buff *skbin,
+       comppattern = compile_and_cache(info->pattern, info->protocol);
+       /* On the first packet of a connection, allocate space for app data */
+-      if(total_acct_packets(master_conntrack) == 1 && !skb->cb[0] && 
++      if(total_acct_packets(master_conntrack) == 1 && !skb->layer7_flags[0] && 
+          !master_conntrack->layer7.app_data){
+               master_conntrack->layer7.app_data = 
+                       kmalloc(maxdatalen, GFP_ATOMIC);
+@@ -540,11 +535,11 @@ match(const struct sk_buff *skbin,
+               return info->invert; /* unmatched */
+       }
+-      if(!skb->cb[0]){
++      if(!skb->layer7_flags[0]){
+               int newbytes;
+               newbytes = add_data(master_conntrack, app_data, appdatalen);
+               if(newbytes == 0) { /* didn't add any data */
+-                      skb->cb[0] = 1;
++                      skb->layer7_flags[0] = 1;
+                       /* Didn't match before, not going to match now */
+                       spin_unlock_bh(&l7_lock);
+                       return info->invert;
+@@ -576,7 +571,7 @@ match(const struct sk_buff *skbin,
+       }
+       /* mark the packet seen */
+-      skb->cb[0] = 1;
++      skb->layer7_flags[0] = 1;
+       spin_unlock_bh(&l7_lock);
+       return (pattern_result ^ info->invert);
+-- 
+2.30.2
+
+
+From 40cd905fdfa949e0fcfaff7e38cec2d5d7311899 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Sat, 11 Mar 2017 15:23:15 +0100
+Subject: [PATCH 06/11] netfilter: layer7 free unused conntrack memory if there
+ is a differnt master contrack
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ net/netfilter/xt_layer7.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/net/netfilter/xt_layer7.c b/net/netfilter/xt_layer7.c
+index bdbcd0fcfcda..da421c5f8eee 100644
+--- a/net/netfilter/xt_layer7.c
++++ b/net/netfilter/xt_layer7.c
+@@ -482,6 +482,15 @@ match(const struct sk_buff *skbin,
+       while (master_ct(master_conntrack) != NULL)
+               master_conntrack = master_ct(master_conntrack);
++      /* free unused conntrack data if different master conntrack exists */
++      if (master_conntrack != conntrack) {
++              if (conntrack->layer7.app_data) {
++                      DPRINTK("layer7: free unused conntrack memory.\n");
++                      kfree(conntrack->layer7.app_data);
++                      conntrack->layer7.app_data = NULL; /* don't free again */
++              }
++      }
++
+       /* if we've classified it or seen too many packets */
+       if(total_acct_packets(master_conntrack) > num_packets ||
+          master_conntrack->layer7.app_proto) {
+-- 
+2.30.2
+
+
+From 72dc3f1ae21344004bc3732da1f8f57dc9f22163 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Sun, 12 Mar 2017 14:33:26 +0100
+Subject: [PATCH 07/11] netfilter: layer7 use own packet counter
+
+sometimes ct has already seen more packets than the handled to
+the layer7 match and the detection was skipped too early.
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ include/net/netfilter/nf_conntrack.h |  1 +
+ net/netfilter/xt_layer7.c            | 34 +++++-----------------------
+ 2 files changed, 7 insertions(+), 28 deletions(-)
+
+diff --git a/include/net/netfilter/nf_conntrack.h b/include/net/netfilter/nf_conntrack.h
+index 7e67b38553dc..fecc0a5c4b04 100644
+--- a/include/net/netfilter/nf_conntrack.h
++++ b/include/net/netfilter/nf_conntrack.h
+@@ -134,6 +134,7 @@ struct nf_conn {
+                */
+               char *app_data;
+               unsigned int app_data_len;
++              unsigned int packets;
+       } layer7;
+ #endif
+diff --git a/net/netfilter/xt_layer7.c b/net/netfilter/xt_layer7.c
+index da421c5f8eee..80460130083a 100644
+--- a/net/netfilter/xt_layer7.c
++++ b/net/netfilter/xt_layer7.c
+@@ -68,22 +68,6 @@ static struct proto_cache {
+ DEFINE_SPINLOCK(l7_lock);
+-static int total_acct_packets(struct nf_conn *ct)
+-{
+-#if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 26)
+-      BUG_ON(ct == NULL);
+-      return (ct->counters[IP_CT_DIR_ORIGINAL].packets + ct->counters[IP_CT_DIR_REPLY].packets);
+-#else
+-      struct nf_conn_counter *acct;
+-
+-      BUG_ON(ct == NULL);
+-      acct = nf_conn_acct_find(ct);
+-      if (!acct)
+-              return 0;
+-        return (atomic64_read(&acct[IP_CT_DIR_ORIGINAL].packets) + atomic64_read(&acct[IP_CT_DIR_REPLY].packets));
+-#endif
+-}
+-
+ #ifdef CONFIG_IP_NF_MATCH_LAYER7_DEBUG
+ /* Converts an unfriendly string into a friendly one by
+ replacing unprintables with periods and all whitespace with " ". */
+@@ -320,7 +304,7 @@ static int match_no_append(struct nf_conn * conntrack,
+                         hex_print(master_conntrack->layer7.app_data);
+                       DPRINTK("\nl7-filter gave up after %d bytes "
+                               "(%d packets):\n%s\n",
+-                              strlen(f), total_acct_packets(master_conntrack), f);
++                              strlen(f), master_conntrack->layer7.packets, f);
+                       kfree(f);
+                       DPRINTK("In hex: %s\n", g);
+                       kfree(g);
+@@ -492,7 +476,7 @@ match(const struct sk_buff *skbin,
+       }
+       /* if we've classified it or seen too many packets */
+-      if(total_acct_packets(master_conntrack) > num_packets ||
++      if( master_conntrack->layer7.packets >= num_packets ||
+          master_conntrack->layer7.app_proto) {
+               pattern_result = match_no_append(conntrack, master_conntrack, 
+@@ -521,8 +505,8 @@ match(const struct sk_buff *skbin,
+       /* the return value gets checked later, when we're ready to use it */
+       comppattern = compile_and_cache(info->pattern, info->protocol);
+-      /* On the first packet of a connection, allocate space for app data */
+-      if(total_acct_packets(master_conntrack) == 1 && !skb->layer7_flags[0] && 
++      /* allocate space for app data if not done */
++      if(master_conntrack->packets < num_packets && 
+          !master_conntrack->layer7.app_data){
+               master_conntrack->layer7.app_data = 
+                       kmalloc(maxdatalen, GFP_ATOMIC);
+@@ -537,15 +521,9 @@ match(const struct sk_buff *skbin,
+               master_conntrack->layer7.app_data[0] = '\0';
+       }
+-      /* Can be here, but unallocated, if numpackets is increased near
+-      the beginning of a connection */
+-      if(master_conntrack->layer7.app_data == NULL){
+-              spin_unlock_bh(&l7_lock);
+-              return info->invert; /* unmatched */
+-      }
+-
+       if(!skb->layer7_flags[0]){
+               int newbytes;
++              master_conntrack->layer7.packets++;
+               newbytes = add_data(master_conntrack, app_data, appdatalen);
+               if(newbytes == 0) { /* didn't add any data */
+                       skb->layer7_flags[0] = 1;
+@@ -565,7 +543,7 @@ match(const struct sk_buff *skbin,
+               pattern_result = 2;
+               DPRINTK("layer7: matched unset: not yet classified "
+                       "(%d/%d packets)\n",
+-                        total_acct_packets(master_conntrack), num_packets);
++                        master_conntrack->layer7.packets, num_packets);
+       /* If the regexp failed to compile, don't bother running it */
+       } else if(comppattern && 
+                 regexec(comppattern, master_conntrack->layer7.app_data)){
+-- 
+2.30.2
+
+
+From 2ac46369c13282ca274e7caa3719c9c876d1a3ce Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Tue, 14 Mar 2017 14:17:24 +0100
+Subject: [PATCH 08/11] netfilter: layer7 bugfix packet counter variable
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ net/netfilter/xt_layer7.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/netfilter/xt_layer7.c b/net/netfilter/xt_layer7.c
+index 80460130083a..db7d061dc8bf 100644
+--- a/net/netfilter/xt_layer7.c
++++ b/net/netfilter/xt_layer7.c
+@@ -506,7 +506,7 @@ match(const struct sk_buff *skbin,
+       comppattern = compile_and_cache(info->pattern, info->protocol);
+       /* allocate space for app data if not done */
+-      if(master_conntrack->packets < num_packets && 
++      if(master_conntrack->layer7.packets < num_packets && 
+          !master_conntrack->layer7.app_data){
+               master_conntrack->layer7.app_data = 
+                       kmalloc(maxdatalen, GFP_ATOMIC);
+-- 
+2.30.2
+
+
+From 14f1eb09490ee0c0105eda247b3f5cd2a2bbda82 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Wed, 14 Oct 2020 15:03:10 +0200
+Subject: [PATCH 09/11] netfilter: layer7: move xt_layer7.h to uapi
+
+this is needed to install this as userspace header for iptables compile.
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ include/{ => uapi}/linux/netfilter/xt_layer7.h | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+ rename include/{ => uapi}/linux/netfilter/xt_layer7.h (100%)
+
+diff --git a/include/linux/netfilter/xt_layer7.h b/include/uapi/linux/netfilter/xt_layer7.h
+similarity index 100%
+rename from include/linux/netfilter/xt_layer7.h
+rename to include/uapi/linux/netfilter/xt_layer7.h
+-- 
+2.30.2
+
+
+From e9012aadd1037ab84b4cf07547c2b74c6b95f594 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Wed, 14 Oct 2020 15:06:34 +0200
+Subject: [PATCH 10/11] netfilter: layer7: update proc api interface
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ net/netfilter/xt_layer7.c | 13 ++++++-------
+ 1 file changed, 6 insertions(+), 7 deletions(-)
+
+diff --git a/net/netfilter/xt_layer7.c b/net/netfilter/xt_layer7.c
+index db7d061dc8bf..565d2c99dcc5 100644
+--- a/net/netfilter/xt_layer7.c
++++ b/net/netfilter/xt_layer7.c
+@@ -621,13 +621,12 @@ static struct xt_match xt_layer7_match[] __read_mostly = {
+ }
+ };
+-static const struct file_operations layer7_numpackets_proc_fops = {
+-      .owner   = THIS_MODULE,
+-      .open    = layer7_numpackets_proc_open,
+-      .read    = seq_read,
+-      .llseek  = seq_lseek,
+-      .release = single_release,
+-      .write   = layer7_numpackets_write_proc,
++static const struct proc_ops layer7_numpackets_proc_fops = {
++      .proc_open    = layer7_numpackets_proc_open,
++      .proc_read    = seq_read,
++      .proc_lseek   = seq_lseek,
++      .proc_release = single_release,
++      .proc_write   = layer7_numpackets_write_proc,
+ };
+ static int __init xt_layer7_init(void)
+-- 
+2.30.2
+
+
+From 322c614e473d044ca1d94dd9b42f6924aa579c55 Mon Sep 17 00:00:00 2001
+From: Arne Fitzenreiter <arne_f@ipfire.org>
+Date: Wed, 14 Oct 2020 15:09:13 +0200
+Subject: [PATCH 11/11] netfilter: layer7: disable removed conntrack layer3
+ module handling
+
+this was removed with linux kernel 4.19.
+
+Signed-off-by: Arne Fitzenreiter <arne_f@ipfire.org>
+---
+ net/netfilter/xt_layer7.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/net/netfilter/xt_layer7.c b/net/netfilter/xt_layer7.c
+index 565d2c99dcc5..a7eb760123bf 100644
+--- a/net/netfilter/xt_layer7.c
++++ b/net/netfilter/xt_layer7.c
+@@ -564,6 +564,7 @@ match(const struct sk_buff *skbin,
+       return (pattern_result ^ info->invert);
+ }
++/*
+ // load nf_conntrack_ipv4
+ #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 35)
+ static int
+@@ -608,14 +609,15 @@ check(const char *tablename, const void *inf,
+               nf_ct_l3proto_module_put(match->family);
+       }
+ #endif
++*/
+ static struct xt_match xt_layer7_match[] __read_mostly = {
+ {
+       .name           = "layer7",
+       .family         = NFPROTO_IPV4,
+-      .checkentry     = check,
++//    .checkentry     = check,
+       .match          = match,
+-      .destroy        = destroy,
++//    .destroy        = destroy,
+       .matchsize      = sizeof(struct xt_layer7_info),
+       .me             = THIS_MODULE
+ }
+@@ -631,7 +633,7 @@ static const struct proc_ops layer7_numpackets_proc_fops = {
+ static int __init xt_layer7_init(void)
+ {
+-      need_conntrack();
++//    need_conntrack();
+       // Register proc interface
+       proc_create_data("layer7_numpackets", 0644,
+-- 
+2.30.2
+