mirror of
				https://github.com/Ysurac/openmptcprouter.git
				synced 2025-03-09 15:40:20 +00:00 
			
		
		
		
	Add patches for kernel 6.6
This commit is contained in:
		
							parent
							
								
									378defd972
								
							
						
					
					
						commit
						dc315f4ee0
					
				
					 126 changed files with 14800 additions and 0 deletions
				
			
		
							
								
								
									
										210
									
								
								6.6/target/linux/generic/hack-6.6/204-module_strip.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										210
									
								
								6.6/target/linux/generic/hack-6.6/204-module_strip.patch
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,210 @@ | |||
| From a779a482fb9b9f8fcdf8b2519c789b4b9bb5dd05 Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Fri, 7 Jul 2017 16:56:48 +0200 | ||||
| Subject: build: add a hack for removing non-essential module info | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
|  include/linux/module.h      | 13 ++++++++----- | ||||
|  include/linux/moduleparam.h | 15 ++++++++++++--- | ||||
|  init/Kconfig                |  7 +++++++ | ||||
|  kernel/module.c             |  5 ++++- | ||||
|  scripts/mod/modpost.c       | 12 ++++++++++++ | ||||
|  5 files changed, 43 insertions(+), 9 deletions(-) | ||||
| 
 | ||||
| --- a/include/linux/module.h
 | ||||
| +++ b/include/linux/module.h
 | ||||
| @@ -163,6 +163,7 @@ extern void cleanup_module(void);
 | ||||
|   | ||||
|  /* Generic info of form tag = "info" */ | ||||
|  #define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info) | ||||
| +#define MODULE_INFO_STRIP(tag, info) __MODULE_INFO_STRIP(tag, tag, info)
 | ||||
|   | ||||
|  /* For userspace: you can also call me... */ | ||||
|  #define MODULE_ALIAS(_alias) MODULE_INFO(alias, _alias) | ||||
| @@ -232,12 +233,12 @@ extern void cleanup_module(void);
 | ||||
|   * Author(s), use "Name <email>" or just "Name", for multiple | ||||
|   * authors use multiple MODULE_AUTHOR() statements/lines. | ||||
|   */ | ||||
| -#define MODULE_AUTHOR(_author) MODULE_INFO(author, _author)
 | ||||
| +#define MODULE_AUTHOR(_author) MODULE_INFO_STRIP(author, _author)
 | ||||
|   | ||||
|  /* What your module does. */ | ||||
| -#define MODULE_DESCRIPTION(_description) MODULE_INFO(description, _description)
 | ||||
| +#define MODULE_DESCRIPTION(_description) MODULE_INFO_STRIP(description, _description)
 | ||||
|   | ||||
| -#ifdef MODULE
 | ||||
| +#if defined(MODULE) && !defined(CONFIG_MODULE_STRIPPED)
 | ||||
|  /* Creates an alias so file2alias.c can find device table. */ | ||||
|  #define MODULE_DEVICE_TABLE(type, name)					\ | ||||
|  extern typeof(name) __mod_##type##__##name##_device_table		\ | ||||
| @@ -264,7 +265,9 @@ extern typeof(name) __mod_##type##__##na
 | ||||
|   */ | ||||
|   | ||||
|  #if defined(MODULE) || !defined(CONFIG_SYSFS) | ||||
| -#define MODULE_VERSION(_version) MODULE_INFO(version, _version)
 | ||||
| +#define MODULE_VERSION(_version) MODULE_INFO_STRIP(version, _version)
 | ||||
| +#elif defined(CONFIG_MODULE_STRIPPED)
 | ||||
| +#define MODULE_VERSION(_version) __MODULE_INFO_DISABLED(version)
 | ||||
|  #else | ||||
|  #define MODULE_VERSION(_version)					\ | ||||
|  	MODULE_INFO(version, _version);					\ | ||||
| @@ -287,7 +290,7 @@ extern typeof(name) __mod_##type##__##na
 | ||||
|  /* Optional firmware file (or files) needed by the module | ||||
|   * format is simply firmware file name.  Multiple firmware | ||||
|   * files require multiple MODULE_FIRMWARE() specifiers */ | ||||
| -#define MODULE_FIRMWARE(_firmware) MODULE_INFO(firmware, _firmware)
 | ||||
| +#define MODULE_FIRMWARE(_firmware) MODULE_INFO_STRIP(firmware, _firmware)
 | ||||
|   | ||||
|  #define MODULE_IMPORT_NS(ns)	MODULE_INFO(import_ns, __stringify(ns)) | ||||
|   | ||||
| --- a/include/linux/moduleparam.h
 | ||||
| +++ b/include/linux/moduleparam.h
 | ||||
| @@ -20,6 +20,16 @@
 | ||||
|  /* Chosen so that structs with an unsigned long line up. */ | ||||
|  #define MAX_PARAM_PREFIX_LEN (64 - sizeof(unsigned long)) | ||||
|   | ||||
| +/* This struct is here for syntactic coherency, it is not used */
 | ||||
| +#define __MODULE_INFO_DISABLED(name)					  \
 | ||||
| +  struct __UNIQUE_ID(name) {}
 | ||||
| +
 | ||||
| +#ifdef CONFIG_MODULE_STRIPPED
 | ||||
| +#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO_DISABLED(name)
 | ||||
| +#else
 | ||||
| +#define __MODULE_INFO_STRIP(tag, name, info) __MODULE_INFO(tag, name, info)
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #define __MODULE_INFO(tag, name, info)					  \ | ||||
|  	static const char __UNIQUE_ID(name)[]				  \ | ||||
|  		__used __section(".modinfo") __aligned(1)		  \ | ||||
| @@ -31,7 +41,7 @@
 | ||||
|  /* One for each parameter, describing how to use it.  Some files do | ||||
|     multiple of these per line, so can't just use MODULE_INFO. */ | ||||
|  #define MODULE_PARM_DESC(_parm, desc) \ | ||||
| -	__MODULE_INFO(parm, _parm, #_parm ":" desc)
 | ||||
| +	__MODULE_INFO_STRIP(parm, _parm, #_parm ":" desc)
 | ||||
|   | ||||
|  struct kernel_param; | ||||
|   | ||||
| --- a/kernel/module/Kconfig
 | ||||
| +++ b/kernel/module/Kconfig
 | ||||
| @@ -290,4 +290,11 @@ config MODULES_TREE_LOOKUP
 | ||||
|  	def_bool y | ||||
|  	depends on PERF_EVENTS || TRACING || CFI_CLANG | ||||
|   | ||||
| +config MODULE_STRIPPED
 | ||||
| +	bool "Reduce module size"
 | ||||
| +	depends on MODULES
 | ||||
| +	help
 | ||||
| +	  Remove module parameter descriptions, author info, version, aliases,
 | ||||
| +	  device tables, etc.
 | ||||
| +
 | ||||
|  endif # MODULES | ||||
| --- a/kernel/module/main.c
 | ||||
| +++ b/kernel/module/main.c
 | ||||
| @@ -988,6 +988,7 @@ size_t modinfo_attrs_count = ARRAY_SIZE(
 | ||||
|   | ||||
|  static const char vermagic[] = VERMAGIC_STRING; | ||||
|   | ||||
| +#if defined(CONFIG_MODVERSIONS) || !defined(CONFIG_MODULE_STRIPPED)
 | ||||
|  int try_to_force_load(struct module *mod, const char *reason) | ||||
|  { | ||||
|  #ifdef CONFIG_MODULE_FORCE_LOAD | ||||
| @@ -999,6 +1000,7 @@ int try_to_force_load(struct module *mod
 | ||||
|  	return -ENOEXEC; | ||||
|  #endif | ||||
|  } | ||||
| +#endif
 | ||||
|   | ||||
|  static char *get_modinfo(const struct load_info *info, const char *tag); | ||||
|  static char *get_next_modinfo(const struct load_info *info, const char *tag, | ||||
| @@ -1958,9 +1960,11 @@ static int setup_load_info(struct load_i
 | ||||
|   | ||||
|  static int check_modinfo(struct module *mod, struct load_info *info, int flags) | ||||
|  { | ||||
| -	const char *modmagic = get_modinfo(info, "vermagic");
 | ||||
|  	int err; | ||||
|   | ||||
| +#ifndef CONFIG_MODULE_STRIPPED
 | ||||
| +	const char *modmagic = get_modinfo(info, "vermagic");
 | ||||
| +
 | ||||
|  	if (flags & MODULE_INIT_IGNORE_VERMAGIC) | ||||
|  		modmagic = NULL; | ||||
|   | ||||
| @@ -1981,6 +1985,7 @@ static int check_modinfo(struct module *
 | ||||
|  				mod->name); | ||||
|  		add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK); | ||||
|  	} | ||||
| +#endif
 | ||||
|   | ||||
|  	check_modinfo_retpoline(mod, info); | ||||
|   | ||||
| --- a/scripts/mod/modpost.c
 | ||||
| +++ b/scripts/mod/modpost.c
 | ||||
| @@ -1781,7 +1781,9 @@ static void read_symbols(const char *mod
 | ||||
|  		symname = remove_dot(info.strtab + sym->st_name); | ||||
|   | ||||
|  		handle_symbol(mod, &info, sym, symname); | ||||
| +#ifndef CONFIG_MODULE_STRIPPED
 | ||||
|  		handle_moddevtable(mod, &info, sym, symname); | ||||
| +#endif
 | ||||
|  	} | ||||
|   | ||||
|  	for (sym = info.symtab_start; sym < info.symtab_stop; sym++) { | ||||
| @@ -1944,8 +1946,10 @@ static void add_header(struct buffer *b,
 | ||||
|  	buf_printf(b, "BUILD_SALT;\n"); | ||||
|  	buf_printf(b, "BUILD_LTO_INFO;\n"); | ||||
|  	buf_printf(b, "\n"); | ||||
| +#ifndef CONFIG_MODULE_STRIPPED
 | ||||
|  	buf_printf(b, "MODULE_INFO(vermagic, VERMAGIC_STRING);\n"); | ||||
|  	buf_printf(b, "MODULE_INFO(name, KBUILD_MODNAME);\n"); | ||||
| +#endif
 | ||||
|  	buf_printf(b, "\n"); | ||||
|  	buf_printf(b, "__visible struct module __this_module\n"); | ||||
|  	buf_printf(b, "__section(\".gnu.linkonce.this_module\") = {\n"); | ||||
| @@ -1959,8 +1963,10 @@ static void add_header(struct buffer *b,
 | ||||
|  	buf_printf(b, "\t.arch = MODULE_ARCH_INIT,\n"); | ||||
|  	buf_printf(b, "};\n"); | ||||
|   | ||||
| +#ifndef CONFIG_MODULE_STRIPPED
 | ||||
|  	if (!external_module) | ||||
|  		buf_printf(b, "\nMODULE_INFO(intree, \"Y\");\n"); | ||||
| +#endif
 | ||||
|   | ||||
|  	buf_printf(b, | ||||
|  		   "\n" | ||||
| @@ -1968,8 +1974,10 @@ static void add_header(struct buffer *b,
 | ||||
|  		   "MODULE_INFO(retpoline, \"Y\");\n" | ||||
|  		   "#endif\n"); | ||||
|   | ||||
| +#ifndef CONFIG_MODULE_STRIPPED
 | ||||
|  	if (strstarts(mod->name, "drivers/staging")) | ||||
|  		buf_printf(b, "\nMODULE_INFO(staging, \"Y\");\n"); | ||||
| +#endif
 | ||||
|   | ||||
|  	if (strstarts(mod->name, "tools/testing")) | ||||
|  		buf_printf(b, "\nMODULE_INFO(test, \"Y\");\n"); | ||||
| @@ -2065,11 +2073,13 @@ static void add_depends(struct buffer *b
 | ||||
|   | ||||
|  static void add_srcversion(struct buffer *b, struct module *mod) | ||||
|  { | ||||
| +#ifndef CONFIG_MODULE_STRIPPED
 | ||||
|  	if (mod->srcversion[0]) { | ||||
|  		buf_printf(b, "\n"); | ||||
|  		buf_printf(b, "MODULE_INFO(srcversion, \"%s\");\n", | ||||
|  			   mod->srcversion); | ||||
|  	} | ||||
| +#endif
 | ||||
|  } | ||||
|   | ||||
|  static void write_buf(struct buffer *b, const char *fname) | ||||
| @@ -2155,7 +2165,9 @@ static void write_mod_c_file(struct modu
 | ||||
|  	add_exported_symbols(&buf, mod); | ||||
|  	add_versions(&buf, mod); | ||||
|  	add_depends(&buf, mod); | ||||
| +#ifndef CONFIG_MODULE_STRIPPED
 | ||||
|  	add_moddevtable(&buf, mod); | ||||
| +#endif
 | ||||
|  	add_srcversion(&buf, mod); | ||||
|   | ||||
|  	ret = snprintf(fname, sizeof(fname), "%s.mod.c", mod->name); | ||||
|  | @ -0,0 +1,41 @@ | |||
| From 310e8e04a05d9eb43fa9dd7f00143300afcaa37a Mon Sep 17 00:00:00 2001 | ||||
| From: David Bauer <mail@david-bauer.net> | ||||
| Date: Fri, 11 Nov 2022 13:33:44 +0100 | ||||
| Subject: [PATCH] kconfig: abort configuration on unset symbol | ||||
| 
 | ||||
| When a target configuration has unset Kconfig symbols, the build will | ||||
| fail when OpenWrt is compiled with V=s and stdin is connected to a tty. | ||||
| 
 | ||||
| In case OpenWrt is compiled without either of these preconditions, the | ||||
| build will succeed with the symbols in question being unset. | ||||
| 
 | ||||
| Modify the kernel configuration in a way it fails on unset symbols | ||||
| regardless of the aforementioned preconditions. | ||||
| 
 | ||||
| Signed-off-by: David Bauer <mail@david-bauer.net> | ||||
| ---
 | ||||
|  scripts/kconfig/conf.c | 6 ++++++ | ||||
|  1 file changed, 6 insertions(+) | ||||
| 
 | ||||
| --- a/scripts/kconfig/conf.c
 | ||||
| +++ b/scripts/kconfig/conf.c
 | ||||
| @@ -338,6 +338,9 @@ static int conf_askvalue(struct symbol *
 | ||||
|  		} | ||||
|  		/* fall through */ | ||||
|  	default: | ||||
| +		if (!tty_stdio && getenv("FAIL_ON_UNCONFIGURED")) {
 | ||||
| +			exit(1);
 | ||||
| +		}
 | ||||
|  		fflush(stdout); | ||||
|  		xfgets(line, sizeof(line), stdin); | ||||
|  		break; | ||||
| @@ -520,6 +523,9 @@ static int conf_choice(struct menu *menu
 | ||||
|  			} | ||||
|  			/* fall through */ | ||||
|  		case oldaskconfig: | ||||
| +			if (!tty_stdio && getenv("FAIL_ON_UNCONFIGURED")) {
 | ||||
| +				exit(1);
 | ||||
| +			}
 | ||||
|  			fflush(stdout); | ||||
|  			xfgets(line, sizeof(line), stdin); | ||||
|  			strip(line); | ||||
							
								
								
									
										3053
									
								
								6.6/target/linux/generic/hack-6.6/210-darwin_scripts_include.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										3053
									
								
								6.6/target/linux/generic/hack-6.6/210-darwin_scripts_include.patch
									
										
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -0,0 +1,93 @@ | |||
| From 48232d3d931c95953ce2ddfe7da7bb164aef6a73 Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Fri, 7 Jul 2017 17:03:16 +0200 | ||||
| Subject: fix portability of some includes files in tools/ used on the host | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
|  tools/include/tools/be_byteshift.h |  4 ++++ | ||||
|  tools/include/tools/le_byteshift.h |  4 ++++ | ||||
|  tools/include/tools/linux_types.h  | 22 ++++++++++++++++++++++ | ||||
|  3 files changed, 30 insertions(+) | ||||
|  create mode 100644 tools/include/tools/linux_types.h | ||||
| 
 | ||||
| --- a/tools/include/tools/be_byteshift.h
 | ||||
| +++ b/tools/include/tools/be_byteshift.h
 | ||||
| @@ -2,6 +2,10 @@
 | ||||
|  #ifndef _TOOLS_BE_BYTESHIFT_H | ||||
|  #define _TOOLS_BE_BYTESHIFT_H | ||||
|   | ||||
| +#ifndef __linux__
 | ||||
| +#include "linux_types.h"
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #include <stdint.h> | ||||
|   | ||||
|  static inline uint16_t __get_unaligned_be16(const uint8_t *p) | ||||
| --- a/tools/include/tools/le_byteshift.h
 | ||||
| +++ b/tools/include/tools/le_byteshift.h
 | ||||
| @@ -2,6 +2,10 @@
 | ||||
|  #ifndef _TOOLS_LE_BYTESHIFT_H | ||||
|  #define _TOOLS_LE_BYTESHIFT_H | ||||
|   | ||||
| +#ifndef __linux__
 | ||||
| +#include "linux_types.h"
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #include <stdint.h> | ||||
|   | ||||
|  static inline uint16_t __get_unaligned_le16(const uint8_t *p) | ||||
| --- /dev/null
 | ||||
| +++ b/tools/include/tools/linux_types.h
 | ||||
| @@ -0,0 +1,26 @@
 | ||||
| +#ifndef __LINUX_TYPES_H
 | ||||
| +#define __LINUX_TYPES_H
 | ||||
| +
 | ||||
| +#include <stdint.h>
 | ||||
| +
 | ||||
| +typedef int8_t __s8;
 | ||||
| +typedef uint8_t __u8;
 | ||||
| +typedef uint8_t __be8;
 | ||||
| +typedef uint8_t __le8;
 | ||||
| +
 | ||||
| +typedef int16_t __s16;
 | ||||
| +typedef uint16_t __u16;
 | ||||
| +typedef uint16_t __be16;
 | ||||
| +typedef uint16_t __le16;
 | ||||
| +
 | ||||
| +typedef int32_t __s32;
 | ||||
| +typedef uint32_t __u32;
 | ||||
| +typedef uint32_t __be32;
 | ||||
| +typedef uint32_t __le32;
 | ||||
| +
 | ||||
| +typedef int64_t __s64;
 | ||||
| +typedef uint64_t __u64;
 | ||||
| +typedef uint64_t __be64;
 | ||||
| +typedef uint64_t __le64;
 | ||||
| +
 | ||||
| +#endif
 | ||||
| --- a/tools/include/linux/types.h
 | ||||
| +++ b/tools/include/linux/types.h
 | ||||
| @@ -10,8 +10,12 @@
 | ||||
|  #define __SANE_USERSPACE_TYPES__	/* For PPC64, to get LL64 types */ | ||||
|  #endif | ||||
|   | ||||
| +#ifndef __linux__
 | ||||
| +#include <tools/linux_types.h>
 | ||||
| +#else
 | ||||
|  #include <asm/types.h> | ||||
|  #include <asm/posix_types.h> | ||||
| +#endif
 | ||||
|   | ||||
|  struct page; | ||||
|  struct kmem_cache; | ||||
| --- a/tools/perf/pmu-events/jevents.py
 | ||||
| +++ b/tools/perf/pmu-events/jevents.py
 | ||||
| @@ -684,6 +684,7 @@ def main() -> None:
 | ||||
|  #include "util/header.h" | ||||
|  #include "util/pmu.h" | ||||
|  #include <string.h> | ||||
| +#include <strings.h>
 | ||||
|  #include <stddef.h> | ||||
|   | ||||
|  struct compact_pmu_event { | ||||
|  | @ -0,0 +1,24 @@ | |||
| From be9be95ff10e16a5b4ad36f903978d0cc5747024 Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Fri, 7 Jul 2017 17:04:08 +0200 | ||||
| Subject: kernel: fix linux/spi/spidev.h portability issues with musl | ||||
| 
 | ||||
| Felix will try to get this define included into musl | ||||
| 
 | ||||
| lede-commit: 795e7cf60de19e7a076a46874fab7bb88b43bbff | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
|  include/uapi/linux/spi/spidev.h | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| --- a/include/uapi/linux/spi/spidev.h
 | ||||
| +++ b/include/uapi/linux/spi/spidev.h
 | ||||
| @@ -93,7 +93,7 @@ struct spi_ioc_transfer {
 | ||||
|   | ||||
|  /* not all platforms use <asm-generic/ioctl.h> or _IOC_TYPECHECK() ... */ | ||||
|  #define SPI_MSGSIZE(N) \ | ||||
| -	((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << _IOC_SIZEBITS)) \
 | ||||
| +	((((N)*(sizeof (struct spi_ioc_transfer))) < (1 << 13)) \
 | ||||
|  		? ((N)*(sizeof (struct spi_ioc_transfer))) : 0) | ||||
|  #define SPI_IOC_MESSAGE(N) _IOW(SPI_IOC_MAGIC, 0, char[SPI_MSGSIZE(N)]) | ||||
|   | ||||
							
								
								
									
										123
									
								
								6.6/target/linux/generic/hack-6.6/220-arm-gc_sections.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										123
									
								
								6.6/target/linux/generic/hack-6.6/220-arm-gc_sections.patch
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,123 @@ | |||
| From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Sat, 15 Jul 2017 23:42:36 +0200 | ||||
| Subject: use -ffunction-sections, -fdata-sections and --gc-sections | ||||
| 
 | ||||
| In combination with kernel symbol export stripping this significantly reduces | ||||
| the kernel image size. Used on both ARM and MIPS architectures. | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| Signed-off-by: Jonas Gorski <jogo@openwrt.org> | ||||
| Signed-off-by: Gabor Juhos <juhosg@openwrt.org> | ||||
| ---
 | ||||
| --- a/arch/arm/Kconfig
 | ||||
| +++ b/arch/arm/Kconfig
 | ||||
| @@ -124,6 +124,7 @@ config ARM
 | ||||
|  	select HAVE_VIRT_CPU_ACCOUNTING_GEN | ||||
|  	select IRQ_FORCED_THREADING | ||||
|  	select LOCK_MM_AND_FIND_VMA | ||||
| +	select HAVE_LD_DEAD_CODE_DATA_ELIMINATION
 | ||||
|  	select MODULES_USE_ELF_REL | ||||
|  	select NEED_DMA_MAP_STATE | ||||
|  	select OF_EARLY_FLATTREE if OF | ||||
| --- a/arch/arm/boot/compressed/Makefile
 | ||||
| +++ b/arch/arm/boot/compressed/Makefile
 | ||||
| @@ -91,6 +91,7 @@ endif
 | ||||
|  ifeq ($(CONFIG_USE_OF),y) | ||||
|  OBJS	+= $(libfdt_objs) fdt_check_mem_start.o | ||||
|  endif | ||||
| +KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))
 | ||||
|   | ||||
|  OBJS	+= lib1funcs.o ashldi3.o bswapsdi2.o | ||||
|   | ||||
| --- a/arch/arm/kernel/vmlinux.lds.S
 | ||||
| +++ b/arch/arm/kernel/vmlinux.lds.S
 | ||||
| @@ -75,7 +75,7 @@ SECTIONS
 | ||||
|  	. = ALIGN(4); | ||||
|  	__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { | ||||
|  		__start___ex_table = .; | ||||
| -		ARM_MMU_KEEP(*(__ex_table))
 | ||||
| +		KEEP(*(__ex_table))
 | ||||
|  		__stop___ex_table = .; | ||||
|  	} | ||||
|   | ||||
| @@ -100,24 +100,24 @@ SECTIONS
 | ||||
|  	} | ||||
|  	.init.arch.info : { | ||||
|  		__arch_info_begin = .; | ||||
| -		*(.arch.info.init)
 | ||||
| +		KEEP(*(.arch.info.init))
 | ||||
|  		__arch_info_end = .; | ||||
|  	} | ||||
|  	.init.tagtable : { | ||||
|  		__tagtable_begin = .; | ||||
| -		*(.taglist.init)
 | ||||
| +		KEEP(*(.taglist.init))
 | ||||
|  		__tagtable_end = .; | ||||
|  	} | ||||
|  #ifdef CONFIG_SMP_ON_UP | ||||
|  	.init.smpalt : { | ||||
|  		__smpalt_begin = .; | ||||
| -		*(.alt.smp.init)
 | ||||
| +		KEEP(*(.alt.smp.init))
 | ||||
|  		__smpalt_end = .; | ||||
|  	} | ||||
|  #endif | ||||
|  	.init.pv_table : { | ||||
|  		__pv_table_begin = .; | ||||
| -		*(.pv_table)
 | ||||
| +		KEEP(*(.pv_table))
 | ||||
|  		__pv_table_end = .; | ||||
|  	} | ||||
|   | ||||
| --- a/arch/arm/include/asm/vmlinux.lds.h
 | ||||
| +++ b/arch/arm/include/asm/vmlinux.lds.h
 | ||||
| @@ -42,13 +42,13 @@
 | ||||
|  #define PROC_INFO							\ | ||||
|  		. = ALIGN(4);						\ | ||||
|  		__proc_info_begin = .;					\ | ||||
| -		*(.proc.info.init)					\
 | ||||
| +		KEEP(*(.proc.info.init))				\
 | ||||
|  		__proc_info_end = .; | ||||
|   | ||||
|  #define IDMAP_TEXT							\ | ||||
|  		ALIGN_FUNCTION();					\ | ||||
|  		__idmap_text_start = .;					\ | ||||
| -		*(.idmap.text)						\
 | ||||
| +		KEEP(*(.idmap.text))					\
 | ||||
|  		__idmap_text_end = .;					\ | ||||
|   | ||||
|  #define ARM_DISCARD							\ | ||||
| @@ -109,12 +109,12 @@
 | ||||
|  	. = ALIGN(8);							\ | ||||
|  	.ARM.unwind_idx : {						\ | ||||
|  		__start_unwind_idx = .;					\ | ||||
| -		*(.ARM.exidx*)						\
 | ||||
| +		KEEP(*(.ARM.exidx*))					\
 | ||||
|  		__stop_unwind_idx = .;					\ | ||||
|  	}								\ | ||||
|  	.ARM.unwind_tab : {						\ | ||||
|  		__start_unwind_tab = .;					\ | ||||
| -		*(.ARM.extab*)						\
 | ||||
| +		KEEP(*(.ARM.extab*))					\
 | ||||
|  		__stop_unwind_tab = .;					\ | ||||
|  	} | ||||
|   | ||||
| @@ -126,7 +126,7 @@
 | ||||
|  	__vectors_lma = .;						\ | ||||
|  	OVERLAY 0xffff0000 : NOCROSSREFS AT(__vectors_lma) {		\ | ||||
|  		.vectors {						\ | ||||
| -			*(.vectors)					\
 | ||||
| +			KEEP(*(.vectors))				\
 | ||||
|  		}							\ | ||||
|  		.vectors.bhb.loop8 {					\ | ||||
|  			*(.vectors.bhb.loop8)				\ | ||||
| @@ -144,7 +144,7 @@
 | ||||
|  									\ | ||||
|  	__stubs_lma = .;						\ | ||||
|  	.stubs ADDR(.vectors) + 0x1000 : AT(__stubs_lma) {		\ | ||||
| -		*(.stubs)						\
 | ||||
| +		KEEP(*(.stubs))						\
 | ||||
|  	}								\ | ||||
|  	ARM_LMA(__stubs, .stubs);					\ | ||||
|  	. = __stubs_lma + SIZEOF(.stubs);				\ | ||||
|  | @ -0,0 +1,38 @@ | |||
| From b3d00b452467f621317953d9e4c6f9ae8dcfd271 Mon Sep 17 00:00:00 2001 | ||||
| From: Imre Kaloz <kaloz@openwrt.org> | ||||
| Date: Fri, 7 Jul 2017 17:06:55 +0200 | ||||
| Subject: use the openwrt lzma options for now | ||||
| 
 | ||||
| lede-commit: 548de949f392049420a6a1feeef118b30ab8ea8c | ||||
| Signed-off-by: Imre Kaloz <kaloz@openwrt.org> | ||||
| ---
 | ||||
|  lib/decompress.c              |  1 + | ||||
|  scripts/Makefile.lib          |  2 +- | ||||
|  usr/gen_initramfs_list.sh | 10 +++++----- | ||||
|  3 files changed, 7 insertions(+), 6 deletions(-) | ||||
| 
 | ||||
| --- a/lib/decompress.c
 | ||||
| +++ b/lib/decompress.c
 | ||||
| @@ -53,6 +53,7 @@ static const struct compress_format comp
 | ||||
|  	{ {0x1f, 0x9e}, "gzip", gunzip }, | ||||
|  	{ {0x42, 0x5a}, "bzip2", bunzip2 }, | ||||
|  	{ {0x5d, 0x00}, "lzma", unlzma }, | ||||
| +	{ {0x6d, 0x00}, "lzma-openwrt", unlzma },
 | ||||
|  	{ {0xfd, 0x37}, "xz", unxz }, | ||||
|  	{ {0x89, 0x4c}, "lzo", unlzo }, | ||||
|  	{ {0x02, 0x21}, "lz4", unlz4 }, | ||||
| --- a/scripts/Makefile.lib
 | ||||
| +++ b/scripts/Makefile.lib
 | ||||
| @@ -443,10 +443,10 @@ quiet_cmd_bzip2_with_size = BZIP2   $@
 | ||||
|  # --------------------------------------------------------------------------- | ||||
|   | ||||
|  quiet_cmd_lzma = LZMA    $@ | ||||
| -      cmd_lzma = cat $(real-prereqs) | $(LZMA) -9 > $@
 | ||||
| +      cmd_lzma = cat $(real-prereqs) | $(LZMA) e -d20 -lc1 -lp2 -pb2 -eos -si -so > $@
 | ||||
|   | ||||
|  quiet_cmd_lzma_with_size = LZMA    $@ | ||||
| -      cmd_lzma_with_size = { cat $(real-prereqs) | $(LZMA) -9; $(size_append); } > $@
 | ||||
| +      cmd_lzma_with_size = { cat $(real-prereqs) | $(LZMA) e -d20 -lc1 -lp2 -pb2 -eos -si -so; $(size_append); } > $@
 | ||||
|   | ||||
|  quiet_cmd_lzo = LZO     $@ | ||||
|        cmd_lzo = cat $(real-prereqs) | $(KLZOP) -9 > $@ | ||||
|  | @ -0,0 +1,27 @@ | |||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Subject: hack: net: remove bogus netfilter dependencies | ||||
| 
 | ||||
| lede-commit: 589d2a377dee27d206fc3725325309cf649e4df6 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
|  net/netfilter/Kconfig | 2 -- | ||||
|  1 file changed, 2 deletions(-) | ||||
| 
 | ||||
| --- a/net/netfilter/Kconfig
 | ||||
| +++ b/net/netfilter/Kconfig
 | ||||
| @@ -253,7 +253,6 @@ config NF_CONNTRACK_FTP
 | ||||
|   | ||||
|  config NF_CONNTRACK_H323 | ||||
|  	tristate "H.323 protocol support" | ||||
| -	depends on IPV6 || IPV6=n
 | ||||
|  	depends on NETFILTER_ADVANCED | ||||
|  	help | ||||
|  	  H.323 is a VoIP signalling protocol from ITU-T. As one of the most | ||||
| @@ -1118,7 +1117,6 @@ config NETFILTER_XT_TARGET_SECMARK
 | ||||
|   | ||||
|  config NETFILTER_XT_TARGET_TCPMSS | ||||
|  	tristate '"TCPMSS" target support' | ||||
| -	depends on IPV6 || IPV6=n
 | ||||
|  	default m if NETFILTER_ADVANCED=n | ||||
|  	help | ||||
|  	  This option adds a `TCPMSS' target, which allows you to alter the | ||||
							
								
								
									
										32
									
								
								6.6/target/linux/generic/hack-6.6/253-ksmbd-config.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								6.6/target/linux/generic/hack-6.6/253-ksmbd-config.patch
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | |||
| From dcd966fa7ca63f38cf7147e1184d13d66e2ca340 Mon Sep 17 00:00:00 2001 | ||||
| From: OpenWrt community <openwrt-devel@lists.openwrt.org> | ||||
| Date: Wed, 13 Jul 2022 13:33:30 +0200 | ||||
| Subject: [PATCH] Kconfig: add tristate for OID and ASNI string | ||||
| 
 | ||||
| ---
 | ||||
|  init/Kconfig | 2 +- | ||||
|  lib/Kconfig  | 2 +- | ||||
|  2 files changed, 2 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| --- a/init/Kconfig
 | ||||
| +++ b/init/Kconfig
 | ||||
| @@ -2004,7 +2004,7 @@ config PADATA
 | ||||
|  	bool | ||||
|   | ||||
|  config ASN1 | ||||
| -	tristate
 | ||||
| +	tristate "ASN1"
 | ||||
|  	help | ||||
|  	  Build a simple ASN.1 grammar compiler that produces a bytecode output | ||||
|  	  that can be interpreted by the ASN.1 stream decoder and used to | ||||
| --- a/lib/Kconfig
 | ||||
| +++ b/lib/Kconfig
 | ||||
| @@ -637,7 +637,7 @@ config LIBFDT
 | ||||
|  	bool | ||||
|   | ||||
|  config OID_REGISTRY | ||||
| -	tristate
 | ||||
| +	tristate "OID"
 | ||||
|  	help | ||||
|  	  Enable fast lookup object identifier registry. | ||||
|   | ||||
							
								
								
									
										24
									
								
								6.6/target/linux/generic/hack-6.6/261-lib-arc4-unhide.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								6.6/target/linux/generic/hack-6.6/261-lib-arc4-unhide.patch
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | |||
| From 241e5d3f7b0dd3c01f8c7fa83cbc9a3882286d53 Mon Sep 17 00:00:00 2001 | ||||
| From: OpenWrt community <openwrt-devel@lists.openwrt.org> | ||||
| Date: Wed, 13 Jul 2022 13:35:18 +0200 | ||||
| Subject: [PATCH] lib/crypto: add tristate string for ARC4 | ||||
| 
 | ||||
| This makes it possible to select CONFIG_CRYPTO_LIB_ARC4 directly. We  | ||||
| need this to be able to compile this into the kernel and make use of it  | ||||
| from backports. | ||||
| 
 | ||||
| ---
 | ||||
|  lib/crypto/Kconfig | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| --- a/lib/crypto/Kconfig
 | ||||
| +++ b/lib/crypto/Kconfig
 | ||||
| @@ -9,7 +9,7 @@ config CRYPTO_LIB_AES
 | ||||
|  	tristate | ||||
|   | ||||
|  config CRYPTO_LIB_ARC4 | ||||
| -	tristate
 | ||||
| +	tristate "ARC4 cipher library"
 | ||||
|   | ||||
|  config CRYPTO_ARCH_HAVE_LIB_BLAKE2S | ||||
|  	bool | ||||
							
								
								
									
										84
									
								
								6.6/target/linux/generic/hack-6.6/280-rfkill-stubs.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								6.6/target/linux/generic/hack-6.6/280-rfkill-stubs.patch
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,84 @@ | |||
| From 236c1acdfef5958010ac9814a9872e0a46fd78ee Mon Sep 17 00:00:00 2001 | ||||
| From: John Crispin <john@phrozen.org> | ||||
| Date: Fri, 7 Jul 2017 17:13:44 +0200 | ||||
| Subject: rfkill: add fake rfkill support | ||||
| 
 | ||||
| allow building of modules depending on RFKILL even if RFKILL is not enabled. | ||||
| 
 | ||||
| Signed-off-by: John Crispin <john@phrozen.org> | ||||
| ---
 | ||||
|  include/linux/rfkill.h |  2 +- | ||||
|  net/Makefile           |  2 +- | ||||
|  net/rfkill/Kconfig     | 14 +++++++++----- | ||||
|  net/rfkill/Makefile    |  2 +- | ||||
|  4 files changed, 12 insertions(+), 8 deletions(-) | ||||
| 
 | ||||
| --- a/include/linux/rfkill.h
 | ||||
| +++ b/include/linux/rfkill.h
 | ||||
| @@ -64,7 +64,7 @@ struct rfkill_ops {
 | ||||
|  	int	(*set_block)(void *data, bool blocked); | ||||
|  }; | ||||
|   | ||||
| -#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
 | ||||
| +#if defined(CONFIG_RFKILL_FULL) || defined(CONFIG_RFKILL_FULL_MODULE)
 | ||||
|  /** | ||||
|   * rfkill_alloc - Allocate rfkill structure | ||||
|   * @name: name of the struct -- the string is not copied internally | ||||
| --- a/net/Makefile
 | ||||
| +++ b/net/Makefile
 | ||||
| @@ -52,7 +52,7 @@ obj-$(CONFIG_TIPC)		+= tipc/
 | ||||
|  obj-$(CONFIG_NETLABEL)		+= netlabel/ | ||||
|  obj-$(CONFIG_IUCV)		+= iucv/ | ||||
|  obj-$(CONFIG_SMC)		+= smc/ | ||||
| -obj-$(CONFIG_RFKILL)		+= rfkill/
 | ||||
| +obj-$(CONFIG_RFKILL_FULL)	+= rfkill/
 | ||||
|  obj-$(CONFIG_NET_9P)		+= 9p/ | ||||
|  obj-$(CONFIG_CAIF)		+= caif/ | ||||
|  obj-$(CONFIG_DCB)		+= dcb/ | ||||
| --- a/net/rfkill/Kconfig
 | ||||
| +++ b/net/rfkill/Kconfig
 | ||||
| @@ -2,7 +2,11 @@
 | ||||
|  # | ||||
|  # RF switch subsystem configuration | ||||
|  # | ||||
| -menuconfig RFKILL
 | ||||
| +config RFKILL
 | ||||
| +	bool
 | ||||
| +	default y
 | ||||
| +
 | ||||
| +menuconfig RFKILL_FULL
 | ||||
|  	tristate "RF switch subsystem support" | ||||
|  	help | ||||
|  	  Say Y here if you want to have control over RF switches | ||||
| @@ -14,19 +18,19 @@ menuconfig RFKILL
 | ||||
|  # LED trigger support | ||||
|  config RFKILL_LEDS | ||||
|  	bool | ||||
| -	depends on RFKILL
 | ||||
| +	depends on RFKILL_FULL
 | ||||
|  	depends on LEDS_TRIGGERS = y || RFKILL = LEDS_TRIGGERS | ||||
|  	default y | ||||
|   | ||||
|  config RFKILL_INPUT | ||||
|  	bool "RF switch input support" if EXPERT | ||||
| -	depends on RFKILL
 | ||||
| +	depends on RFKILL_FULL
 | ||||
|  	depends on INPUT = y || RFKILL = INPUT | ||||
|  	default y if !EXPERT | ||||
|   | ||||
|  config RFKILL_GPIO | ||||
|  	tristate "GPIO RFKILL driver" | ||||
| -	depends on RFKILL
 | ||||
| +	depends on RFKILL_FULL
 | ||||
|  	depends on GPIOLIB || COMPILE_TEST | ||||
|  	default n | ||||
|  	help | ||||
| --- a/net/rfkill/Makefile
 | ||||
| +++ b/net/rfkill/Makefile
 | ||||
| @@ -5,5 +5,5 @@
 | ||||
|   | ||||
|  rfkill-y			+= core.o | ||||
|  rfkill-$(CONFIG_RFKILL_INPUT)	+= input.o | ||||
| -obj-$(CONFIG_RFKILL)		+= rfkill.o
 | ||||
| +obj-$(CONFIG_RFKILL_FULL)	+= rfkill.o
 | ||||
|  obj-$(CONFIG_RFKILL_GPIO)	+= rfkill-gpio.o | ||||
|  | @ -0,0 +1,64 @@ | |||
| From: Ben Menchaca <ben.menchaca@qca.qualcomm.com> | ||||
| Date: Fri, 7 Jun 2013 18:35:22 -0500 | ||||
| Subject: MIPS: r4k_cache: use more efficient cache blast | ||||
| 
 | ||||
| Optimize the compiler output for larger cache blast cases that are | ||||
| common for DMA-based networking. | ||||
| 
 | ||||
| Signed-off-by: Ben Menchaca <ben.menchaca@qca.qualcomm.com> | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
| --- a/arch/mips/include/asm/r4kcache.h
 | ||||
| +++ b/arch/mips/include/asm/r4kcache.h
 | ||||
| @@ -286,14 +286,46 @@ static inline void prot##extra##blast_##
 | ||||
|  						    unsigned long end)	\ | ||||
|  {									\ | ||||
|  	unsigned long lsize = cpu_##desc##_line_size();			\ | ||||
| +	unsigned long lsize_2 = lsize * 2;				\
 | ||||
| +	unsigned long lsize_3 = lsize * 3;				\
 | ||||
| +	unsigned long lsize_4 = lsize * 4;				\
 | ||||
| +	unsigned long lsize_5 = lsize * 5;				\
 | ||||
| +	unsigned long lsize_6 = lsize * 6;				\
 | ||||
| +	unsigned long lsize_7 = lsize * 7;				\
 | ||||
| +	unsigned long lsize_8 = lsize * 8;				\
 | ||||
|  	unsigned long addr = start & ~(lsize - 1);			\ | ||||
| -	unsigned long aend = (end - 1) & ~(lsize - 1);			\
 | ||||
| +	unsigned long aend = (end + lsize - 1) & ~(lsize - 1);		\
 | ||||
| +	int lines = (aend - addr) / lsize;				\
 | ||||
|  									\ | ||||
| -	while (1) {							\
 | ||||
| +	while (lines >= 8) {						\
 | ||||
| +		prot##cache_op(hitop, addr);				\
 | ||||
| +		prot##cache_op(hitop, addr + lsize);			\
 | ||||
| +		prot##cache_op(hitop, addr + lsize_2);			\
 | ||||
| +		prot##cache_op(hitop, addr + lsize_3);			\
 | ||||
| +		prot##cache_op(hitop, addr + lsize_4);			\
 | ||||
| +		prot##cache_op(hitop, addr + lsize_5);			\
 | ||||
| +		prot##cache_op(hitop, addr + lsize_6);			\
 | ||||
| +		prot##cache_op(hitop, addr + lsize_7);			\
 | ||||
| +		addr += lsize_8;					\
 | ||||
| +		lines -= 8;						\
 | ||||
| +	}								\
 | ||||
| +									\
 | ||||
| +	if (lines & 0x4) {						\
 | ||||
| +		prot##cache_op(hitop, addr);				\
 | ||||
| +		prot##cache_op(hitop, addr + lsize);			\
 | ||||
| +		prot##cache_op(hitop, addr + lsize_2);			\
 | ||||
| +		prot##cache_op(hitop, addr + lsize_3);			\
 | ||||
| +		addr += lsize_4;					\
 | ||||
| +	}								\
 | ||||
| +									\
 | ||||
| +	if (lines & 0x2) {						\
 | ||||
| +		prot##cache_op(hitop, addr);				\
 | ||||
| +		prot##cache_op(hitop, addr + lsize);			\
 | ||||
| +		addr += lsize_2;					\
 | ||||
| +	}								\
 | ||||
| +									\
 | ||||
| +	if (lines & 0x1) {						\
 | ||||
|  		prot##cache_op(hitop, addr);				\ | ||||
| -		if (addr == aend)					\
 | ||||
| -			break;						\
 | ||||
| -		addr += lsize;						\
 | ||||
|  	}								\ | ||||
|  } | ||||
|   | ||||
|  | @ -0,0 +1,112 @@ | |||
| From 0bccc3722bdd88e8ae995e77ef9f7b77ee4cbdee Mon Sep 17 00:00:00 2001 | ||||
| From: Daniel Golle <daniel@makrotopia.org> | ||||
| Date: Wed, 7 Apr 2021 22:45:54 +0100 | ||||
| Subject: [PATCH 2/2] mtd: blktrans: call add disks after mtd device | ||||
| To: linux-mtd@lists.infradead.org | ||||
| Cc: Vignesh Raghavendra <vigneshr@ti.com>, | ||||
|     Richard Weinberger <richard@nod.at>, | ||||
|     Miquel Raynal <miquel.raynal@bootlin.com>, | ||||
|     David Woodhouse <dwmw2@infradead.org> | ||||
| 
 | ||||
| Calling device_add_disk while holding mtd_table_mutex leads | ||||
| to deadlock in case part_bits!=0 as block partition parsers | ||||
| will try to open the newly created disks, trying to acquire | ||||
| mutex once again. | ||||
| Move device_add_disk to additional function called after | ||||
| add partitions of an MTD device have been added and locks | ||||
| have been released. | ||||
| 
 | ||||
| Signed-off-by: Daniel Golle <daniel@makrotopia.org> | ||||
| ---
 | ||||
|  drivers/mtd/mtd_blkdevs.c    | 33 ++++++++++++++++++++++++++------- | ||||
|  drivers/mtd/mtdcore.c        |  3 +++ | ||||
|  include/linux/mtd/blktrans.h |  1 + | ||||
|  3 files changed, 30 insertions(+), 7 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/mtd/mtd_blkdevs.c
 | ||||
| +++ b/drivers/mtd/mtd_blkdevs.c
 | ||||
| @@ -386,19 +386,8 @@ int add_mtd_blktrans_dev(struct mtd_blkt
 | ||||
|  	if (new->readonly) | ||||
|  		set_disk_ro(gd, 1); | ||||
|   | ||||
| -	ret = device_add_disk(&new->mtd->dev, gd, NULL);
 | ||||
| -	if (ret)
 | ||||
| -		goto out_cleanup_disk;
 | ||||
| -
 | ||||
| -	if (new->disk_attributes) {
 | ||||
| -		ret = sysfs_create_group(&disk_to_dev(gd)->kobj,
 | ||||
| -					new->disk_attributes);
 | ||||
| -		WARN_ON(ret);
 | ||||
| -	}
 | ||||
|  	return 0; | ||||
|   | ||||
| -out_cleanup_disk:
 | ||||
| -	put_disk(new->disk);
 | ||||
|  out_free_tag_set: | ||||
|  	blk_mq_free_tag_set(new->tag_set); | ||||
|  out_kfree_tag_set: | ||||
| @@ -408,6 +397,35 @@ out_list_del:
 | ||||
|  	return ret; | ||||
|  } | ||||
|   | ||||
| +void register_mtd_blktrans_devs(void)
 | ||||
| +{
 | ||||
| +	struct mtd_blktrans_ops *tr;
 | ||||
| +	struct mtd_blktrans_dev *dev, *next;
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	list_for_each_entry(tr, &blktrans_majors, list) {
 | ||||
| +		list_for_each_entry_safe(dev, next, &tr->devs, list) {
 | ||||
| +			if (disk_live(dev->disk))
 | ||||
| +				continue;
 | ||||
| +
 | ||||
| +			ret = device_add_disk(&dev->mtd->dev, dev->disk, NULL);
 | ||||
| +			if (ret)
 | ||||
| +				goto out_cleanup_disk;
 | ||||
| +
 | ||||
| +			if (dev->disk_attributes) {
 | ||||
| +				ret = sysfs_create_group(&disk_to_dev(dev->disk)->kobj,
 | ||||
| +							dev->disk_attributes);
 | ||||
| +				WARN_ON(ret);
 | ||||
| +			}
 | ||||
| +		}
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	return;
 | ||||
| +
 | ||||
| +out_cleanup_disk:
 | ||||
| +	put_disk(dev->disk);
 | ||||
| +}
 | ||||
| +
 | ||||
|  int del_mtd_blktrans_dev(struct mtd_blktrans_dev *old) | ||||
|  { | ||||
|  	unsigned long flags; | ||||
| --- a/drivers/mtd/mtdcore.c
 | ||||
| +++ b/drivers/mtd/mtdcore.c
 | ||||
| @@ -32,6 +32,7 @@
 | ||||
|   | ||||
|  #include <linux/mtd/mtd.h> | ||||
|  #include <linux/mtd/partitions.h> | ||||
| +#include <linux/mtd/blktrans.h>
 | ||||
|   | ||||
|  #include "mtdcore.h" | ||||
|   | ||||
| @@ -1074,6 +1075,8 @@ int mtd_device_parse_register(struct mtd
 | ||||
|  		register_reboot_notifier(&mtd->reboot_notifier); | ||||
|  	} | ||||
|   | ||||
| +	register_mtd_blktrans_devs();
 | ||||
| +
 | ||||
|  out: | ||||
|  	if (ret) { | ||||
|  		nvmem_unregister(mtd->otp_user_nvmem); | ||||
| --- a/include/linux/mtd/blktrans.h
 | ||||
| +++ b/include/linux/mtd/blktrans.h
 | ||||
| @@ -76,6 +76,7 @@ extern int deregister_mtd_blktrans(struc
 | ||||
|  extern int add_mtd_blktrans_dev(struct mtd_blktrans_dev *dev); | ||||
|  extern int del_mtd_blktrans_dev(struct mtd_blktrans_dev *dev); | ||||
|  extern int mtd_blktrans_cease_background(struct mtd_blktrans_dev *dev); | ||||
| +extern void register_mtd_blktrans_devs(void);
 | ||||
|   | ||||
|  /** | ||||
|   * module_mtd_blktrans() - Helper macro for registering a mtd blktrans driver | ||||
|  | @ -0,0 +1,217 @@ | |||
| From 69357074558daf6ff24c9f58714935e9e095a865 Mon Sep 17 00:00:00 2001 | ||||
| From: OpenWrt community <openwrt-devel@lists.openwrt.org> | ||||
| Date: Wed, 13 Jul 2022 13:37:33 +0200 | ||||
| Subject: [PATCH] kernel: add block fit partition parser | ||||
| 
 | ||||
| ---
 | ||||
|  block/blk.h                     |  2 ++ | ||||
|  block/partitions/Kconfig        |  7 +++++++ | ||||
|  block/partitions/Makefile       |  1 + | ||||
|  block/partitions/check.h        |  3 +++ | ||||
|  block/partitions/core.c         | 17 +++++++++++++++++ | ||||
|  block/partitions/efi.c          |  8 ++++++++ | ||||
|  block/partitions/efi.h          |  3 +++ | ||||
|  block/partitions/msdos.c        | 10 ++++++++++ | ||||
|  drivers/mtd/mtd_blkdevs.c       |  2 ++ | ||||
|  drivers/mtd/ubi/block.c         |  3 +++ | ||||
|  include/linux/msdos_partition.h |  1 + | ||||
|  11 files changed, 57 insertions(+) | ||||
| 
 | ||||
| --- a/block/blk.h
 | ||||
| +++ b/block/blk.h
 | ||||
| @@ -414,6 +414,8 @@ void blk_free_ext_minor(unsigned int min
 | ||||
|  #define ADDPART_FLAG_NONE	0 | ||||
|  #define ADDPART_FLAG_RAID	1 | ||||
|  #define ADDPART_FLAG_WHOLEDISK	2 | ||||
| +#define ADDPART_FLAG_READONLY	4
 | ||||
| +#define ADDPART_FLAG_ROOTDEV	8
 | ||||
|  int bdev_add_partition(struct gendisk *disk, int partno, sector_t start, | ||||
|  		sector_t length); | ||||
|  int bdev_del_partition(struct gendisk *disk, int partno); | ||||
| --- a/block/partitions/Kconfig
 | ||||
| +++ b/block/partitions/Kconfig
 | ||||
| @@ -103,6 +103,13 @@ config ATARI_PARTITION
 | ||||
|  	  Say Y here if you would like to use hard disks under Linux which | ||||
|  	  were partitioned under the Atari OS. | ||||
|   | ||||
| +config FIT_PARTITION
 | ||||
| +	bool "Flattened-Image-Tree (FIT) partition support" if PARTITION_ADVANCED
 | ||||
| +	default n
 | ||||
| +	help
 | ||||
| +	  Say Y here if your system needs to mount the filesystem part of
 | ||||
| +	  a Flattened-Image-Tree (FIT) image commonly used with Das U-Boot.
 | ||||
| +
 | ||||
|  config IBM_PARTITION | ||||
|  	bool "IBM disk label and partition support" | ||||
|  	depends on PARTITION_ADVANCED && S390 | ||||
| --- a/block/partitions/Makefile
 | ||||
| +++ b/block/partitions/Makefile
 | ||||
| @@ -8,6 +8,7 @@ obj-$(CONFIG_ACORN_PARTITION) += acorn.o
 | ||||
|  obj-$(CONFIG_AMIGA_PARTITION) += amiga.o | ||||
|  obj-$(CONFIG_ATARI_PARTITION) += atari.o | ||||
|  obj-$(CONFIG_AIX_PARTITION) += aix.o | ||||
| +obj-$(CONFIG_FIT_PARTITION) += fit.o
 | ||||
|  obj-$(CONFIG_CMDLINE_PARTITION) += cmdline.o | ||||
|  obj-$(CONFIG_MAC_PARTITION) += mac.o | ||||
|  obj-$(CONFIG_LDM_PARTITION) += ldm.o | ||||
| --- a/block/partitions/check.h
 | ||||
| +++ b/block/partitions/check.h
 | ||||
| @@ -57,6 +57,7 @@ int amiga_partition(struct parsed_partit
 | ||||
|  int atari_partition(struct parsed_partitions *state); | ||||
|  int cmdline_partition(struct parsed_partitions *state); | ||||
|  int efi_partition(struct parsed_partitions *state); | ||||
| +int fit_partition(struct parsed_partitions *state);
 | ||||
|  int ibm_partition(struct parsed_partitions *); | ||||
|  int karma_partition(struct parsed_partitions *state); | ||||
|  int ldm_partition(struct parsed_partitions *state); | ||||
| @@ -67,3 +68,5 @@ int sgi_partition(struct parsed_partitio
 | ||||
|  int sun_partition(struct parsed_partitions *state); | ||||
|  int sysv68_partition(struct parsed_partitions *state); | ||||
|  int ultrix_partition(struct parsed_partitions *state); | ||||
| +
 | ||||
| +int parse_fit_partitions(struct parsed_partitions *state, u64 start_sector, u64 nr_sectors, int *slot, int add_remain);
 | ||||
| --- a/block/partitions/core.c
 | ||||
| +++ b/block/partitions/core.c
 | ||||
| @@ -10,6 +10,10 @@
 | ||||
|  #include <linux/ctype.h> | ||||
|  #include <linux/vmalloc.h> | ||||
|  #include <linux/raid/detect.h> | ||||
| +#ifdef CONFIG_FIT_PARTITION
 | ||||
| +#include <linux/root_dev.h>
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #include "check.h" | ||||
|   | ||||
|  static int (*check_part[])(struct parsed_partitions *) = { | ||||
| @@ -46,6 +50,9 @@ static int (*check_part[])(struct parsed
 | ||||
|  #ifdef CONFIG_EFI_PARTITION | ||||
|  	efi_partition,		/* this must come before msdos */ | ||||
|  #endif | ||||
| +#ifdef CONFIG_FIT_PARTITION
 | ||||
| +	fit_partition,
 | ||||
| +#endif
 | ||||
|  #ifdef CONFIG_SGI_PARTITION | ||||
|  	sgi_partition, | ||||
|  #endif | ||||
| @@ -398,6 +405,11 @@ static struct block_device *add_partitio
 | ||||
|  			goto out_del; | ||||
|  	} | ||||
|   | ||||
| +#ifdef CONFIG_FIT_PARTITION
 | ||||
| +	if (flags & ADDPART_FLAG_READONLY)
 | ||||
| +		bdev->bd_read_only = true;
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  	/* everything is up and running, commence */ | ||||
|  	err = xa_insert(&disk->part_tbl, partno, bdev, GFP_KERNEL); | ||||
|  	if (err) | ||||
| @@ -585,6 +597,11 @@ static bool blk_add_partition(struct gen
 | ||||
|  	    (state->parts[p].flags & ADDPART_FLAG_RAID)) | ||||
|  		md_autodetect_dev(part->bd_dev); | ||||
|   | ||||
| +#ifdef CONFIG_FIT_PARTITION
 | ||||
| +	if ((state->parts[p].flags & ADDPART_FLAG_ROOTDEV) && ROOT_DEV == 0)
 | ||||
| +		ROOT_DEV = part->bd_dev;
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  	return true; | ||||
|  } | ||||
|   | ||||
| --- a/block/partitions/efi.c
 | ||||
| +++ b/block/partitions/efi.c
 | ||||
| @@ -716,6 +716,9 @@ int efi_partition(struct parsed_partitio
 | ||||
|  	gpt_entry *ptes = NULL; | ||||
|  	u32 i; | ||||
|  	unsigned ssz = queue_logical_block_size(state->disk->queue) / 512; | ||||
| +#ifdef CONFIG_FIT_PARTITION
 | ||||
| +	u32 extra_slot = 64;
 | ||||
| +#endif
 | ||||
|   | ||||
|  	if (!find_valid_gpt(state, &gpt, &ptes) || !gpt || !ptes) { | ||||
|  		kfree(gpt); | ||||
| @@ -749,6 +752,11 @@ int efi_partition(struct parsed_partitio
 | ||||
|  				ARRAY_SIZE(ptes[i].partition_name)); | ||||
|  		utf16_le_to_7bit(ptes[i].partition_name, label_max, info->volname); | ||||
|  		state->parts[i + 1].has_info = true; | ||||
| +#ifdef CONFIG_FIT_PARTITION
 | ||||
| +		/* If this is a U-Boot FIT volume it may have subpartitions */
 | ||||
| +		if (!efi_guidcmp(ptes[i].partition_type_guid, PARTITION_LINUX_FIT_GUID))
 | ||||
| +			(void) parse_fit_partitions(state, start * ssz, size * ssz, &extra_slot, 1);
 | ||||
| +#endif
 | ||||
|  	} | ||||
|  	kfree(ptes); | ||||
|  	kfree(gpt); | ||||
| --- a/block/partitions/efi.h
 | ||||
| +++ b/block/partitions/efi.h
 | ||||
| @@ -51,6 +51,9 @@
 | ||||
|  #define PARTITION_LINUX_LVM_GUID \ | ||||
|      EFI_GUID( 0xe6d6d379, 0xf507, 0x44c2, \ | ||||
|                0xa2, 0x3c, 0x23, 0x8f, 0x2a, 0x3d, 0xf9, 0x28) | ||||
| +#define PARTITION_LINUX_FIT_GUID \
 | ||||
| +    EFI_GUID( 0xcae9be83, 0xb15f, 0x49cc, \
 | ||||
| +              0x86, 0x3f, 0x08, 0x1b, 0x74, 0x4a, 0x2d, 0x93)
 | ||||
|   | ||||
|  typedef struct _gpt_header { | ||||
|  	__le64 signature; | ||||
| --- a/block/partitions/msdos.c
 | ||||
| +++ b/block/partitions/msdos.c
 | ||||
| @@ -564,6 +564,15 @@ static void parse_minix(struct parsed_pa
 | ||||
|  #endif /* CONFIG_MINIX_SUBPARTITION */ | ||||
|  } | ||||
|   | ||||
| +static void parse_fit_mbr(struct parsed_partitions *state,
 | ||||
| +			  sector_t offset, sector_t size, int origin)
 | ||||
| +{
 | ||||
| +#ifdef CONFIG_FIT_PARTITION
 | ||||
| +	u32 extra_slot = 64;
 | ||||
| +	(void) parse_fit_partitions(state, offset, size, &extra_slot, 1);
 | ||||
| +#endif /* CONFIG_FIT_PARTITION */
 | ||||
| +}
 | ||||
| +
 | ||||
|  static struct { | ||||
|  	unsigned char id; | ||||
|  	void (*parse)(struct parsed_partitions *, sector_t, sector_t, int); | ||||
| @@ -575,6 +584,7 @@ static struct {
 | ||||
|  	{UNIXWARE_PARTITION, parse_unixware}, | ||||
|  	{SOLARIS_X86_PARTITION, parse_solaris_x86}, | ||||
|  	{NEW_SOLARIS_X86_PARTITION, parse_solaris_x86}, | ||||
| +	{FIT_PARTITION, parse_fit_mbr},
 | ||||
|  	{0, NULL}, | ||||
|  }; | ||||
|   | ||||
| --- a/drivers/mtd/mtd_blkdevs.c
 | ||||
| +++ b/drivers/mtd/mtd_blkdevs.c
 | ||||
| @@ -359,7 +359,9 @@ int add_mtd_blktrans_dev(struct mtd_blkt
 | ||||
|  	} else { | ||||
|  		snprintf(gd->disk_name, sizeof(gd->disk_name), | ||||
|  			 "%s%d", tr->name, new->devnum); | ||||
| -		gd->flags |= GENHD_FL_NO_PART;
 | ||||
| +
 | ||||
| +		if (!IS_ENABLED(CONFIG_FIT_PARTITION) || mtd_type_is_nand(new->mtd))
 | ||||
| +			gd->flags |= GENHD_FL_NO_PART;
 | ||||
|  	} | ||||
|   | ||||
|  	set_capacity(gd, ((u64)new->size * tr->blksize) >> 9); | ||||
| --- a/drivers/mtd/ubi/block.c
 | ||||
| +++ b/drivers/mtd/ubi/block.c
 | ||||
| @@ -431,7 +431,9 @@ int ubiblock_create(struct ubi_volume_in
 | ||||
|  		ret = -ENODEV; | ||||
|  		goto out_cleanup_disk; | ||||
|  	} | ||||
| -	gd->flags |= GENHD_FL_NO_PART;
 | ||||
| +	if (!IS_ENABLED(CONFIG_FIT_PARTITION))
 | ||||
| +		gd->flags |= GENHD_FL_NO_PART;
 | ||||
| +
 | ||||
|  	gd->private_data = dev; | ||||
|  	sprintf(gd->disk_name, "ubiblock%d_%d", dev->ubi_num, dev->vol_id); | ||||
|  	set_capacity(gd, disk_capacity); | ||||
| --- a/include/linux/msdos_partition.h
 | ||||
| +++ b/include/linux/msdos_partition.h
 | ||||
| @@ -31,6 +31,7 @@ enum msdos_sys_ind {
 | ||||
|  	LINUX_LVM_PARTITION = 0x8e, | ||||
|  	LINUX_RAID_PARTITION = 0xfd,	/* autodetect RAID partition */ | ||||
|   | ||||
| +	FIT_PARTITION = 0x2e,		/* U-Boot uImage.FIT */
 | ||||
|  	SOLARIS_X86_PARTITION =	0x82,	/* also Linux swap partitions */ | ||||
|  	NEW_SOLARIS_X86_PARTITION = 0xbf, | ||||
|   | ||||
|  | @ -0,0 +1,120 @@ | |||
| From 6fa9e3678eb002246df1280322b6a024853950a5 Mon Sep 17 00:00:00 2001 | ||||
| From: Ansuel Smith <ansuelsmth@gmail.com> | ||||
| Date: Mon, 11 Oct 2021 00:53:14 +0200 | ||||
| Subject: [PATCH] drivers: mtd: parsers: add nvmem support to cmdlinepart | ||||
| 
 | ||||
| Assuming cmdlinepart is only one level deep partition scheme and that | ||||
| static partition are also defined in DTS, we can assign an of_node for | ||||
| partition declared from bootargs. cmdlinepart have priority than | ||||
| fiexed-partition parser so in this specific case the parser doesn't | ||||
| assign an of_node. Fix this by searching a defined of_node using a | ||||
| similar fixed_partition parser and if a partition is found with the same | ||||
| label, check that it has the same offset and size and return the DT | ||||
| of_node to correctly use NVMEM cells. | ||||
| 
 | ||||
| Signed-off-by: Ansuel Smith <ansuelsmth@gmail.com> | ||||
| ---
 | ||||
|  drivers/mtd/parsers/cmdlinepart.c | 71 +++++++++++++++++++++++++++++++ | ||||
|  1 file changed, 71 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/mtd/parsers/cmdlinepart.c
 | ||||
| +++ b/drivers/mtd/parsers/cmdlinepart.c
 | ||||
| @@ -43,6 +43,7 @@
 | ||||
|  #include <linux/mtd/partitions.h> | ||||
|  #include <linux/module.h> | ||||
|  #include <linux/err.h> | ||||
| +#include <linux/of.h>
 | ||||
|   | ||||
|  /* debug macro */ | ||||
|  #if 0 | ||||
| @@ -323,6 +324,68 @@ static int mtdpart_setup_real(char *s)
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +static int search_fixed_partition(struct mtd_info *master,
 | ||||
| +				  struct mtd_partition *target_part,
 | ||||
| +				  struct mtd_partition *fixed_part)
 | ||||
| +{
 | ||||
| +	struct device_node *mtd_node;
 | ||||
| +	struct device_node *ofpart_node;
 | ||||
| +	struct device_node *pp;
 | ||||
| +	struct mtd_partition part;
 | ||||
| +	const char *partname;
 | ||||
| +
 | ||||
| +	mtd_node = mtd_get_of_node(master);
 | ||||
| +	if (!mtd_node)
 | ||||
| +		return -EINVAL;
 | ||||
| +
 | ||||
| +	ofpart_node = of_get_child_by_name(mtd_node, "partitions");
 | ||||
| +
 | ||||
| +	for_each_child_of_node(ofpart_node,  pp) {
 | ||||
| +		const __be32 *reg;
 | ||||
| +		int len;
 | ||||
| +		int a_cells, s_cells;
 | ||||
| +
 | ||||
| +		reg = of_get_property(pp, "reg", &len);
 | ||||
| +		if (!reg) {
 | ||||
| +			pr_debug("%s: ofpart partition %pOF (%pOF) missing reg property.\n",
 | ||||
| +				 master->name, pp,
 | ||||
| +				 mtd_node);
 | ||||
| +			continue;
 | ||||
| +		}
 | ||||
| +
 | ||||
| +		a_cells = of_n_addr_cells(pp);
 | ||||
| +		s_cells = of_n_size_cells(pp);
 | ||||
| +		if (len / 4 != a_cells + s_cells) {
 | ||||
| +			pr_debug("%s: ofpart partition %pOF (%pOF) error parsing reg property.\n",
 | ||||
| +				 master->name, pp,
 | ||||
| +				 mtd_node);
 | ||||
| +			continue;
 | ||||
| +		}
 | ||||
| +
 | ||||
| +		part.offset = of_read_number(reg, a_cells);
 | ||||
| +		part.size = of_read_number(reg + a_cells, s_cells);
 | ||||
| +		part.of_node = pp;
 | ||||
| +
 | ||||
| +		partname = of_get_property(pp, "label", &len);
 | ||||
| +		if (!partname)
 | ||||
| +			partname = of_get_property(pp, "name", &len);
 | ||||
| +		part.name = partname;
 | ||||
| +
 | ||||
| +		if (!strncmp(target_part->name, part.name, len)) {
 | ||||
| +			if (part.offset != target_part->offset)
 | ||||
| +				return -EINVAL;
 | ||||
| +
 | ||||
| +			if (part.size != target_part->size)
 | ||||
| +				return -EINVAL;
 | ||||
| +
 | ||||
| +			memcpy(fixed_part, &part, sizeof(struct mtd_partition));
 | ||||
| +			return 0;
 | ||||
| +		}
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	return -EINVAL;
 | ||||
| +}
 | ||||
| +
 | ||||
|  /* | ||||
|   * Main function to be called from the MTD mapping driver/device to | ||||
|   * obtain the partitioning information. At this point the command line | ||||
| @@ -338,6 +401,7 @@ static int parse_cmdline_partitions(stru
 | ||||
|  	int i, err; | ||||
|  	struct cmdline_mtd_partition *part; | ||||
|  	const char *mtd_id = master->name; | ||||
| +	struct mtd_partition fixed_part;
 | ||||
|   | ||||
|  	/* parse command line */ | ||||
|  	if (!cmdline_parsed) { | ||||
| @@ -382,6 +446,13 @@ static int parse_cmdline_partitions(stru
 | ||||
|  				sizeof(*part->parts) * (part->num_parts - i)); | ||||
|  			i--; | ||||
|  		} | ||||
| +
 | ||||
| +		err = search_fixed_partition(master, &part->parts[i], &fixed_part);
 | ||||
| +		if (!err) {
 | ||||
| +			part->parts[i].of_node = fixed_part.of_node;
 | ||||
| +			pr_info("Found partition defined in DT for %s. Assigning OF node to support nvmem.",
 | ||||
| +				part->parts[i].name);
 | ||||
| +		}
 | ||||
|  	} | ||||
|   | ||||
|  	*pparts = kmemdup(part->parts, sizeof(*part->parts) * part->num_parts, | ||||
							
								
								
									
										33
									
								
								6.6/target/linux/generic/hack-6.6/430-mtk-bmt-support.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								6.6/target/linux/generic/hack-6.6/430-mtk-bmt-support.patch
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,33 @@ | |||
| From ac84397efb3b3868c71c10ad7521161773228a17 Mon Sep 17 00:00:00 2001 | ||||
| From: OpenWrt community <openwrt-devel@lists.openwrt.org> | ||||
| Date: Wed, 13 Jul 2022 13:41:44 +0200 | ||||
| Subject: [PATCH] mtd/nand: add MediaTek NAND bad block managment table | ||||
| 
 | ||||
| ---
 | ||||
|  drivers/mtd/nand/Kconfig  | 4 ++++ | ||||
|  drivers/mtd/nand/Makefile | 1 + | ||||
|  2 files changed, 5 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/mtd/nand/Kconfig
 | ||||
| +++ b/drivers/mtd/nand/Kconfig
 | ||||
| @@ -46,6 +46,10 @@ config MTD_NAND_ECC_SW_BCH
 | ||||
|  	  ECC codes. They are used with NAND devices requiring more than 1 bit | ||||
|  	  of error correction. | ||||
|   | ||||
| +config MTD_NAND_MTK_BMT
 | ||||
| +	bool "Support MediaTek NAND Bad-block Management Table"
 | ||||
| +	default n
 | ||||
| +
 | ||||
|  config MTD_NAND_ECC_MXIC | ||||
|  	bool "Macronix external hardware ECC engine" | ||||
|  	depends on HAS_IOMEM | ||||
| --- a/drivers/mtd/nand/Makefile
 | ||||
| +++ b/drivers/mtd/nand/Makefile
 | ||||
| @@ -3,6 +3,7 @@
 | ||||
|  nandcore-objs := core.o bbt.o | ||||
|  obj-$(CONFIG_MTD_NAND_CORE) += nandcore.o | ||||
|  obj-$(CONFIG_MTD_NAND_ECC_MEDIATEK) += ecc-mtk.o | ||||
| +obj-$(CONFIG_MTD_NAND_MTK_BMT)	+= mtk_bmt.o mtk_bmt_v2.o mtk_bmt_bbt.o mtk_bmt_nmbm.o
 | ||||
|   | ||||
|  obj-y	+= onenand/ | ||||
|  obj-y	+= raw/ | ||||
|  | @ -0,0 +1,214 @@ | |||
| From eda40b8c8c82e0f2789d6bc8bf63846dce2e8f32 Mon Sep 17 00:00:00 2001 | ||||
| From: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | ||||
| Date: Sat, 23 Mar 2019 09:29:49 +0000 | ||||
| Subject: [PATCH] netfilter: connmark: introduce set-dscpmark | ||||
| 
 | ||||
| set-dscpmark is a method of storing the DSCP of an ip packet into | ||||
| conntrack mark.  In combination with a suitable tc filter action | ||||
| (act_ctinfo) DSCP values are able to be stored in the mark on egress and | ||||
| restored on ingress across links that otherwise alter or bleach DSCP. | ||||
| 
 | ||||
| This is useful for qdiscs such as CAKE which are able to shape according | ||||
| to policies based on DSCP. | ||||
| 
 | ||||
| Ingress classification is traditionally a challenging task since | ||||
| iptables rules haven't yet run and tc filter/eBPF programs are pre-NAT | ||||
| lookups, hence are unable to see internal IPv4 addresses as used on the | ||||
| typical home masquerading gateway. | ||||
| 
 | ||||
| x_tables CONNMARK set-dscpmark target solves the problem of storing the | ||||
| DSCP to the conntrack mark in a way suitable for the new act_ctinfo tc | ||||
| action to restore. | ||||
| 
 | ||||
| The set-dscpmark option accepts 2 parameters, a 32bit 'dscpmask' and a | ||||
| 32bit 'statemask'.  The dscp mask must be 6 contiguous bits and | ||||
| represents the area where the DSCP will be stored in the connmark.  The | ||||
| state mask is a minimum 1 bit length mask that must not overlap with the | ||||
| dscpmask.  It represents a flag which is set when the DSCP has been | ||||
| stored in the conntrack mark. This is useful to implement a 'one shot' | ||||
| iptables based classification where the 'complicated' iptables rules are | ||||
| only run once to classify the connection on initial (egress) packet and | ||||
| subsequent packets are all marked/restored with the same DSCP.  A state | ||||
| mask of zero disables the setting of a status bit/s. | ||||
| 
 | ||||
| example syntax with a suitably modified iptables user space application: | ||||
| 
 | ||||
| iptables -A QOS_MARK_eth0 -t mangle -j CONNMARK --set-dscpmark 0xfc000000/0x01000000 | ||||
| 
 | ||||
| Would store the DSCP in the top 6 bits of the 32bit mark field, and use | ||||
| the LSB of the top byte as the 'DSCP has been stored' marker. | ||||
| 
 | ||||
| |----0xFC----conntrack mark----000000---| | ||||
| | Bits 31-26 | bit 25 | bit24 |~~~ Bit 0| | ||||
| | DSCP       | unused | flag  |unused   | | ||||
| |-----------------------0x01---000000---| | ||||
|       ^                   ^ | ||||
|       |                   | | ||||
|       ---|             Conditional flag | ||||
|          |             set this when dscp | ||||
| |-ip diffserv-|        stored in mark | ||||
| | 6 bits      | | ||||
| |-------------| | ||||
| 
 | ||||
| an identically configured tc action to restore looks like: | ||||
| 
 | ||||
| tc filter show dev eth0 ingress | ||||
| filter parent ffff: protocol all pref 10 u32 chain 0 | ||||
| filter parent ffff: protocol all pref 10 u32 chain 0 fh 800: ht divisor 1 | ||||
| filter parent ffff: protocol all pref 10 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1: not_in_hw | ||||
|   match 00000000/00000000 at 0 | ||||
| 	action order 1: ctinfo zone 0 pipe | ||||
| 	 index 2 ref 1 bind 1 dscp 0xfc000000/0x1000000 | ||||
| 
 | ||||
| 	action order 2: mirred (Egress Redirect to device ifb4eth0) stolen | ||||
| 	index 1 ref 1 bind 1 | ||||
| 
 | ||||
| |----0xFC----conntrack mark----000000---| | ||||
| | Bits 31-26 | bit 25 | bit24 |~~~ Bit 0| | ||||
| | DSCP       | unused | flag  |unused   | | ||||
| |-----------------------0x01---000000---| | ||||
|       |                   | | ||||
|       |                   | | ||||
|       ---|             Conditional flag | ||||
|          v             only restore if set | ||||
| |-ip diffserv-| | ||||
| | 6 bits      | | ||||
| |-------------| | ||||
| 
 | ||||
| Signed-off-by: Kevin Darbyshire-Bryant <ldir@darbyshire-bryant.me.uk> | ||||
| ---
 | ||||
|  include/uapi/linux/netfilter/xt_connmark.h | 10 ++++ | ||||
|  net/netfilter/xt_connmark.c                | 55 ++++++++++++++++++---- | ||||
|  2 files changed, 57 insertions(+), 8 deletions(-) | ||||
| 
 | ||||
| --- a/include/uapi/linux/netfilter/xt_connmark.h
 | ||||
| +++ b/include/uapi/linux/netfilter/xt_connmark.h
 | ||||
| @@ -15,6 +15,11 @@ enum {
 | ||||
|  }; | ||||
|   | ||||
|  enum { | ||||
| +	XT_CONNMARK_VALUE =	(1 << 0),
 | ||||
| +	XT_CONNMARK_DSCP = 	(1 << 1)
 | ||||
| +};
 | ||||
| +
 | ||||
| +enum {
 | ||||
|  	D_SHIFT_LEFT = 0, | ||||
|  	D_SHIFT_RIGHT, | ||||
|  }; | ||||
| @@ -29,6 +34,11 @@ struct xt_connmark_tginfo2 {
 | ||||
|  	__u8 shift_dir, shift_bits, mode; | ||||
|  }; | ||||
|   | ||||
| +struct xt_connmark_tginfo3 {
 | ||||
| +	__u32 ctmark, ctmask, nfmask;
 | ||||
| +	__u8 shift_dir, shift_bits, mode, func;
 | ||||
| +};
 | ||||
| +
 | ||||
|  struct xt_connmark_mtinfo1 { | ||||
|  	__u32 mark, mask; | ||||
|  	__u8 invert; | ||||
| --- a/net/netfilter/xt_connmark.c
 | ||||
| +++ b/net/netfilter/xt_connmark.c
 | ||||
| @@ -24,13 +24,13 @@ MODULE_ALIAS("ipt_connmark");
 | ||||
|  MODULE_ALIAS("ip6t_connmark"); | ||||
|   | ||||
|  static unsigned int | ||||
| -connmark_tg_shift(struct sk_buff *skb, const struct xt_connmark_tginfo2 *info)
 | ||||
| +connmark_tg_shift(struct sk_buff *skb, const struct xt_connmark_tginfo3 *info)
 | ||||
|  { | ||||
|  	enum ip_conntrack_info ctinfo; | ||||
|  	u_int32_t new_targetmark; | ||||
|  	struct nf_conn *ct; | ||||
|  	u_int32_t newmark; | ||||
| -	u_int32_t oldmark;
 | ||||
| +	u_int8_t dscp;
 | ||||
|   | ||||
|  	ct = nf_ct_get(skb, &ctinfo); | ||||
|  	if (ct == NULL) | ||||
| @@ -38,13 +38,24 @@ connmark_tg_shift(struct sk_buff *skb, c
 | ||||
|   | ||||
|  	switch (info->mode) { | ||||
|  	case XT_CONNMARK_SET: | ||||
| -		oldmark = READ_ONCE(ct->mark);
 | ||||
| -		newmark = (oldmark & ~info->ctmask) ^ info->ctmark;
 | ||||
| -		if (info->shift_dir == D_SHIFT_RIGHT)
 | ||||
| -			newmark >>= info->shift_bits;
 | ||||
| -		else
 | ||||
| -			newmark <<= info->shift_bits;
 | ||||
| +		newmark = READ_ONCE(ct->mark);
 | ||||
| +		if (info->func & XT_CONNMARK_VALUE) {
 | ||||
| +			newmark = (newmark & ~info->ctmask) ^ info->ctmark;
 | ||||
| +			if (info->shift_dir == D_SHIFT_RIGHT)
 | ||||
| +				newmark >>= info->shift_bits;
 | ||||
| +			else
 | ||||
| +				newmark <<= info->shift_bits;
 | ||||
| +		} else if (info->func & XT_CONNMARK_DSCP) {
 | ||||
| +			if (skb->protocol == htons(ETH_P_IP))
 | ||||
| +				dscp = ipv4_get_dsfield(ip_hdr(skb)) >> 2;
 | ||||
| +			else if (skb->protocol == htons(ETH_P_IPV6))
 | ||||
| +				dscp = ipv6_get_dsfield(ipv6_hdr(skb)) >> 2;
 | ||||
| +			else	/* protocol doesn't have diffserv */
 | ||||
| +				break;
 | ||||
|   | ||||
| +			newmark = (newmark & ~info->ctmark) |
 | ||||
| +				  (info->ctmask | (dscp << info->shift_bits));
 | ||||
| +		}
 | ||||
|  		if (READ_ONCE(ct->mark) != newmark) { | ||||
|  			WRITE_ONCE(ct->mark, newmark); | ||||
|  			nf_conntrack_event_cache(IPCT_MARK, ct); | ||||
| @@ -83,20 +94,36 @@ static unsigned int
 | ||||
|  connmark_tg(struct sk_buff *skb, const struct xt_action_param *par) | ||||
|  { | ||||
|  	const struct xt_connmark_tginfo1 *info = par->targinfo; | ||||
| -	const struct xt_connmark_tginfo2 info2 = {
 | ||||
| +	const struct xt_connmark_tginfo3 info3 = {
 | ||||
|  		.ctmark	= info->ctmark, | ||||
|  		.ctmask	= info->ctmask, | ||||
|  		.nfmask	= info->nfmask, | ||||
|  		.mode	= info->mode, | ||||
| +		.func	= XT_CONNMARK_VALUE
 | ||||
|  	}; | ||||
|   | ||||
| -	return connmark_tg_shift(skb, &info2);
 | ||||
| +	return connmark_tg_shift(skb, &info3);
 | ||||
|  } | ||||
|   | ||||
|  static unsigned int | ||||
|  connmark_tg_v2(struct sk_buff *skb, const struct xt_action_param *par) | ||||
|  { | ||||
|  	const struct xt_connmark_tginfo2 *info = par->targinfo; | ||||
| +	const struct xt_connmark_tginfo3 info3 = {
 | ||||
| +		.ctmark	= info->ctmark,
 | ||||
| +		.ctmask	= info->ctmask,
 | ||||
| +		.nfmask	= info->nfmask,
 | ||||
| +		.mode	= info->mode,
 | ||||
| +		.func	= XT_CONNMARK_VALUE
 | ||||
| +	};
 | ||||
| +
 | ||||
| +	return connmark_tg_shift(skb, &info3);
 | ||||
| +}
 | ||||
| +
 | ||||
| +static unsigned int
 | ||||
| +connmark_tg_v3(struct sk_buff *skb, const struct xt_action_param *par)
 | ||||
| +{
 | ||||
| +	const struct xt_connmark_tginfo3 *info = par->targinfo;
 | ||||
|   | ||||
|  	return connmark_tg_shift(skb, info); | ||||
|  } | ||||
| @@ -167,6 +194,16 @@ static struct xt_target connmark_tg_reg[
 | ||||
|  		.targetsize     = sizeof(struct xt_connmark_tginfo2), | ||||
|  		.destroy        = connmark_tg_destroy, | ||||
|  		.me             = THIS_MODULE, | ||||
| +	},
 | ||||
| +	{
 | ||||
| +		.name           = "CONNMARK",
 | ||||
| +		.revision       = 3,
 | ||||
| +		.family         = NFPROTO_UNSPEC,
 | ||||
| +		.checkentry     = connmark_tg_check,
 | ||||
| +		.target         = connmark_tg_v3,
 | ||||
| +		.targetsize     = sizeof(struct xt_connmark_tginfo3),
 | ||||
| +		.destroy        = connmark_tg_destroy,
 | ||||
| +		.me             = THIS_MODULE,
 | ||||
|  	} | ||||
|  }; | ||||
|   | ||||
|  | @ -0,0 +1,24 @@ | |||
| From 6d3bc769657b0ee7c7506dad9911111c4226a7ea Mon Sep 17 00:00:00 2001 | ||||
| From: Imre Kaloz <kaloz@openwrt.org> | ||||
| Date: Fri, 7 Jul 2017 17:21:05 +0200 | ||||
| Subject: mac80211: increase wireless mesh header size | ||||
| 
 | ||||
| lede-commit 3d4466cfd8f75f717efdb1f96fdde3c70d865fc1 | ||||
| Signed-off-by: Imre Kaloz <kaloz@openwrt.org> | ||||
| ---
 | ||||
|  include/linux/netdevice.h | 4 ++-- | ||||
|  1 file changed, 2 insertions(+), 2 deletions(-) | ||||
| 
 | ||||
| --- a/include/linux/netdevice.h
 | ||||
| +++ b/include/linux/netdevice.h
 | ||||
| @@ -149,8 +149,8 @@ static inline bool dev_xmit_complete(int
 | ||||
|   | ||||
|  #if defined(CONFIG_HYPERV_NET) | ||||
|  # define LL_MAX_HEADER 128 | ||||
| -#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25)
 | ||||
| -# if defined(CONFIG_MAC80211_MESH)
 | ||||
| +#elif defined(CONFIG_WLAN) || IS_ENABLED(CONFIG_AX25) || 1
 | ||||
| +# if defined(CONFIG_MAC80211_MESH) || 1
 | ||||
|  #  define LL_MAX_HEADER 128 | ||||
|  # else | ||||
|  #  define LL_MAX_HEADER 96 | ||||
|  | @ -0,0 +1,27 @@ | |||
| From a6ccb238939b25851474a279b20367fd24a0e816 Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Fri, 7 Jul 2017 17:21:53 +0200 | ||||
| Subject:  hack: net: fq_codel: tune defaults for small devices | ||||
| 
 | ||||
| Assume that x86_64 devices always have a big memory and do not need this  | ||||
| optimization compared to devices with only 32 MB or 64 MB RAM. | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
|  net/sched/sch_fq_codel.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| --- a/net/sched/sch_fq_codel.c
 | ||||
| +++ b/net/sched/sch_fq_codel.c
 | ||||
| @@ -471,7 +471,11 @@ static int fq_codel_init(struct Qdisc *s
 | ||||
|   | ||||
|  	sch->limit = 10*1024; | ||||
|  	q->flows_cnt = 1024; | ||||
| +#ifdef CONFIG_X86_64
 | ||||
|  	q->memory_limit = 32 << 20; /* 32 MBytes */ | ||||
| +#else
 | ||||
| +	q->memory_limit = 4 << 20; /* 4 MBytes */
 | ||||
| +#endif
 | ||||
|  	q->drop_batch_size = 64; | ||||
|  	q->quantum = psched_mtu(qdisc_dev(sch)); | ||||
|  	INIT_LIST_HEAD(&q->new_flows); | ||||
|  | @ -0,0 +1,25 @@ | |||
| From 804fbb3f2ec9283f7b778e057a68bfff440a0be6 Mon Sep 17 00:00:00 2001 | ||||
| From: Rui Salvaterra <rsalvaterra@gmail.com> | ||||
| Date: Wed, 30 Mar 2022 22:51:55 +0100 | ||||
| Subject: [PATCH] kernel: ct: size the hashtable more adequately | ||||
| 
 | ||||
| To set the default size of the connection tracking hash table, a divider of | ||||
| 16384 becomes inadequate for a router handling lots of connections. Divide by | ||||
| 2048 instead, making the default size scale better with the available RAM. | ||||
| 
 | ||||
| Signed-off-by: Rui Salvaterra <rsalvaterra@gmail.com> | ||||
| ---
 | ||||
|  net/netfilter/nf_conntrack_core.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| --- a/net/netfilter/nf_conntrack_core.c
 | ||||
| +++ b/net/netfilter/nf_conntrack_core.c
 | ||||
| @@ -2705,7 +2705,7 @@ int nf_conntrack_init_start(void)
 | ||||
|   | ||||
|  	if (!nf_conntrack_htable_size) { | ||||
|  		nf_conntrack_htable_size | ||||
| -			= (((nr_pages << PAGE_SHIFT) / 16384)
 | ||||
| +			= (((nr_pages << PAGE_SHIFT) / 2048)
 | ||||
|  			   / sizeof(struct hlist_head)); | ||||
|  		if (BITS_PER_LONG >= 64 && | ||||
|  		    nr_pages > (4 * (1024 * 1024 * 1024 / PAGE_SIZE))) | ||||
|  | @ -0,0 +1,131 @@ | |||
| From 36e516290611e613aa92996cb4339561452695b4 Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Fri, 7 Jul 2017 17:24:23 +0200 | ||||
| Subject: net: swconfig: adds openwrt switch layer | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
|  drivers/net/phy/Kconfig   | 83 +++++++++++++++++++++++++++++++++++++++++++++++ | ||||
|  drivers/net/phy/Makefile  | 15 +++++++++ | ||||
|  include/uapi/linux/Kbuild |  1 + | ||||
|  3 files changed, 99 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/phy/Kconfig
 | ||||
| +++ b/drivers/net/phy/Kconfig
 | ||||
| @@ -69,6 +69,80 @@ config SFP
 | ||||
|  	depends on HWMON || HWMON=n | ||||
|  	select MDIO_I2C | ||||
|   | ||||
| +comment "Switch configuration API + drivers"
 | ||||
| +
 | ||||
| +config SWCONFIG
 | ||||
| +	tristate "Switch configuration API"
 | ||||
| +	help
 | ||||
| +	  Switch configuration API using netlink. This allows
 | ||||
| +	  you to configure the VLAN features of certain switches.
 | ||||
| +
 | ||||
| +config SWCONFIG_LEDS
 | ||||
| +	bool "Switch LED trigger support"
 | ||||
| +	depends on (SWCONFIG && LEDS_TRIGGERS)
 | ||||
| +
 | ||||
| +config ADM6996_PHY
 | ||||
| +	tristate "Driver for ADM6996 switches"
 | ||||
| +	select SWCONFIG
 | ||||
| +	help
 | ||||
| +	  Currently supports the ADM6996FC and ADM6996M switches.
 | ||||
| +	  Support for FC is very limited.
 | ||||
| +
 | ||||
| +config AR8216_PHY
 | ||||
| +	tristate "Driver for Atheros AR8216/8327 switches"
 | ||||
| +	select SWCONFIG
 | ||||
| +	select ETHERNET_PACKET_MANGLE
 | ||||
| +
 | ||||
| +config AR8216_PHY_LEDS
 | ||||
| +	bool "Atheros AR8216 switch LED support"
 | ||||
| +	depends on (AR8216_PHY && LEDS_CLASS)
 | ||||
| +
 | ||||
| +source "drivers/net/phy/b53/Kconfig"
 | ||||
| +
 | ||||
| +config IP17XX_PHY
 | ||||
| +	tristate "Driver for IC+ IP17xx switches"
 | ||||
| +	select SWCONFIG
 | ||||
| +
 | ||||
| +config PSB6970_PHY
 | ||||
| +	tristate "Lantiq XWAY Tantos (PSB6970) Ethernet switch"
 | ||||
| +	select SWCONFIG
 | ||||
| +
 | ||||
| +config RTL8306_PHY
 | ||||
| +	tristate "Driver for Realtek RTL8306S switches"
 | ||||
| +	select SWCONFIG
 | ||||
| +
 | ||||
| +config RTL8366_SMI
 | ||||
| +	tristate "Driver for the RTL8366 SMI interface"
 | ||||
| +	depends on GPIOLIB
 | ||||
| +	help
 | ||||
| +	  This module implements the SMI interface protocol which is used
 | ||||
| +	  by some RTL8366 ethernet switch devices via the generic GPIO API.
 | ||||
| +
 | ||||
| +if RTL8366_SMI
 | ||||
| +
 | ||||
| +config RTL8366_SMI_DEBUG_FS
 | ||||
| +	bool "RTL8366 SMI interface debugfs support"
 | ||||
| +        depends on DEBUG_FS
 | ||||
| +        default n
 | ||||
| +
 | ||||
| +config RTL8366S_PHY
 | ||||
| +	tristate "Driver for the Realtek RTL8366S switch"
 | ||||
| +	select SWCONFIG
 | ||||
| +
 | ||||
| +config RTL8366RB_PHY
 | ||||
| +	tristate "Driver for the Realtek RTL8366RB switch"
 | ||||
| +	select SWCONFIG
 | ||||
| +
 | ||||
| +config RTL8367_PHY
 | ||||
| +	tristate "Driver for the Realtek RTL8367R/M switches"
 | ||||
| +	select SWCONFIG
 | ||||
| +
 | ||||
| +config RTL8367B_PHY
 | ||||
| +	tristate "Driver fot the Realtek RTL8367R-VB switch"
 | ||||
| +	select SWCONFIG
 | ||||
| +
 | ||||
| +endif # RTL8366_SMI
 | ||||
| +
 | ||||
|  comment "MII PHY device drivers" | ||||
|   | ||||
|  config AMD_PHY | ||||
| --- a/drivers/net/phy/Makefile
 | ||||
| +++ b/drivers/net/phy/Makefile
 | ||||
| @@ -24,6 +24,21 @@ libphy-$(CONFIG_LED_TRIGGER_PHY)	+= phy_
 | ||||
|  obj-$(CONFIG_PHYLINK)		+= phylink.o | ||||
|  obj-$(CONFIG_PHYLIB)		+= libphy.o | ||||
|   | ||||
| +obj-$(CONFIG_SWCONFIG)		+= swconfig.o
 | ||||
| +obj-$(CONFIG_ADM6996_PHY)	+= adm6996.o
 | ||||
| +obj-$(CONFIG_AR8216_PHY)	+= ar8xxx.o
 | ||||
| +ar8xxx-y			+= ar8216.o
 | ||||
| +ar8xxx-y			+= ar8327.o
 | ||||
| +obj-$(CONFIG_SWCONFIG_B53)	+= b53/
 | ||||
| +obj-$(CONFIG_IP17XX_PHY)	+= ip17xx.o
 | ||||
| +obj-$(CONFIG_PSB6970_PHY)	+= psb6970.o
 | ||||
| +obj-$(CONFIG_RTL8306_PHY)	+= rtl8306.o
 | ||||
| +obj-$(CONFIG_RTL8366_SMI)	+= rtl8366_smi.o
 | ||||
| +obj-$(CONFIG_RTL8366S_PHY)	+= rtl8366s.o
 | ||||
| +obj-$(CONFIG_RTL8366RB_PHY)	+= rtl8366rb.o
 | ||||
| +obj-$(CONFIG_RTL8367_PHY)	+= rtl8367.o
 | ||||
| +obj-$(CONFIG_RTL8367B_PHY)	+= rtl8367b.o
 | ||||
| +
 | ||||
|  obj-$(CONFIG_NETWORK_PHY_TIMESTAMPING) += mii_timestamper.o | ||||
|   | ||||
|  obj-$(CONFIG_SFP)		+= sfp.o | ||||
| --- a/include/linux/platform_data/b53.h
 | ||||
| +++ b/include/linux/platform_data/b53.h
 | ||||
| @@ -29,6 +29,9 @@ struct b53_platform_data {
 | ||||
|  	u32 chip_id; | ||||
|  	u16 enabled_ports; | ||||
|   | ||||
| +	/* allow to specify an ethX alias */
 | ||||
| +	const char *alias;
 | ||||
| +
 | ||||
|  	/* only used by MMAP'd driver */ | ||||
|  	unsigned big_endian:1; | ||||
|  	void __iomem *regs; | ||||
|  | @ -0,0 +1,21 @@ | |||
| From ebd924d773223593142d417c41d4ee6fa16f1805 Mon Sep 17 00:00:00 2001 | ||||
| From: OpenWrt community <openwrt-devel@lists.openwrt.org> | ||||
| Date: Wed, 13 Jul 2022 13:45:56 +0200 | ||||
| Subject: [PATCH] net/dsa/mv88e6xxx: disable ATU violation | ||||
| 
 | ||||
| ---
 | ||||
|  drivers/net/dsa/mv88e6xxx/chip.c | 3 +++ | ||||
|  1 file changed, 3 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/dsa/mv88e6xxx/chip.c
 | ||||
| +++ b/drivers/net/dsa/mv88e6xxx/chip.c
 | ||||
| @@ -3486,6 +3486,9 @@ static int mv88e6xxx_setup_port(struct m
 | ||||
|  	else | ||||
|  		reg = 1 << port; | ||||
|   | ||||
| +	/* Disable ATU member violation interrupt */
 | ||||
| +	reg |= MV88E6XXX_PORT_ASSOC_VECTOR_IGNORE_WRONG;
 | ||||
| +
 | ||||
|  	err = mv88e6xxx_port_write(chip, port, MV88E6XXX_PORT_ASSOC_VECTOR, | ||||
|  				   reg); | ||||
|  	if (err) | ||||
							
								
								
									
										120
									
								
								6.6/target/linux/generic/hack-6.6/720-net-phy-add-aqr-phys.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								6.6/target/linux/generic/hack-6.6/720-net-phy-add-aqr-phys.patch
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,120 @@ | |||
| From: Birger Koblitz <git@birger-koblitz.de> | ||||
| Date: Sun, 5 Sep 2021 15:13:10 +0200 | ||||
| Subject: [PATCH] kernel: Add AQR113C and AQR813 support | ||||
| 
 | ||||
| This hack adds support for the Aquantia 4th generation, 10GBit | ||||
| PHYs AQR113C and AQR813. | ||||
| 
 | ||||
| Signed-off-by: Birger Koblitz <git@birger-koblitz.de> | ||||
| 
 | ||||
| --- a/drivers/net/phy/aquantia_main.c
 | ||||
| +++ b/drivers/net/phy/aquantia_main.c
 | ||||
| @@ -23,6 +23,7 @@
 | ||||
|  #define PHY_ID_AQCS109	0x03a1b5c2 | ||||
|  #define PHY_ID_AQR405	0x03a1b4b0 | ||||
|  #define PHY_ID_AQR113C	0x31c31c12 | ||||
| +#define PHY_ID_AQR813	0x31c31cb2
 | ||||
|   | ||||
|  #define MDIO_PHYXS_VEND_IF_STATUS		0xe812 | ||||
|  #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK	GENMASK(7, 3) | ||||
| @@ -415,6 +416,49 @@ static int aqr107_read_rate(struct phy_d
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +static int aqr113c_read_status(struct phy_device *phydev)
 | ||||
| +{
 | ||||
| +	int val, ret;
 | ||||
| +
 | ||||
| +	ret = aqr_read_status(phydev);
 | ||||
| +	if (ret)
 | ||||
| +		return ret;
 | ||||
| +
 | ||||
| +	if (!phydev->link || phydev->autoneg == AUTONEG_DISABLE)
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
| +	// On AQR113C, the speed returned by aqr_read_status is wrong
 | ||||
| +	aqr107_read_rate(phydev);
 | ||||
| +
 | ||||
| +	val = phy_read_mmd(phydev, MDIO_MMD_PHYXS, MDIO_PHYXS_VEND_IF_STATUS);
 | ||||
| +	if (val < 0)
 | ||||
| +		return val;
 | ||||
| +
 | ||||
| +	switch (FIELD_GET(MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK, val)) {
 | ||||
| +	case MDIO_PHYXS_VEND_IF_STATUS_TYPE_KR:
 | ||||
| +		phydev->interface = PHY_INTERFACE_MODE_10GKR;
 | ||||
| +		break;
 | ||||
| +	case MDIO_PHYXS_VEND_IF_STATUS_TYPE_XFI:
 | ||||
| +		phydev->interface = PHY_INTERFACE_MODE_10GBASER;
 | ||||
| +		break;
 | ||||
| +	case MDIO_PHYXS_VEND_IF_STATUS_TYPE_USXGMII:
 | ||||
| +		phydev->interface = PHY_INTERFACE_MODE_USXGMII;
 | ||||
| +		break;
 | ||||
| +	case MDIO_PHYXS_VEND_IF_STATUS_TYPE_SGMII:
 | ||||
| +		phydev->interface = PHY_INTERFACE_MODE_SGMII;
 | ||||
| +		break;
 | ||||
| +	case MDIO_PHYXS_VEND_IF_STATUS_TYPE_OCSGMII:
 | ||||
| +		phydev->interface = PHY_INTERFACE_MODE_2500BASEX;
 | ||||
| +		break;
 | ||||
| +	default:
 | ||||
| +		phydev->interface = PHY_INTERFACE_MODE_NA;
 | ||||
| +		break;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	/* Read downshifted rate from vendor register */
 | ||||
| +	return aqr107_read_rate(phydev);
 | ||||
| +}
 | ||||
| +
 | ||||
|  static int aqr107_read_status(struct phy_device *phydev) | ||||
|  { | ||||
|  	int val, ret; | ||||
| @@ -554,7 +598,7 @@ static void aqr107_chip_info(struct phy_
 | ||||
|  	build_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_FW_BUILD_ID, val); | ||||
|  	prov_id = FIELD_GET(VEND1_GLOBAL_RSVD_STAT1_PROV_ID, val); | ||||
|   | ||||
| -	phydev_dbg(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
 | ||||
| +	phydev_info(phydev, "FW %u.%u, Build %u, Provisioning %u\n",
 | ||||
|  		   fw_major, fw_minor, build_id, prov_id); | ||||
|  } | ||||
|   | ||||
| @@ -809,7 +853,7 @@ static struct phy_driver aqr_driver[] =
 | ||||
|  	.config_aneg    = aqr_config_aneg, | ||||
|  	.config_intr    = aqr_config_intr, | ||||
|  	.handle_interrupt       = aqr_handle_interrupt, | ||||
| -	.read_status    = aqr107_read_status,
 | ||||
| +	.read_status    = aqr113c_read_status,
 | ||||
|  	.get_tunable    = aqr107_get_tunable, | ||||
|  	.set_tunable    = aqr107_set_tunable, | ||||
|  	.suspend        = aqr107_suspend, | ||||
| @@ -819,6 +863,24 @@ static struct phy_driver aqr_driver[] =
 | ||||
|  	.get_stats      = aqr107_get_stats, | ||||
|  	.link_change_notify = aqr107_link_change_notify, | ||||
|  }, | ||||
| +{
 | ||||
| +	PHY_ID_MATCH_MODEL(PHY_ID_AQR813),
 | ||||
| +	.name		= "Aquantia AQR813",
 | ||||
| +	.probe		= aqr107_probe,
 | ||||
| +	.config_init	= aqr107_config_init,
 | ||||
| +	.config_aneg    = aqr_config_aneg,
 | ||||
| +	.config_intr	= aqr_config_intr,
 | ||||
| +	.handle_interrupt = aqr_handle_interrupt,
 | ||||
| +	.read_status	= aqr113c_read_status,
 | ||||
| +	.get_tunable    = aqr107_get_tunable,
 | ||||
| +	.set_tunable    = aqr107_set_tunable,
 | ||||
| +	.suspend	= aqr107_suspend,
 | ||||
| +	.resume		= aqr107_resume,
 | ||||
| +	.get_sset_count	= aqr107_get_sset_count,
 | ||||
| +	.get_strings	= aqr107_get_strings,
 | ||||
| +	.get_stats	= aqr107_get_stats,
 | ||||
| +	.link_change_notify = aqr107_link_change_notify,
 | ||||
| +},
 | ||||
|  }; | ||||
|   | ||||
|  module_phy_driver(aqr_driver); | ||||
| @@ -832,6 +894,7 @@ static struct mdio_device_id __maybe_unu
 | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQCS109) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR405) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, | ||||
| +	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR813) },
 | ||||
|  	{ } | ||||
|  }; | ||||
|   | ||||
|  | @ -0,0 +1,148 @@ | |||
| From 5f62951fba63a9f9cfff564209426bdea5fcc371 Mon Sep 17 00:00:00 2001 | ||||
| From: Alex Marginean <alexandru.marginean@nxp.com> | ||||
| Date: Tue, 27 Aug 2019 15:16:56 +0300 | ||||
| Subject: [PATCH] drivers: net: phy: aquantia: enable AQR112 and AQR412 | ||||
| 
 | ||||
| Adds support for AQR112 and AQR412 which is mostly based on existing code | ||||
| with the addition of code configuring the protocol on system side. | ||||
| This allows changing the system side protocol without having to deploy a | ||||
| different firmware on the PHY.
 | ||||
| 
 | ||||
| Signed-off-by: Alex Marginean <alexandru.marginean@nxp.com> | ||||
| ---
 | ||||
|  drivers/net/phy/aquantia_main.c | 88 +++++++++++++++++++++++++++++++++++++++++ | ||||
|  1 file changed, 88 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/phy/aquantia_main.c
 | ||||
| +++ b/drivers/net/phy/aquantia_main.c
 | ||||
| @@ -24,6 +24,8 @@
 | ||||
|  #define PHY_ID_AQR405	0x03a1b4b0 | ||||
|  #define PHY_ID_AQR113C	0x31c31c12 | ||||
|  #define PHY_ID_AQR813	0x31c31cb2 | ||||
| +#define PHY_ID_AQR112	0x03a1b662
 | ||||
| +#define PHY_ID_AQR412	0x03a1b712
 | ||||
|   | ||||
|  #define MDIO_PHYXS_VEND_IF_STATUS		0xe812 | ||||
|  #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK	GENMASK(7, 3) | ||||
| @@ -151,6 +153,29 @@
 | ||||
|  #define AQR107_OP_IN_PROG_SLEEP		1000 | ||||
|  #define AQR107_OP_IN_PROG_TIMEOUT	100000 | ||||
|   | ||||
| +/* registers in MDIO_MMD_VEND1 region */
 | ||||
| +#define AQUANTIA_VND1_GLOBAL_SC			0x000
 | ||||
| +#define  AQUANTIA_VND1_GLOBAL_SC_LP		BIT(0xb)
 | ||||
| +
 | ||||
| +/* global start rate, the protocol associated with this speed is used by default
 | ||||
| + * on SI.
 | ||||
| + */
 | ||||
| +#define AQUANTIA_VND1_GSTART_RATE		0x31a
 | ||||
| +#define  AQUANTIA_VND1_GSTART_RATE_OFF		0
 | ||||
| +#define  AQUANTIA_VND1_GSTART_RATE_100M		1
 | ||||
| +#define  AQUANTIA_VND1_GSTART_RATE_1G		2
 | ||||
| +#define  AQUANTIA_VND1_GSTART_RATE_10G		3
 | ||||
| +#define  AQUANTIA_VND1_GSTART_RATE_2_5G		4
 | ||||
| +#define  AQUANTIA_VND1_GSTART_RATE_5G		5
 | ||||
| +
 | ||||
| +/* SYSCFG registers for 100M, 1G, 2.5G, 5G, 10G */
 | ||||
| +#define AQUANTIA_VND1_GSYSCFG_BASE		0x31b
 | ||||
| +#define AQUANTIA_VND1_GSYSCFG_100M		0
 | ||||
| +#define AQUANTIA_VND1_GSYSCFG_1G		1
 | ||||
| +#define AQUANTIA_VND1_GSYSCFG_2_5G		2
 | ||||
| +#define AQUANTIA_VND1_GSYSCFG_5G		3
 | ||||
| +#define AQUANTIA_VND1_GSYSCFG_10G		4
 | ||||
| +
 | ||||
|  struct aqr107_hw_stat { | ||||
|  	const char *name; | ||||
|  	int reg; | ||||
| @@ -282,6 +307,51 @@ static int aqr_config_aneg(struct phy_de
 | ||||
|  	return genphy_c45_check_and_restart_aneg(phydev, changed); | ||||
|  } | ||||
|   | ||||
| +static struct {
 | ||||
| +	u16 syscfg;
 | ||||
| +	int cnt;
 | ||||
| +	u16 start_rate;
 | ||||
| +} aquantia_syscfg[PHY_INTERFACE_MODE_MAX] = {
 | ||||
| +	[PHY_INTERFACE_MODE_SGMII] =      {0x04b, AQUANTIA_VND1_GSYSCFG_1G,
 | ||||
| +					   AQUANTIA_VND1_GSTART_RATE_1G},
 | ||||
| +	[PHY_INTERFACE_MODE_2500BASEX] = {0x144, AQUANTIA_VND1_GSYSCFG_2_5G,
 | ||||
| +					   AQUANTIA_VND1_GSTART_RATE_2_5G},
 | ||||
| +	[PHY_INTERFACE_MODE_XGMII] =      {0x100, AQUANTIA_VND1_GSYSCFG_10G,
 | ||||
| +					   AQUANTIA_VND1_GSTART_RATE_10G},
 | ||||
| +	[PHY_INTERFACE_MODE_USXGMII] =    {0x080, AQUANTIA_VND1_GSYSCFG_10G,
 | ||||
| +					   AQUANTIA_VND1_GSTART_RATE_10G},
 | ||||
| +};
 | ||||
| +
 | ||||
| +/* Sets up protocol on system side before calling aqr_config_aneg */
 | ||||
| +static int aqr_config_aneg_set_prot(struct phy_device *phydev)
 | ||||
| +{
 | ||||
| +	int if_type = phydev->interface;
 | ||||
| +	int i;
 | ||||
| +
 | ||||
| +	if (!aquantia_syscfg[if_type].cnt)
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
| +	/* set PHY in low power mode so we can configure protocols */
 | ||||
| +	phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GLOBAL_SC,
 | ||||
| +		      AQUANTIA_VND1_GLOBAL_SC_LP);
 | ||||
| +	mdelay(10);
 | ||||
| +
 | ||||
| +	/* set the default rate to enable the SI link */
 | ||||
| +	phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GSTART_RATE,
 | ||||
| +		      aquantia_syscfg[if_type].start_rate);
 | ||||
| +
 | ||||
| +	for (i = 0; i <= aquantia_syscfg[if_type].cnt; i++)
 | ||||
| +		phy_write_mmd(phydev, MDIO_MMD_VEND1,
 | ||||
| +			      AQUANTIA_VND1_GSYSCFG_BASE + i,
 | ||||
| +			      aquantia_syscfg[if_type].syscfg);
 | ||||
| +
 | ||||
| +	/* wake PHY back up */
 | ||||
| +	phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GLOBAL_SC, 0);
 | ||||
| +	mdelay(10);
 | ||||
| +
 | ||||
| +	return aqr_config_aneg(phydev);
 | ||||
| +}
 | ||||
| +
 | ||||
|  static int aqr_config_intr(struct phy_device *phydev) | ||||
|  { | ||||
|  	bool en = phydev->interrupts == PHY_INTERRUPT_ENABLED; | ||||
| @@ -881,6 +951,30 @@ static struct phy_driver aqr_driver[] =
 | ||||
|  	.get_stats	= aqr107_get_stats, | ||||
|  	.link_change_notify = aqr107_link_change_notify, | ||||
|  }, | ||||
| +{
 | ||||
| +	PHY_ID_MATCH_MODEL(PHY_ID_AQR112),
 | ||||
| +	.name		= "Aquantia AQR112",
 | ||||
| +	.probe		= aqr107_probe,
 | ||||
| +	.config_aneg	= aqr_config_aneg_set_prot,
 | ||||
| +	.config_intr	= aqr_config_intr,
 | ||||
| +	.handle_interrupt = aqr_handle_interrupt,
 | ||||
| +	.read_status	= aqr107_read_status,
 | ||||
| +	.get_sset_count	= aqr107_get_sset_count,
 | ||||
| +	.get_strings	= aqr107_get_strings,
 | ||||
| +	.get_stats	= aqr107_get_stats,
 | ||||
| +},
 | ||||
| +{
 | ||||
| +	PHY_ID_MATCH_MODEL(PHY_ID_AQR412),
 | ||||
| +	.name		= "Aquantia AQR412",
 | ||||
| +	.probe		= aqr107_probe,
 | ||||
| +	.config_aneg	= aqr_config_aneg_set_prot,
 | ||||
| +	.config_intr	= aqr_config_intr,
 | ||||
| +	.handle_interrupt = aqr_handle_interrupt,
 | ||||
| +	.read_status	= aqr107_read_status,
 | ||||
| +	.get_sset_count	= aqr107_get_sset_count,
 | ||||
| +	.get_strings	= aqr107_get_strings,
 | ||||
| +	.get_stats	= aqr107_get_stats,
 | ||||
| +},
 | ||||
|  }; | ||||
|   | ||||
|  module_phy_driver(aqr_driver); | ||||
| @@ -895,6 +989,8 @@ static struct mdio_device_id __maybe_unu
 | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR405) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR813) }, | ||||
| +	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR112) },
 | ||||
| +	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR412) },
 | ||||
|  	{ } | ||||
|  }; | ||||
|   | ||||
|  | @ -0,0 +1,34 @@ | |||
| From 5f008cb22f60da4e10375f22266c1a4e20b1252e Mon Sep 17 00:00:00 2001 | ||||
| From: Alex Marginean <alexandru.marginean@nxp.com> | ||||
| Date: Fri, 20 Sep 2019 18:22:52 +0300 | ||||
| Subject: [PATCH] drivers: net: phy: aquantia: fix system side protocol | ||||
|  misconfiguration | ||||
| 
 | ||||
| Do not set up protocols for speeds that are not supported by FW.  Enabling | ||||
| these protocols leads to link issues on system side. | ||||
| 
 | ||||
| Signed-off-by: Alex Marginean <alexandru.marginean@nxp.com> | ||||
| ---
 | ||||
|  drivers/net/phy/aquantia_main.c | 8 +++++++- | ||||
|  1 file changed, 7 insertions(+), 1 deletion(-) | ||||
| 
 | ||||
| --- a/drivers/net/phy/aquantia_main.c
 | ||||
| +++ b/drivers/net/phy/aquantia_main.c
 | ||||
| @@ -340,10 +340,16 @@ static int aqr_config_aneg_set_prot(stru
 | ||||
|  	phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GSTART_RATE, | ||||
|  		      aquantia_syscfg[if_type].start_rate); | ||||
|   | ||||
| -	for (i = 0; i <= aquantia_syscfg[if_type].cnt; i++)
 | ||||
| +	for (i = 0; i <= aquantia_syscfg[if_type].cnt; i++) {
 | ||||
| +		u16 reg = phy_read_mmd(phydev, MDIO_MMD_VEND1,
 | ||||
| +				       AQUANTIA_VND1_GSYSCFG_BASE + i);
 | ||||
| +		if (!reg)
 | ||||
| +			continue;
 | ||||
| +
 | ||||
|  		phy_write_mmd(phydev, MDIO_MMD_VEND1, | ||||
|  			      AQUANTIA_VND1_GSYSCFG_BASE + i, | ||||
|  			      aquantia_syscfg[if_type].syscfg); | ||||
| +	}
 | ||||
|   | ||||
|  	/* wake PHY back up */ | ||||
|  	phy_write_mmd(phydev, MDIO_MMD_VEND1, AQUANTIA_VND1_GLOBAL_SC, 0); | ||||
|  | @ -0,0 +1,43 @@ | |||
| From 2e677e4ae8f8330f68013163b060d0fda3a43095 Mon Sep 17 00:00:00 2001 | ||||
| From: "Langer, Thomas" <tlanger@maxlinear.com> | ||||
| Date: Fri, 9 Jul 2021 17:36:46 +0200 | ||||
| Subject: [PATCH] PONRTSYS-8842: aquantia: Add AQR113 driver support | ||||
| 
 | ||||
| Add a new entry for AQR113 PHY_ID | ||||
| ---
 | ||||
|  drivers/net/phy/aquantia_main.c | 10 ++++++++++ | ||||
|  1 file changed, 10 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/phy/aquantia_main.c
 | ||||
| +++ b/drivers/net/phy/aquantia_main.c
 | ||||
| @@ -26,6 +26,7 @@
 | ||||
|  #define PHY_ID_AQR813	0x31c31cb2 | ||||
|  #define PHY_ID_AQR112	0x03a1b662 | ||||
|  #define PHY_ID_AQR412	0x03a1b712 | ||||
| +#define PHY_ID_AQR113	0x31c31c40
 | ||||
|   | ||||
|  #define MDIO_PHYXS_VEND_IF_STATUS		0xe812 | ||||
|  #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK	GENMASK(7, 3) | ||||
| @@ -981,6 +982,14 @@ static struct phy_driver aqr_driver[] =
 | ||||
|  	.get_strings	= aqr107_get_strings, | ||||
|  	.get_stats	= aqr107_get_stats, | ||||
|  }, | ||||
| +{
 | ||||
| +	PHY_ID_MATCH_MODEL(PHY_ID_AQR113),
 | ||||
| +	.name		= "Aquantia AQR113",
 | ||||
| +	.config_aneg	= aqr_config_aneg,
 | ||||
| +	.config_intr	= aqr_config_intr,
 | ||||
| +	.handle_interrupt = aqr_handle_interrupt,
 | ||||
| +	.read_status	= aqr107_read_status,
 | ||||
| +},
 | ||||
|  }; | ||||
|   | ||||
|  module_phy_driver(aqr_driver); | ||||
| @@ -997,6 +1006,7 @@ static struct mdio_device_id __maybe_unu
 | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR813) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR112) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR412) }, | ||||
| +	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113) },
 | ||||
|  	{ } | ||||
|  }; | ||||
|   | ||||
|  | @ -0,0 +1,63 @@ | |||
| From 3b92ee7b7899b6beffb2b484c58326e36612a873 Mon Sep 17 00:00:00 2001 | ||||
| From: Daniel Golle <daniel@makrotopia.org> | ||||
| Date: Thu, 23 Dec 2021 14:52:56 +0000 | ||||
| Subject: [PATCH] net: phy: aquantia: add PHY_ID for AQR112R | ||||
| 
 | ||||
| As advised by Ian Chang this PHY is used in Puzzle devices. | ||||
| 
 | ||||
| Signed-off-by: Daniel Golle <daniel@makrotopia.org> | ||||
| ---
 | ||||
|  drivers/net/phy/aquantia_main.c | 10 ++++++++++ | ||||
|  1 file changed, 10 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/phy/aquantia_main.c
 | ||||
| +++ b/drivers/net/phy/aquantia_main.c
 | ||||
| @@ -27,6 +27,8 @@
 | ||||
|  #define PHY_ID_AQR112	0x03a1b662 | ||||
|  #define PHY_ID_AQR412	0x03a1b712 | ||||
|  #define PHY_ID_AQR113	0x31c31c40 | ||||
| +#define PHY_ID_AQR112C	0x03a1b790
 | ||||
| +#define PHY_ID_AQR112R	0x31c31d12
 | ||||
|   | ||||
|  #define MDIO_PHYXS_VEND_IF_STATUS		0xe812 | ||||
|  #define MDIO_PHYXS_VEND_IF_STATUS_TYPE_MASK	GENMASK(7, 3) | ||||
| @@ -990,6 +992,30 @@ static struct phy_driver aqr_driver[] =
 | ||||
|  	.handle_interrupt = aqr_handle_interrupt, | ||||
|  	.read_status	= aqr107_read_status, | ||||
|  }, | ||||
| +{
 | ||||
| +	PHY_ID_MATCH_MODEL(PHY_ID_AQR112C),
 | ||||
| +	.name		= "Aquantia AQR112C",
 | ||||
| +	.probe		= aqr107_probe,
 | ||||
| +	.config_aneg	= aqr_config_aneg_set_prot,
 | ||||
| +	.config_intr	= aqr_config_intr,
 | ||||
| +	.handle_interrupt = aqr_handle_interrupt,
 | ||||
| +	.read_status	= aqr107_read_status,
 | ||||
| +	.get_sset_count	= aqr107_get_sset_count,
 | ||||
| +	.get_strings	= aqr107_get_strings,
 | ||||
| +	.get_stats	= aqr107_get_stats,
 | ||||
| +},
 | ||||
| +{
 | ||||
| +	PHY_ID_MATCH_MODEL(PHY_ID_AQR112R),
 | ||||
| +	.name		= "Aquantia AQR112R",
 | ||||
| +	.probe		= aqr107_probe,
 | ||||
| +	.config_aneg	= aqr_config_aneg_set_prot,
 | ||||
| +	.config_intr	= aqr_config_intr,
 | ||||
| +	.handle_interrupt = aqr_handle_interrupt,
 | ||||
| +	.read_status	= aqr107_read_status,
 | ||||
| +	.get_sset_count	= aqr107_get_sset_count,
 | ||||
| +	.get_strings	= aqr107_get_strings,
 | ||||
| +	.get_stats	= aqr107_get_stats,
 | ||||
| +},
 | ||||
|  }; | ||||
|   | ||||
|  module_phy_driver(aqr_driver); | ||||
| @@ -1007,6 +1033,8 @@ static struct mdio_device_id __maybe_unu
 | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR112) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR412) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113) }, | ||||
| +	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR112C) },
 | ||||
| +	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR112R) },
 | ||||
|  	{ } | ||||
|  }; | ||||
|   | ||||
|  | @ -0,0 +1,110 @@ | |||
| Author: Thomas Kupper <thomas.kupper@gmail.com> | ||||
| Date:   Wed May 24 21:14:17 2023 +0200 | ||||
| 
 | ||||
| kernel: phy: add Aquantia PHY AQR111 & AQR111B0 | ||||
| 
 | ||||
| Add the IDs for Aquantia PHY AQR111 and AQR111B0 as found in the GPL sources | ||||
| of the Netgear RAX120v2 firmware v1.2.8.40. | ||||
| 
 | ||||
| This is a 5GbE chip but it reports support for 10G. Implement config_init() | ||||
| to set max speed to 5G. | ||||
| 
 | ||||
| Signed-off-by: Thomas Kupper <thomas.kupper@gmail.com> | ||||
| --- a/drivers/net/phy/aquantia_main.c
 | ||||
| +++ b/drivers/net/phy/aquantia_main.c
 | ||||
| @@ -24,6 +24,8 @@
 | ||||
|  #define PHY_ID_AQR405	0x03a1b4b0 | ||||
|  #define PHY_ID_AQR113C	0x31c31c12 | ||||
|  #define PHY_ID_AQR813	0x31c31cb2 | ||||
| +#define PHY_ID_AQR111	0x03a1b610
 | ||||
| +#define PHY_ID_AQR111B0	0x03a1b612
 | ||||
|  #define PHY_ID_AQR112	0x03a1b662 | ||||
|  #define PHY_ID_AQR412	0x03a1b712 | ||||
|  #define PHY_ID_AQR113	0x31c31c40 | ||||
| @@ -729,6 +731,34 @@ static int aqcs109_config_init(struct ph
 | ||||
|  	return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT); | ||||
|  } | ||||
|   | ||||
| +static int aqr111_config_init(struct phy_device *phydev)
 | ||||
| +{
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	/* Check that the PHY interface type is compatible */
 | ||||
| +	if (phydev->interface != PHY_INTERFACE_MODE_SGMII &&
 | ||||
| +	    phydev->interface != PHY_INTERFACE_MODE_1000BASEKX &&
 | ||||
| +	    phydev->interface != PHY_INTERFACE_MODE_2500BASEX &&
 | ||||
| +	    phydev->interface != PHY_INTERFACE_MODE_XGMII &&
 | ||||
| +	    phydev->interface != PHY_INTERFACE_MODE_USXGMII &&
 | ||||
| +	    phydev->interface != PHY_INTERFACE_MODE_10GKR &&
 | ||||
| +	    phydev->interface != PHY_INTERFACE_MODE_10GBASER &&
 | ||||
| +	    phydev->interface != PHY_INTERFACE_MODE_XAUI &&
 | ||||
| +	    phydev->interface != PHY_INTERFACE_MODE_RXAUI)
 | ||||
| +		return -ENODEV;
 | ||||
| +
 | ||||
| +	WARN(phydev->interface == PHY_INTERFACE_MODE_XGMII,
 | ||||
| +	     "Your devicetree is out of date, please update it. The AQR107 family doesn't support XGMII, maybe you mean USXGMII.\n");
 | ||||
| +
 | ||||
| +	ret = aqr107_wait_reset_complete(phydev);
 | ||||
| +	if (!ret)
 | ||||
| +		aqr107_chip_info(phydev);
 | ||||
| +
 | ||||
| +	/* AQR111 reports supporting speed up to 10G, however only speeds up to 5G are supported. */
 | ||||
| +	phy_set_max_speed(phydev, SPEED_5000);
 | ||||
| +
 | ||||
| +	return aqr107_set_downshift(phydev, MDIO_AN_VEND_PROV_DOWNSHIFT_DFLT);
 | ||||
| +}
 | ||||
|  static void aqr107_link_change_notify(struct phy_device *phydev) | ||||
|  { | ||||
|  	u8 fw_major, fw_minor; | ||||
| @@ -961,6 +991,42 @@ static struct phy_driver aqr_driver[] =
 | ||||
|  	.link_change_notify = aqr107_link_change_notify, | ||||
|  }, | ||||
|  { | ||||
| +	PHY_ID_MATCH_MODEL(PHY_ID_AQR111),
 | ||||
| +	.name		= "Aquantia AQR111",
 | ||||
| +	.probe		= aqr107_probe,
 | ||||
| +	.config_init	= aqr111_config_init,
 | ||||
| +	.config_aneg    = aqr_config_aneg,
 | ||||
| +	.config_intr	= aqr_config_intr,
 | ||||
| +	.handle_interrupt = aqr_handle_interrupt,
 | ||||
| +	.read_status	= aqr107_read_status,
 | ||||
| +	.get_tunable    = aqr107_get_tunable,
 | ||||
| +	.set_tunable    = aqr107_set_tunable,
 | ||||
| +	.suspend	= aqr107_suspend,
 | ||||
| +	.resume		= aqr107_resume,
 | ||||
| +	.get_sset_count	= aqr107_get_sset_count,
 | ||||
| +	.get_strings	= aqr107_get_strings,
 | ||||
| +	.get_stats	= aqr107_get_stats,
 | ||||
| +	.link_change_notify = aqr107_link_change_notify,
 | ||||
| +},
 | ||||
| +{
 | ||||
| +	PHY_ID_MATCH_MODEL(PHY_ID_AQR111B0),
 | ||||
| +	.name		= "Aquantia AQR111B0",
 | ||||
| +	.probe		= aqr107_probe,
 | ||||
| +	.config_init	= aqr111_config_init,
 | ||||
| +	.config_aneg    = aqr_config_aneg,
 | ||||
| +	.config_intr	= aqr_config_intr,
 | ||||
| +	.handle_interrupt = aqr_handle_interrupt,
 | ||||
| +	.read_status	= aqr107_read_status,
 | ||||
| +	.get_tunable    = aqr107_get_tunable,
 | ||||
| +	.set_tunable    = aqr107_set_tunable,
 | ||||
| +	.suspend	= aqr107_suspend,
 | ||||
| +	.resume		= aqr107_resume,
 | ||||
| +	.get_sset_count	= aqr107_get_sset_count,
 | ||||
| +	.get_strings	= aqr107_get_strings,
 | ||||
| +	.get_stats	= aqr107_get_stats,
 | ||||
| +	.link_change_notify = aqr107_link_change_notify,
 | ||||
| +},
 | ||||
| +{
 | ||||
|  	PHY_ID_MATCH_MODEL(PHY_ID_AQR112), | ||||
|  	.name		= "Aquantia AQR112", | ||||
|  	.probe		= aqr107_probe, | ||||
| @@ -1030,6 +1096,8 @@ static struct mdio_device_id __maybe_unu
 | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR405) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113C) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR813) }, | ||||
| +	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR111) },
 | ||||
| +	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR111B0) },
 | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR112) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR412) }, | ||||
|  	{ PHY_ID_MATCH_MODEL(PHY_ID_AQR113) }, | ||||
|  | @ -0,0 +1,74 @@ | |||
| From 82985725e071f2a5735052f18e109a32aeac3a0b Mon Sep 17 00:00:00 2001 | ||||
| From: David Bauer <mail@david-bauer.net> | ||||
| Date: Sun, 26 Jul 2020 02:38:31 +0200 | ||||
| Subject: [PATCH] net: usb: r8152: add LED configuration from OF | ||||
| 
 | ||||
| This adds the ability to configure the LED configuration register using | ||||
| OF. This way, the correct value for board specific LED configuration can | ||||
| be determined. | ||||
| 
 | ||||
| Signed-off-by: David Bauer <mail@david-bauer.net> | ||||
| ---
 | ||||
|  drivers/net/usb/r8152.c | 23 +++++++++++++++++++++++ | ||||
|  1 file changed, 23 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/usb/r8152.c
 | ||||
| +++ b/drivers/net/usb/r8152.c
 | ||||
| @@ -11,6 +11,7 @@
 | ||||
|  #include <linux/mii.h> | ||||
|  #include <linux/ethtool.h> | ||||
|  #include <linux/usb.h> | ||||
| +#include <linux/of.h>
 | ||||
|  #include <linux/crc32.h> | ||||
|  #include <linux/if_vlan.h> | ||||
|  #include <linux/uaccess.h> | ||||
| @@ -6896,6 +6897,22 @@ static void rtl_tally_reset(struct r8152
 | ||||
|  	ocp_write_word(tp, MCU_TYPE_PLA, PLA_RSTTALLY, ocp_data); | ||||
|  } | ||||
|   | ||||
| +static int r8152_led_configuration(struct r8152 *tp)
 | ||||
| +{
 | ||||
| +	u32 led_data;
 | ||||
| +	int ret;
 | ||||
| +
 | ||||
| +	ret = of_property_read_u32(tp->udev->dev.of_node, "realtek,led-data",
 | ||||
| +								&led_data);
 | ||||
| +
 | ||||
| +	if (ret)
 | ||||
| +		return ret;
 | ||||
| +	
 | ||||
| +	ocp_write_word(tp, MCU_TYPE_PLA, PLA_LEDSEL, led_data);
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static void r8152b_init(struct r8152 *tp) | ||||
|  { | ||||
|  	u32 ocp_data; | ||||
| @@ -6937,6 +6954,8 @@ static void r8152b_init(struct r8152 *tp
 | ||||
|  	ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL); | ||||
|  	ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN); | ||||
|  	ocp_write_word(tp, MCU_TYPE_USB, USB_USB_CTRL, ocp_data); | ||||
| +
 | ||||
| +	r8152_led_configuration(tp);
 | ||||
|  } | ||||
|   | ||||
|  static void r8153_init(struct r8152 *tp) | ||||
| @@ -7077,6 +7096,8 @@ static void r8153_init(struct r8152 *tp)
 | ||||
|  		tp->coalesce = COALESCE_SLOW; | ||||
|  		break; | ||||
|  	} | ||||
| +
 | ||||
| +	r8152_led_configuration(tp);
 | ||||
|  } | ||||
|   | ||||
|  static void r8153b_init(struct r8152 *tp) | ||||
| @@ -7159,6 +7180,8 @@ static void r8153b_init(struct r8152 *tp
 | ||||
|  	rtl_tally_reset(tp); | ||||
|   | ||||
|  	tp->coalesce = 15000;	/* 15 us */ | ||||
| +
 | ||||
| +	r8152_led_configuration(tp);
 | ||||
|  } | ||||
|   | ||||
|  static void r8153c_init(struct r8152 *tp) | ||||
|  | @ -0,0 +1,54 @@ | |||
| From 3ee05f4aa64fc86af3be5bc176ba5808de9260a7 Mon Sep 17 00:00:00 2001 | ||||
| From: David Bauer <mail@david-bauer.net> | ||||
| Date: Sun, 26 Jul 2020 15:30:33 +0200 | ||||
| Subject: [PATCH] dt-bindings: net: add RTL8152 binding documentation | ||||
| 
 | ||||
| Add binding documentation for the Realtek RTL8152 / RTL8153 USB ethernet | ||||
| adapters. | ||||
| 
 | ||||
| Signed-off-by: David Bauer <mail@david-bauer.net> | ||||
| ---
 | ||||
|  .../bindings/net/realtek,rtl8152.yaml         | 36 +++++++++++++++++++ | ||||
|  1 file changed, 36 insertions(+) | ||||
|  create mode 100644 Documentation/devicetree/bindings/net/realtek,rtl8152.yaml | ||||
| 
 | ||||
| --- /dev/null
 | ||||
| +++ b/Documentation/devicetree/bindings/net/realtek,rtl8152.yaml
 | ||||
| @@ -0,0 +1,36 @@
 | ||||
| +# SPDX-License-Identifier: GPL-2.0
 | ||||
| +%YAML 1.2
 | ||||
| +---
 | ||||
| +$id: http://devicetree.org/schemas/net/realtek,rtl8152.yaml#
 | ||||
| +$schema: http://devicetree.org/meta-schemas/core.yaml#
 | ||||
| +
 | ||||
| +title: Realtek RTL8152/RTL8153 series USB ethernet
 | ||||
| +
 | ||||
| +maintainers:
 | ||||
| +  - David Bauer <mail@david-bauer.net>
 | ||||
| +
 | ||||
| +properties:
 | ||||
| +  compatible:
 | ||||
| +    oneOf:
 | ||||
| +      - items:
 | ||||
| +          - enum:
 | ||||
| +              - realtek,rtl8152
 | ||||
| +              - realtek,rtl8153
 | ||||
| +
 | ||||
| +  reg:
 | ||||
| +    description: The device number on the USB bus
 | ||||
| +
 | ||||
| +  realtek,led-data:
 | ||||
| +    description: Value to be written to the LED configuration register.
 | ||||
| +
 | ||||
| +required:
 | ||||
| +  - compatible
 | ||||
| +  - reg
 | ||||
| +
 | ||||
| +examples:
 | ||||
| +  - |
 | ||||
| +    usb-eth@2 {
 | ||||
| +      compatible = "realtek,rtl8153";
 | ||||
| +      reg = <2>;
 | ||||
| +      realtek,led-data = <0x87>;
 | ||||
| +    };
 | ||||
| \ No newline at end of file | ||||
|  | @ -0,0 +1,72 @@ | |||
| From cc225d163b5a4f7a0d1968298bf7927306646a47 Mon Sep 17 00:00:00 2001 | ||||
| From: David Bauer <mail@david-bauer.net> | ||||
| Date: Fri, 28 Apr 2023 01:53:01 +0200 | ||||
| Subject: [PATCH] net: phy: mediatek-ge: add LED configuration interface | ||||
| 
 | ||||
| This adds a small hack similar to the one used for ar8xxx switches to | ||||
| read a reg:value map for configuring the LED configuration registers. | ||||
| 
 | ||||
| This allows OpenWrt to write device-specific LED action as well as blink | ||||
| configurations. It is unlikely to be accepted upstream, as upstream | ||||
| plans on integrating their own framework for handling these LEDs. | ||||
| 
 | ||||
| Signed-off-by: David Bauer <mail@david-bauer.net> | ||||
| ---
 | ||||
|  drivers/net/phy/mediatek-ge.c | 33 +++++++++++++++++++++++++++++++++ | ||||
|  1 file changed, 33 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/phy/mediatek-ge.c
 | ||||
| +++ b/drivers/net/phy/mediatek-ge.c
 | ||||
| @@ -1,4 +1,5 @@
 | ||||
|  // SPDX-License-Identifier: GPL-2.0+ | ||||
| +#include <linux/of.h>
 | ||||
|  #include <linux/bitfield.h> | ||||
|  #include <linux/module.h> | ||||
|  #include <linux/phy.h> | ||||
| @@ -53,6 +54,36 @@ static int mt7530_phy_config_init(struct
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
| +static int mt7530_led_config_of(struct phy_device *phydev)
 | ||||
| +{
 | ||||
| +	struct device_node *np = phydev->mdio.dev.of_node;
 | ||||
| +	const __be32 *paddr;
 | ||||
| +	int len;
 | ||||
| +	int i;
 | ||||
| +
 | ||||
| +	paddr = of_get_property(np, "mediatek,led-config", &len);
 | ||||
| +	if (!paddr)
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
| +	if (len < (2 * sizeof(*paddr)))
 | ||||
| +		return -EINVAL;
 | ||||
| +
 | ||||
| +	len /= sizeof(*paddr);
 | ||||
| +
 | ||||
| +	phydev_warn(phydev, "Configure LED registers (num=%d)\n", len);
 | ||||
| +	for (i = 0; i < len - 1; i += 2) {
 | ||||
| +		u32 reg;
 | ||||
| +		u32 val;
 | ||||
| +
 | ||||
| +		reg = be32_to_cpup(paddr + i);
 | ||||
| +		val = be32_to_cpup(paddr + i + 1);
 | ||||
| +
 | ||||
| +		phy_write_mmd(phydev, MDIO_MMD_VEND2, reg, val);
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +
 | ||||
|  static int mt7531_phy_config_init(struct phy_device *phydev) | ||||
|  { | ||||
|  	mtk_gephy_config_init(phydev); | ||||
| @@ -65,6 +96,9 @@ static int mt7531_phy_config_init(struct
 | ||||
|  	phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x13, 0x404); | ||||
|  	phy_write_mmd(phydev, MDIO_MMD_VEND1, 0x14, 0x404); | ||||
|   | ||||
| +	/* LED Config*/
 | ||||
| +	mt7530_led_config_of(phydev);
 | ||||
| +
 | ||||
|  	return 0; | ||||
|  } | ||||
|   | ||||
|  | @ -0,0 +1,98 @@ | |||
| From 3cb240533ab787899dc7f17aa7d6c5b4810e2e58 Mon Sep 17 00:00:00 2001 | ||||
| From: Hauke Mehrtens <hauke@hauke-m.de> | ||||
| Date: Fri, 7 Jul 2017 17:26:01 +0200 | ||||
| Subject: bcm53xx: bgmac: use srab switch driver | ||||
| 
 | ||||
| use the srab switch driver on these SoCs. | ||||
| 
 | ||||
| Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de> | ||||
| ---
 | ||||
|  drivers/net/ethernet/broadcom/bgmac-bcma.c |  1 + | ||||
|  drivers/net/ethernet/broadcom/bgmac.c      | 24 ++++++++++++++++++++++++ | ||||
|  drivers/net/ethernet/broadcom/bgmac.h      |  4 ++++ | ||||
|  3 files changed, 29 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
 | ||||
| +++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
 | ||||
| @@ -280,6 +280,7 @@ static int bgmac_probe(struct bcma_devic
 | ||||
|  		bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST; | ||||
|  		bgmac->feature_flags |= BGMAC_FEAT_NO_RESET; | ||||
|  		bgmac->feature_flags |= BGMAC_FEAT_FORCE_SPEED_2500; | ||||
| +		bgmac->feature_flags |= BGMAC_FEAT_SRAB;
 | ||||
|  		break; | ||||
|  	default: | ||||
|  		bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST; | ||||
| --- a/drivers/net/ethernet/broadcom/bgmac.c
 | ||||
| +++ b/drivers/net/ethernet/broadcom/bgmac.c
 | ||||
| @@ -12,6 +12,7 @@
 | ||||
|  #include <linux/bcma/bcma.h> | ||||
|  #include <linux/etherdevice.h> | ||||
|  #include <linux/interrupt.h> | ||||
| +#include <linux/platform_data/b53.h>
 | ||||
|  #include <linux/bcm47xx_nvram.h> | ||||
|  #include <linux/phy.h> | ||||
|  #include <linux/phy_fixed.h> | ||||
| @@ -1408,6 +1409,17 @@ static const struct ethtool_ops bgmac_et
 | ||||
|  	.set_link_ksettings     = phy_ethtool_set_link_ksettings, | ||||
|  }; | ||||
|   | ||||
| +static struct b53_platform_data bgmac_b53_pdata = {
 | ||||
| +};
 | ||||
| +
 | ||||
| +static struct platform_device bgmac_b53_dev = {
 | ||||
| +	.name		= "b53-srab-switch",
 | ||||
| +	.id		= -1,
 | ||||
| +	.dev		= {
 | ||||
| +		.platform_data = &bgmac_b53_pdata,
 | ||||
| +	},
 | ||||
| +};
 | ||||
| +
 | ||||
|  /************************************************** | ||||
|   * MII | ||||
|   **************************************************/ | ||||
| @@ -1546,6 +1558,14 @@ int bgmac_enet_probe(struct bgmac *bgmac
 | ||||
|   | ||||
|  	bgmac->in_init = false; | ||||
|   | ||||
| +	if ((bgmac->feature_flags & BGMAC_FEAT_SRAB) && !bgmac_b53_pdata.regs) {
 | ||||
| +		bgmac_b53_pdata.regs = ioremap(0x18007000, 0x1000);
 | ||||
| +
 | ||||
| +		err = platform_device_register(&bgmac_b53_dev);
 | ||||
| +		if (!err)
 | ||||
| +			bgmac->b53_device = &bgmac_b53_dev;
 | ||||
| +	}
 | ||||
| +
 | ||||
|  	err = register_netdev(bgmac->net_dev); | ||||
|  	if (err) { | ||||
|  		dev_err(bgmac->dev, "Cannot register net device\n"); | ||||
| @@ -1568,6 +1588,10 @@ EXPORT_SYMBOL_GPL(bgmac_enet_probe);
 | ||||
|   | ||||
|  void bgmac_enet_remove(struct bgmac *bgmac) | ||||
|  { | ||||
| +	if (bgmac->b53_device)
 | ||||
| +		platform_device_unregister(&bgmac_b53_dev);
 | ||||
| +	bgmac->b53_device = NULL;
 | ||||
| +
 | ||||
|  	unregister_netdev(bgmac->net_dev); | ||||
|  	phy_disconnect(bgmac->net_dev->phydev); | ||||
|  	netif_napi_del(&bgmac->napi); | ||||
| --- a/drivers/net/ethernet/broadcom/bgmac.h
 | ||||
| +++ b/drivers/net/ethernet/broadcom/bgmac.h
 | ||||
| @@ -388,6 +388,7 @@
 | ||||
|  #define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII	BIT(18) | ||||
|  #define BGMAC_FEAT_CC7_IF_TYPE_RGMII	BIT(19) | ||||
|  #define BGMAC_FEAT_IDM_MASK		BIT(20) | ||||
| +#define BGMAC_FEAT_SRAB			BIT(21)
 | ||||
|   | ||||
|  struct bgmac_slot_info { | ||||
|  	union { | ||||
| @@ -495,6 +496,9 @@ struct bgmac {
 | ||||
|  	void (*cmn_maskset32)(struct bgmac *bgmac, u16 offset, u32 mask, | ||||
|  			      u32 set); | ||||
|  	int (*phy_connect)(struct bgmac *bgmac); | ||||
| +
 | ||||
| +	/* platform device for associated switch */
 | ||||
| +	struct platform_device *b53_device;
 | ||||
|  }; | ||||
|   | ||||
|  struct bgmac *bgmac_alloc(struct device *dev); | ||||
|  | @ -0,0 +1,43 @@ | |||
| From f81700b6bb2eda3756247bce472d8eaf6f466f61 Mon Sep 17 00:00:00 2001 | ||||
| From: OpenWrt community <openwrt-devel@lists.openwrt.org> | ||||
| Date: Wed, 13 Jul 2022 13:49:26 +0200 | ||||
| Subject: [PATCH] net/usb/qmi_wwan: add MeigLink modem support | ||||
| 
 | ||||
| ---
 | ||||
|  drivers/net/usb/qmi_wwan.c  | 1 + | ||||
|  drivers/usb/serial/option.c | 7 +++++++ | ||||
|  2 files changed, 8 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/net/usb/qmi_wwan.c
 | ||||
| +++ b/drivers/net/usb/qmi_wwan.c
 | ||||
| @@ -1088,6 +1088,7 @@ static const struct usb_device_id produc
 | ||||
|  	{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0620)},	/* Quectel EM160R-GL */ | ||||
|  	{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0800)},	/* Quectel RM500Q-GL */ | ||||
|  	{QMI_MATCH_FF_FF_FF(0x2c7c, 0x0801)},	/* Quectel RM520N */ | ||||
| +	{QMI_MATCH_FF_FF_FF(0x05c6, 0xf601)},   /* MeigLink SLM750 */
 | ||||
|   | ||||
|  	/* 3. Combined interface devices matching on interface number */ | ||||
|  	{QMI_FIXED_INTF(0x0408, 0xea42, 4)},	/* Yota / Megafon M100-1 */ | ||||
| --- a/drivers/usb/serial/option.c
 | ||||
| +++ b/drivers/usb/serial/option.c
 | ||||
| @@ -244,6 +244,8 @@ static void option_instat_callback(struc
 | ||||
|  #define UBLOX_PRODUCT_R410M			0x90b2 | ||||
|  /* These Yuga products use Qualcomm's vendor ID */ | ||||
|  #define YUGA_PRODUCT_CLM920_NC5			0x9625 | ||||
| +/* These MeigLink products use Qualcomm's vendor ID */
 | ||||
| +#define MEIGLINK_PRODUCT_SLM750			0xf601
 | ||||
|   | ||||
|  #define QUECTEL_VENDOR_ID			0x2c7c | ||||
|  /* These Quectel products use Quectel's vendor ID */ | ||||
| @@ -1180,6 +1182,11 @@ static const struct usb_device_id option
 | ||||
|  	  .driver_info = ZLP }, | ||||
|  	{ USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96), | ||||
|  	  .driver_info = RSVD(4) }, | ||||
| +	/* Meiglink products using Qualcomm vendor ID */
 | ||||
| +	// Works OK. In case of some issues check macros that are used by Quectel Products
 | ||||
| +	{ USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, MEIGLINK_PRODUCT_SLM750, 0xff, 0xff, 0xff),
 | ||||
| +	  .driver_info = NUMEP2 },
 | ||||
| +	{ USB_DEVICE_AND_INTERFACE_INFO(QUALCOMM_VENDOR_ID, MEIGLINK_PRODUCT_SLM750, 0xff, 0, 0) },
 | ||||
|  	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff), | ||||
|  	  .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 }, | ||||
|  	{ USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EP06, 0xff, 0, 0) }, | ||||
|  | @ -0,0 +1,63 @@ | |||
| From 7cc39a6bedbd85f3ff7e16845f310e4ce8d9833f Mon Sep 17 00:00:00 2001 | ||||
| From: Daniel Golle <daniel@makrotopia.org> | ||||
| Date: Tue, 6 Sep 2022 00:31:19 +0100 | ||||
| Subject: [PATCH] net: sfp: add quirk for ATS SFP-GE-T 1000Base-TX module | ||||
| To: netdev@vger.kernel.org, | ||||
|     linux-kernel@vger.kernel.org, | ||||
|     Russell King <linux@armlinux.org.uk>, | ||||
|     Andrew Lunn <andrew@lunn.ch>, | ||||
|     Heiner Kallweit <hkallweit1@gmail.com> | ||||
| Cc: David S. Miller <davem@davemloft.net>, | ||||
|     Eric Dumazet <edumazet@google.com>, | ||||
|     Jakub Kicinski <kuba@kernel.org>, | ||||
|     Paolo Abeni <pabeni@redhat.com>, | ||||
|     Josef Schlehofer <pepe.schlehofer@gmail.com> | ||||
| 
 | ||||
| This copper module comes with broken TX_FAULT indicator which must be | ||||
| ignored for it to work. Implement ignoring TX_FAULT state bit also | ||||
| during reset/insertion and mute the warning telling the user that the | ||||
| module indicates TX_FAULT. | ||||
| 
 | ||||
| Co-authored-by: Josef Schlehofer <pepe.schlehofer@gmail.com> | ||||
| Signed-off-by: Daniel Golle <daniel@makrotopia.org> | ||||
| ---
 | ||||
|  drivers/net/phy/sfp.c | 14 +++++++++++--- | ||||
|  1 file changed, 11 insertions(+), 3 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/net/phy/sfp.c
 | ||||
| +++ b/drivers/net/phy/sfp.c
 | ||||
| @@ -404,6 +404,9 @@ static const struct sfp_quirk sfp_quirks
 | ||||
|  	SFP_QUIRK("HUAWEI", "MA5671A", sfp_quirk_2500basex, | ||||
|  		  sfp_fixup_ignore_tx_fault), | ||||
|   | ||||
| +	// OEM SFP-GE-T is 1000Base-T module
 | ||||
| +	SFP_QUIRK_F("OEM", "SFP-GE-T", sfp_fixup_ignore_tx_fault),
 | ||||
| +
 | ||||
|  	// Lantech 8330-262D-E can operate at 2500base-X, but incorrectly report | ||||
|  	// 2500MBd NRZ in their EEPROM | ||||
|  	SFP_QUIRK_M("Lantech", "8330-262D-E", sfp_quirk_2500basex), | ||||
| @@ -2339,7 +2342,8 @@ static void sfp_sm_main(struct sfp *sfp,
 | ||||
|  			 * or t_start_up, so assume there is a fault. | ||||
|  			 */ | ||||
|  			sfp_sm_fault(sfp, SFP_S_INIT_TX_FAULT, | ||||
| -				     sfp->sm_fault_retries == N_FAULT_INIT);
 | ||||
| +				     !sfp->tx_fault_ignore &&
 | ||||
| +				     (sfp->sm_fault_retries == N_FAULT_INIT));
 | ||||
|  		} else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) { | ||||
|  	init_done: | ||||
|  			/* Create mdiobus and start trying for PHY */ | ||||
| @@ -2568,10 +2572,12 @@ static void sfp_check_state(struct sfp *
 | ||||
|  	mutex_lock(&sfp->st_mutex); | ||||
|  	state = sfp_get_state(sfp); | ||||
|  	changed = state ^ sfp->state; | ||||
| -	if (sfp->tx_fault_ignore)
 | ||||
| +	if (sfp->tx_fault_ignore) {
 | ||||
|  		changed &= SFP_F_PRESENT | SFP_F_LOS; | ||||
| -	else
 | ||||
| +		state &= ~SFP_F_TX_FAULT;
 | ||||
| +	} else {
 | ||||
|  		changed &= SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT; | ||||
| +	}
 | ||||
|   | ||||
|  	for (i = 0; i < GPIO_MAX; i++) | ||||
|  		if (changed & BIT(i)) | ||||
							
								
								
									
										408
									
								
								6.6/target/linux/generic/hack-6.6/902-debloat_proc.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										408
									
								
								6.6/target/linux/generic/hack-6.6/902-debloat_proc.patch
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,408 @@ | |||
| From 9e3f1d0805b2d919904dd9a4ff0d956314cc3cba Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Sat, 8 Jul 2017 08:20:09 +0200 | ||||
| Subject: debloat: procfs | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
|  fs/locks.c               |  2 ++ | ||||
|  fs/proc/Kconfig          |  5 +++++ | ||||
|  fs/proc/consoles.c       |  3 +++ | ||||
|  fs/proc/proc_tty.c       | 11 ++++++++++- | ||||
|  include/net/snmp.h       | 18 +++++++++++++++++- | ||||
|  ipc/msg.c                |  3 +++ | ||||
|  ipc/sem.c                |  2 ++ | ||||
|  ipc/shm.c                |  2 ++ | ||||
|  ipc/util.c               |  3 +++ | ||||
|  kernel/exec_domain.c     |  2 ++ | ||||
|  kernel/irq/proc.c        |  9 +++++++++ | ||||
|  kernel/time/timer_list.c |  2 ++ | ||||
|  mm/vmalloc.c             |  2 ++ | ||||
|  mm/vmstat.c              |  8 +++++--- | ||||
|  net/8021q/vlanproc.c     |  6 ++++++ | ||||
|  net/core/net-procfs.c    | 18 ++++++++++++------ | ||||
|  net/core/sock.c          |  2 ++ | ||||
|  net/ipv4/fib_trie.c      | 18 ++++++++++++------ | ||||
|  net/ipv4/proc.c          |  3 +++ | ||||
|  net/ipv4/route.c         |  3 +++ | ||||
|  20 files changed, 105 insertions(+), 17 deletions(-) | ||||
| 
 | ||||
| --- a/fs/locks.c
 | ||||
| +++ b/fs/locks.c
 | ||||
| @@ -2909,6 +2909,8 @@ static const struct seq_operations locks
 | ||||
|   | ||||
|  static int __init proc_locks_init(void) | ||||
|  { | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return 0;
 | ||||
|  	proc_create_seq_private("locks", 0, NULL, &locks_seq_operations, | ||||
|  			sizeof(struct locks_iterator), NULL); | ||||
|  	return 0; | ||||
| --- a/fs/proc/Kconfig
 | ||||
| +++ b/fs/proc/Kconfig
 | ||||
| @@ -101,6 +101,11 @@ config PROC_CHILDREN
 | ||||
|  	  Say Y if you are running any user-space software which takes benefit from | ||||
|  	  this interface. For example, rkt is such a piece of software. | ||||
|   | ||||
| +config PROC_STRIPPED
 | ||||
| +	default n
 | ||||
| +	depends on EXPERT
 | ||||
| +	bool "Strip non-essential /proc functionality to reduce code size"
 | ||||
| +
 | ||||
|  config PROC_PID_ARCH_STATUS | ||||
|  	def_bool n | ||||
|  	depends on PROC_FS | ||||
| --- a/fs/proc/consoles.c
 | ||||
| +++ b/fs/proc/consoles.c
 | ||||
| @@ -92,6 +92,9 @@ static const struct seq_operations conso
 | ||||
|   | ||||
|  static int __init proc_consoles_init(void) | ||||
|  { | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
|  	proc_create_seq("consoles", 0, NULL, &consoles_op); | ||||
|  	return 0; | ||||
|  } | ||||
| --- a/fs/proc/proc_tty.c
 | ||||
| +++ b/fs/proc/proc_tty.c
 | ||||
| @@ -131,7 +131,10 @@ static const struct seq_operations tty_d
 | ||||
|  void proc_tty_register_driver(struct tty_driver *driver) | ||||
|  { | ||||
|  	struct proc_dir_entry *ent; | ||||
| -		
 | ||||
| +
 | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return;
 | ||||
| +
 | ||||
|  	if (!driver->driver_name || driver->proc_entry || | ||||
|  	    !driver->ops->proc_show) | ||||
|  		return; | ||||
| @@ -148,6 +151,9 @@ void proc_tty_unregister_driver(struct t
 | ||||
|  { | ||||
|  	struct proc_dir_entry *ent; | ||||
|   | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return;
 | ||||
| +
 | ||||
|  	ent = driver->proc_entry; | ||||
|  	if (!ent) | ||||
|  		return; | ||||
| @@ -162,6 +168,9 @@ void proc_tty_unregister_driver(struct t
 | ||||
|   */ | ||||
|  void __init proc_tty_init(void) | ||||
|  { | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return;
 | ||||
| +
 | ||||
|  	if (!proc_mkdir("tty", NULL)) | ||||
|  		return; | ||||
|  	proc_mkdir("tty/ldisc", NULL);	/* Preserved: it's userspace visible */ | ||||
| --- a/include/net/snmp.h
 | ||||
| +++ b/include/net/snmp.h
 | ||||
| @@ -124,6 +124,21 @@ struct linux_tls_mib {
 | ||||
|  #define DECLARE_SNMP_STAT(type, name)	\ | ||||
|  	extern __typeof__(type) __percpu *name | ||||
|   | ||||
| +#ifdef CONFIG_PROC_STRIPPED
 | ||||
| +#define __SNMP_STATS_DUMMY(mib)	\
 | ||||
| +	do { (void) mib->mibs[0]; } while(0)
 | ||||
| +
 | ||||
| +#define __SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)
 | ||||
| +#define SNMP_INC_STATS_ATOMIC_LONG(mib, field) __SNMP_STATS_DUMMY(mib)
 | ||||
| +#define SNMP_INC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)
 | ||||
| +#define SNMP_DEC_STATS(mib, field) __SNMP_STATS_DUMMY(mib)
 | ||||
| +#define __SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib)
 | ||||
| +#define SNMP_ADD_STATS(mib, field, addend) __SNMP_STATS_DUMMY(mib)
 | ||||
| +#define SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib)
 | ||||
| +#define __SNMP_UPD_PO_STATS(mib, basefield, addend) __SNMP_STATS_DUMMY(mib)
 | ||||
| +
 | ||||
| +#else
 | ||||
| +
 | ||||
|  #define __SNMP_INC_STATS(mib, field)	\ | ||||
|  			__this_cpu_inc(mib->mibs[field]) | ||||
|   | ||||
| @@ -154,8 +169,9 @@ struct linux_tls_mib {
 | ||||
|  		__this_cpu_add(ptr[basefield##OCTETS], addend);	\ | ||||
|  	} while (0) | ||||
|   | ||||
| +#endif
 | ||||
|   | ||||
| -#if BITS_PER_LONG==32
 | ||||
| +#if (BITS_PER_LONG==32) && !defined(CONFIG_PROC_STRIPPED)
 | ||||
|   | ||||
|  #define __SNMP_ADD_STATS64(mib, field, addend) 				\ | ||||
|  	do {								\ | ||||
| --- a/ipc/msg.c
 | ||||
| +++ b/ipc/msg.c
 | ||||
| @@ -1370,6 +1370,9 @@ void __init msg_init(void)
 | ||||
|  { | ||||
|  	msg_init_ns(&init_ipc_ns); | ||||
|   | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return;
 | ||||
| +
 | ||||
|  	ipc_init_proc_interface("sysvipc/msg", | ||||
|  				"       key      msqid perms      cbytes       qnum lspid lrpid   uid   gid  cuid  cgid      stime      rtime      ctime\n", | ||||
|  				IPC_MSG_IDS, sysvipc_msg_proc_show); | ||||
| --- a/ipc/sem.c
 | ||||
| +++ b/ipc/sem.c
 | ||||
| @@ -268,6 +268,8 @@ void sem_exit_ns(struct ipc_namespace *n
 | ||||
|  void __init sem_init(void) | ||||
|  { | ||||
|  	sem_init_ns(&init_ipc_ns); | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return;
 | ||||
|  	ipc_init_proc_interface("sysvipc/sem", | ||||
|  				"       key      semid perms      nsems   uid   gid  cuid  cgid      otime      ctime\n", | ||||
|  				IPC_SEM_IDS, sysvipc_sem_proc_show); | ||||
| --- a/ipc/shm.c
 | ||||
| +++ b/ipc/shm.c
 | ||||
| @@ -154,6 +154,8 @@ pure_initcall(ipc_ns_init);
 | ||||
|   | ||||
|  void __init shm_init(void) | ||||
|  { | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return;
 | ||||
|  	ipc_init_proc_interface("sysvipc/shm", | ||||
|  #if BITS_PER_LONG <= 32 | ||||
|  				"       key      shmid perms       size  cpid  lpid nattch   uid   gid  cuid  cgid      atime      dtime      ctime        rss       swap\n", | ||||
| --- a/ipc/util.c
 | ||||
| +++ b/ipc/util.c
 | ||||
| @@ -141,6 +141,9 @@ void __init ipc_init_proc_interface(cons
 | ||||
|  	struct proc_dir_entry *pde; | ||||
|  	struct ipc_proc_iface *iface; | ||||
|   | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return;
 | ||||
| +
 | ||||
|  	iface = kmalloc(sizeof(*iface), GFP_KERNEL); | ||||
|  	if (!iface) | ||||
|  		return; | ||||
| --- a/kernel/exec_domain.c
 | ||||
| +++ b/kernel/exec_domain.c
 | ||||
| @@ -29,6 +29,8 @@ static int execdomains_proc_show(struct
 | ||||
|   | ||||
|  static int __init proc_execdomains_init(void) | ||||
|  { | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return 0;
 | ||||
|  	proc_create_single("execdomains", 0, NULL, execdomains_proc_show); | ||||
|  	return 0; | ||||
|  } | ||||
| --- a/kernel/irq/proc.c
 | ||||
| +++ b/kernel/irq/proc.c
 | ||||
| @@ -341,6 +341,9 @@ void register_irq_proc(unsigned int irq,
 | ||||
|  	void __maybe_unused *irqp = (void *)(unsigned long) irq; | ||||
|  	char name [MAX_NAMELEN]; | ||||
|   | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))
 | ||||
| +		return;
 | ||||
| +
 | ||||
|  	if (!root_irq_dir || (desc->irq_data.chip == &no_irq_chip)) | ||||
|  		return; | ||||
|   | ||||
| @@ -394,6 +397,9 @@ void unregister_irq_proc(unsigned int ir
 | ||||
|  { | ||||
|  	char name [MAX_NAMELEN]; | ||||
|   | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))
 | ||||
| +		return;
 | ||||
| +
 | ||||
|  	if (!root_irq_dir || !desc->dir) | ||||
|  		return; | ||||
|  #ifdef CONFIG_SMP | ||||
| @@ -432,6 +438,9 @@ void init_irq_proc(void)
 | ||||
|  	unsigned int irq; | ||||
|  	struct irq_desc *desc; | ||||
|   | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED) && !IS_ENABLED(CONFIG_SMP))
 | ||||
| +		return;
 | ||||
| +
 | ||||
|  	/* create /proc/irq */ | ||||
|  	root_irq_dir = proc_mkdir("irq", NULL); | ||||
|  	if (!root_irq_dir) | ||||
| --- a/kernel/time/timer_list.c
 | ||||
| +++ b/kernel/time/timer_list.c
 | ||||
| @@ -350,6 +350,8 @@ static int __init init_timer_list_procfs
 | ||||
|  { | ||||
|  	struct proc_dir_entry *pe; | ||||
|   | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return 0;
 | ||||
|  	pe = proc_create_seq_private("timer_list", 0400, NULL, &timer_list_sops, | ||||
|  			sizeof(struct timer_list_iter), NULL); | ||||
|  	if (!pe) | ||||
| --- a/mm/vmalloc.c
 | ||||
| +++ b/mm/vmalloc.c
 | ||||
| @@ -4205,6 +4205,8 @@ static const struct seq_operations vmall
 | ||||
|   | ||||
|  static int __init proc_vmalloc_init(void) | ||||
|  { | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return 0;
 | ||||
|  	if (IS_ENABLED(CONFIG_NUMA)) | ||||
|  		proc_create_seq_private("vmallocinfo", 0400, NULL, | ||||
|  				&vmalloc_op, | ||||
| --- a/mm/vmstat.c
 | ||||
| +++ b/mm/vmstat.c
 | ||||
| @@ -2109,10 +2109,12 @@ void __init init_mm_internals(void)
 | ||||
|  	start_shepherd_timer(); | ||||
|  #endif | ||||
|  #ifdef CONFIG_PROC_FS | ||||
| -	proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op);
 | ||||
| -	proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op);
 | ||||
| +	if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {
 | ||||
| +		proc_create_seq("buddyinfo", 0444, NULL, &fragmentation_op);
 | ||||
| +		proc_create_seq("pagetypeinfo", 0400, NULL, &pagetypeinfo_op);
 | ||||
| +		proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op);
 | ||||
| +	}
 | ||||
|  	proc_create_seq("vmstat", 0444, NULL, &vmstat_op); | ||||
| -	proc_create_seq("zoneinfo", 0444, NULL, &zoneinfo_op);
 | ||||
|  #endif | ||||
|  } | ||||
|   | ||||
| --- a/net/8021q/vlanproc.c
 | ||||
| +++ b/net/8021q/vlanproc.c
 | ||||
| @@ -93,6 +93,9 @@ void vlan_proc_cleanup(struct net *net)
 | ||||
|  { | ||||
|  	struct vlan_net *vn = net_generic(net, vlan_net_id); | ||||
|   | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return;
 | ||||
| +
 | ||||
|  	if (vn->proc_vlan_conf) | ||||
|  		remove_proc_entry(name_conf, vn->proc_vlan_dir); | ||||
|   | ||||
| @@ -112,6 +115,9 @@ int __net_init vlan_proc_init(struct net
 | ||||
|  { | ||||
|  	struct vlan_net *vn = net_generic(net, vlan_net_id); | ||||
|   | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
|  	vn->proc_vlan_dir = proc_net_mkdir(net, name_root, net->proc_net); | ||||
|  	if (!vn->proc_vlan_dir) | ||||
|  		goto err; | ||||
| --- a/net/core/net-procfs.c
 | ||||
| +++ b/net/core/net-procfs.c
 | ||||
| @@ -319,10 +319,12 @@ static int __net_init dev_proc_net_init(
 | ||||
|  	if (!proc_create_net("dev", 0444, net->proc_net, &dev_seq_ops, | ||||
|  			sizeof(struct seq_net_private))) | ||||
|  		goto out; | ||||
| -	if (!proc_create_seq("softnet_stat", 0444, net->proc_net,
 | ||||
| +	if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
 | ||||
| +			!proc_create_seq("softnet_stat", 0444, net->proc_net,
 | ||||
|  			 &softnet_seq_ops)) | ||||
|  		goto out_dev; | ||||
| -	if (!proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops,
 | ||||
| +	if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
 | ||||
| +			!proc_create_net("ptype", 0444, net->proc_net, &ptype_seq_ops,
 | ||||
|  			sizeof(struct seq_net_private))) | ||||
|  		goto out_softnet; | ||||
|   | ||||
| @@ -332,9 +334,11 @@ static int __net_init dev_proc_net_init(
 | ||||
|  out: | ||||
|  	return rc; | ||||
|  out_ptype: | ||||
| -	remove_proc_entry("ptype", net->proc_net);
 | ||||
| +	if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		remove_proc_entry("ptype", net->proc_net);
 | ||||
|  out_softnet: | ||||
| -	remove_proc_entry("softnet_stat", net->proc_net);
 | ||||
| +	if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		remove_proc_entry("softnet_stat", net->proc_net);
 | ||||
|  out_dev: | ||||
|  	remove_proc_entry("dev", net->proc_net); | ||||
|  	goto out; | ||||
| @@ -344,8 +348,10 @@ static void __net_exit dev_proc_net_exit
 | ||||
|  { | ||||
|  	wext_proc_exit(net); | ||||
|   | ||||
| -	remove_proc_entry("ptype", net->proc_net);
 | ||||
| -	remove_proc_entry("softnet_stat", net->proc_net);
 | ||||
| +	if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {
 | ||||
| +		remove_proc_entry("ptype", net->proc_net);
 | ||||
| +		remove_proc_entry("softnet_stat", net->proc_net);
 | ||||
| +	}
 | ||||
|  	remove_proc_entry("dev", net->proc_net); | ||||
|  } | ||||
|   | ||||
| --- a/net/core/sock.c
 | ||||
| +++ b/net/core/sock.c
 | ||||
| @@ -4105,6 +4105,8 @@ static __net_initdata struct pernet_oper
 | ||||
|   | ||||
|  static int __init proto_init(void) | ||||
|  { | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return 0;
 | ||||
|  	return register_pernet_subsys(&proto_net_ops); | ||||
|  } | ||||
|   | ||||
| --- a/net/ipv4/fib_trie.c
 | ||||
| +++ b/net/ipv4/fib_trie.c
 | ||||
| @@ -3032,11 +3032,13 @@ static const struct seq_operations fib_r
 | ||||
|   | ||||
|  int __net_init fib_proc_init(struct net *net) | ||||
|  { | ||||
| -	if (!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops,
 | ||||
| +	if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
 | ||||
| +			!proc_create_net("fib_trie", 0444, net->proc_net, &fib_trie_seq_ops,
 | ||||
|  			sizeof(struct fib_trie_iter))) | ||||
|  		goto out1; | ||||
|   | ||||
| -	if (!proc_create_net_single("fib_triestat", 0444, net->proc_net,
 | ||||
| +	if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
 | ||||
| +			!proc_create_net_single("fib_triestat", 0444, net->proc_net,
 | ||||
|  			fib_triestat_seq_show, NULL)) | ||||
|  		goto out2; | ||||
|   | ||||
| @@ -3047,17 +3049,21 @@ int __net_init fib_proc_init(struct net
 | ||||
|  	return 0; | ||||
|   | ||||
|  out3: | ||||
| -	remove_proc_entry("fib_triestat", net->proc_net);
 | ||||
| +	if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		remove_proc_entry("fib_triestat", net->proc_net);
 | ||||
|  out2: | ||||
| -	remove_proc_entry("fib_trie", net->proc_net);
 | ||||
| +	if (!IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		remove_proc_entry("fib_trie", net->proc_net);
 | ||||
|  out1: | ||||
|  	return -ENOMEM; | ||||
|  } | ||||
|   | ||||
|  void __net_exit fib_proc_exit(struct net *net) | ||||
|  { | ||||
| -	remove_proc_entry("fib_trie", net->proc_net);
 | ||||
| -	remove_proc_entry("fib_triestat", net->proc_net);
 | ||||
| +	if (!IS_ENABLED(CONFIG_PROC_STRIPPED)) {
 | ||||
| +		remove_proc_entry("fib_trie", net->proc_net);
 | ||||
| +		remove_proc_entry("fib_triestat", net->proc_net);
 | ||||
| +	}
 | ||||
|  	remove_proc_entry("route", net->proc_net); | ||||
|  } | ||||
|   | ||||
| --- a/net/ipv4/proc.c
 | ||||
| +++ b/net/ipv4/proc.c
 | ||||
| @@ -553,5 +553,8 @@ static __net_initdata struct pernet_oper
 | ||||
|   | ||||
|  int __init ip_misc_proc_init(void) | ||||
|  { | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
|  	return register_pernet_subsys(&ip_proc_ops); | ||||
|  } | ||||
| --- a/net/ipv4/route.c
 | ||||
| +++ b/net/ipv4/route.c
 | ||||
| @@ -380,6 +380,9 @@ static struct pernet_operations ip_rt_pr
 | ||||
|   | ||||
|  static int __init ip_rt_proc_init(void) | ||||
|  { | ||||
| +	if (IS_ENABLED(CONFIG_PROC_STRIPPED))
 | ||||
| +		return 0;
 | ||||
| +
 | ||||
|  	return register_pernet_subsys(&ip_rt_proc_ops); | ||||
|  } | ||||
|   | ||||
							
								
								
									
										93
									
								
								6.6/target/linux/generic/hack-6.6/904-debloat_dma_buf.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								6.6/target/linux/generic/hack-6.6/904-debloat_dma_buf.patch
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,93 @@ | |||
| From e3692cb2fcd5ba1244512a0f43b8118f65f1c375 Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Sat, 8 Jul 2017 08:20:43 +0200 | ||||
| Subject: debloat: dmabuf | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
|  drivers/base/Kconfig      |  2 +- | ||||
|  drivers/dma-buf/Makefile  | 10 +++++++--- | ||||
|  drivers/dma-buf/dma-buf.c |  4 +++- | ||||
|  kernel/sched/core.c       |  1 + | ||||
|  4 files changed, 12 insertions(+), 5 deletions(-) | ||||
| 
 | ||||
| --- a/drivers/base/Kconfig
 | ||||
| +++ b/drivers/base/Kconfig
 | ||||
| @@ -198,7 +198,7 @@ config SOC_BUS
 | ||||
|  source "drivers/base/regmap/Kconfig" | ||||
|   | ||||
|  config DMA_SHARED_BUFFER | ||||
| -	bool
 | ||||
| +	tristate
 | ||||
|  	default n | ||||
|  	select IRQ_WORK | ||||
|  	help | ||||
| --- a/drivers/dma-buf/heaps/Makefile
 | ||||
| +++ b/drivers/dma-buf/heaps/Makefile
 | ||||
| @@ -1,3 +1,3 @@
 | ||||
|  # SPDX-License-Identifier: GPL-2.0 | ||||
| -obj-$(CONFIG_DMABUF_HEAPS_SYSTEM)	+= system_heap.o
 | ||||
| -obj-$(CONFIG_DMABUF_HEAPS_CMA)		+= cma_heap.o
 | ||||
| +dma-buf-objs-$(CONFIG_DMABUF_HEAPS_SYSTEM)	+= system_heap.o
 | ||||
| +dma-buf-objs-$(CONFIG_DMABUF_HEAPS_CMA)		+= cma_heap.o
 | ||||
| --- a/drivers/dma-buf/Makefile
 | ||||
| +++ b/drivers/dma-buf/Makefile
 | ||||
| @@ -1,12 +1,14 @@
 | ||||
|  # SPDX-License-Identifier: GPL-2.0-only | ||||
| -obj-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \
 | ||||
| +obj-$(CONFIG_DMA_SHARED_BUFFER) := dma-shared-buffer.o
 | ||||
| +
 | ||||
| +dma-buf-objs-y := dma-buf.o dma-fence.o dma-fence-array.o dma-fence-chain.o \
 | ||||
|  	 dma-fence-unwrap.o dma-resv.o | ||||
| -obj-$(CONFIG_DMABUF_HEAPS)	+= dma-heap.o
 | ||||
| -obj-$(CONFIG_DMABUF_HEAPS)	+= heaps/
 | ||||
| -obj-$(CONFIG_SYNC_FILE)		+= sync_file.o
 | ||||
| -obj-$(CONFIG_SW_SYNC)		+= sw_sync.o sync_debug.o
 | ||||
| -obj-$(CONFIG_UDMABUF)		+= udmabuf.o
 | ||||
| -obj-$(CONFIG_DMABUF_SYSFS_STATS) += dma-buf-sysfs-stats.o
 | ||||
| +dma-buf-objs-$(CONFIG_DMABUF_HEAPS)	+= dma-heap.o
 | ||||
| +obj-$(CONFIG_DMABUF_HEAPS)		+= heaps/
 | ||||
| +dma-buf-objs-$(CONFIG_SYNC_FILE)	+= sync_file.o
 | ||||
| +dma-buf-objs-$(CONFIG_SW_SYNC)		+= sw_sync.o sync_debug.o
 | ||||
| +dma-buf-objs-$(CONFIG_UDMABUF)		+= udmabuf.o
 | ||||
| +dma-buf-objs-$(CONFIG_DMABUF_SYSFS_STATS) += dma-buf-sysfs-stats.o
 | ||||
|   | ||||
|  dmabuf_selftests-y := \ | ||||
|  	selftest.o \ | ||||
| @@ -15,4 +17,6 @@ dmabuf_selftests-y := \
 | ||||
|  	st-dma-fence-unwrap.o \ | ||||
|  	st-dma-resv.o | ||||
|   | ||||
| -obj-$(CONFIG_DMABUF_SELFTESTS)	+= dmabuf_selftests.o
 | ||||
| +dma-buf-objs-$(CONFIG_DMABUF_SELFTESTS)	+= dmabuf_selftests.o
 | ||||
| +
 | ||||
| +dma-shared-buffer-objs :=  $(dma-buf-objs-y)
 | ||||
| --- a/drivers/dma-buf/dma-buf.c
 | ||||
| +++ b/drivers/dma-buf/dma-buf.c
 | ||||
| @@ -1636,4 +1636,5 @@ static void __exit dma_buf_deinit(void)
 | ||||
|  	kern_unmount(dma_buf_mnt); | ||||
|  	dma_buf_uninit_sysfs_statistics(); | ||||
|  } | ||||
| -__exitcall(dma_buf_deinit);
 | ||||
| +module_exit(dma_buf_deinit);
 | ||||
| +MODULE_LICENSE("GPL");
 | ||||
| --- a/kernel/sched/core.c
 | ||||
| +++ b/kernel/sched/core.c
 | ||||
| @@ -4363,6 +4363,7 @@ int wake_up_state(struct task_struct *p,
 | ||||
|  { | ||||
|  	return try_to_wake_up(p, state, 0); | ||||
|  } | ||||
| +EXPORT_SYMBOL_GPL(wake_up_state);
 | ||||
|   | ||||
|  /* | ||||
|   * Perform scheduler related setup for a newly forked process p. | ||||
| --- a/fs/d_path.c
 | ||||
| +++ b/fs/d_path.c
 | ||||
| @@ -313,6 +313,7 @@ char *dynamic_dname(char *buffer, int bu
 | ||||
|  	buffer += buflen - sz; | ||||
|  	return memcpy(buffer, temp, sz); | ||||
|  } | ||||
| +EXPORT_SYMBOL_GPL(dynamic_dname);
 | ||||
|   | ||||
|  char *simple_dname(struct dentry *dentry, char *buffer, int buflen) | ||||
|  { | ||||
							
								
								
									
										32
									
								
								6.6/target/linux/generic/hack-6.6/910-kobject_uevent.patch
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								6.6/target/linux/generic/hack-6.6/910-kobject_uevent.patch
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | |||
| From 0d37e6edc09c99e683dd91ca0e83bbc0df8477b3 Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Sun, 16 Jul 2017 16:56:10 +0200 | ||||
| Subject: lib: add uevent_next_seqnum() | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
|  include/linux/kobject.h |  5 +++++ | ||||
|  lib/kobject_uevent.c    | 37 +++++++++++++++++++++++++++++++++++++ | ||||
|  2 files changed, 42 insertions(+) | ||||
| 
 | ||||
| --- a/lib/kobject_uevent.c
 | ||||
| +++ b/lib/kobject_uevent.c
 | ||||
| @@ -179,6 +179,18 @@ out:
 | ||||
|  	return r; | ||||
|  } | ||||
|   | ||||
| +u64 uevent_next_seqnum(void)
 | ||||
| +{
 | ||||
| +	u64 seq;
 | ||||
| +
 | ||||
| +	mutex_lock(&uevent_sock_mutex);
 | ||||
| +	seq = ++uevent_seqnum;
 | ||||
| +	mutex_unlock(&uevent_sock_mutex);
 | ||||
| +
 | ||||
| +	return seq;
 | ||||
| +}
 | ||||
| +EXPORT_SYMBOL_GPL(uevent_next_seqnum);
 | ||||
| +
 | ||||
|  /** | ||||
|   * kobject_synth_uevent - send synthetic uevent with arguments | ||||
|   * | ||||
|  | @ -0,0 +1,76 @@ | |||
| From 0d37e6edc09c99e683dd91ca0e83bbc0df8477b3 Mon Sep 17 00:00:00 2001 | ||||
| From: Felix Fietkau <nbd@nbd.name> | ||||
| Date: Sun, 16 Jul 2017 16:56:10 +0200 | ||||
| Subject: lib: add uevent_next_seqnum() | ||||
| 
 | ||||
| Signed-off-by: Felix Fietkau <nbd@nbd.name> | ||||
| ---
 | ||||
|  include/linux/kobject.h |  5 +++++ | ||||
|  lib/kobject_uevent.c    | 37 +++++++++++++++++++++++++++++++++++++ | ||||
|  2 files changed, 42 insertions(+) | ||||
| 
 | ||||
| --- a/include/linux/kobject.h
 | ||||
| +++ b/include/linux/kobject.h
 | ||||
| @@ -32,6 +32,8 @@
 | ||||
|  #define UEVENT_NUM_ENVP			64	/* number of env pointers */ | ||||
|  #define UEVENT_BUFFER_SIZE		2048	/* buffer for the variables */ | ||||
|   | ||||
| +struct sk_buff;
 | ||||
| +
 | ||||
|  #ifdef CONFIG_UEVENT_HELPER | ||||
|  /* path to the userspace helper executed on an event */ | ||||
|  extern char uevent_helper[]; | ||||
| @@ -224,4 +226,7 @@ int kobject_synth_uevent(struct kobject
 | ||||
|  __printf(2, 3) | ||||
|  int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...); | ||||
|   | ||||
| +int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
 | ||||
| +		     gfp_t allocation);
 | ||||
| +
 | ||||
|  #endif /* _KOBJECT_H_ */ | ||||
| --- a/lib/kobject_uevent.c
 | ||||
| +++ b/lib/kobject_uevent.c
 | ||||
| @@ -691,6 +691,43 @@ int add_uevent_var(struct kobj_uevent_en
 | ||||
|  EXPORT_SYMBOL_GPL(add_uevent_var); | ||||
|   | ||||
|  #if defined(CONFIG_NET) | ||||
| +int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
 | ||||
| +		     gfp_t allocation)
 | ||||
| +{
 | ||||
| +	struct uevent_sock *ue_sk;
 | ||||
| +	int err = 0;
 | ||||
| +
 | ||||
| +	/* send netlink message */
 | ||||
| +	mutex_lock(&uevent_sock_mutex);
 | ||||
| +	list_for_each_entry(ue_sk, &uevent_sock_list, list) {
 | ||||
| +		struct sock *uevent_sock = ue_sk->sk;
 | ||||
| +		struct sk_buff *skb2;
 | ||||
| +
 | ||||
| +		skb2 = skb_clone(skb, allocation);
 | ||||
| +		if (!skb2)
 | ||||
| +			break;
 | ||||
| +
 | ||||
| +		err = netlink_broadcast(uevent_sock, skb2, pid, group,
 | ||||
| +					allocation);
 | ||||
| +		if (err)
 | ||||
| +			break;
 | ||||
| +	}
 | ||||
| +	mutex_unlock(&uevent_sock_mutex);
 | ||||
| +
 | ||||
| +	kfree_skb(skb);
 | ||||
| +	return err;
 | ||||
| +}
 | ||||
| +#else
 | ||||
| +int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
 | ||||
| +		     gfp_t allocation)
 | ||||
| +{
 | ||||
| +	kfree_skb(skb);
 | ||||
| +	return 0;
 | ||||
| +}
 | ||||
| +#endif
 | ||||
| +EXPORT_SYMBOL_GPL(broadcast_uevent);
 | ||||
| +
 | ||||
| +#if defined(CONFIG_NET)
 | ||||
|  static int uevent_net_broadcast(struct sock *usk, struct sk_buff *skb, | ||||
|  				struct netlink_ext_ack *extack) | ||||
|  { | ||||
|  | @ -0,0 +1,21 @@ | |||
| From e08bcbbaa52fcc41f02743fd2e62a33255ce52da Mon Sep 17 00:00:00 2001 | ||||
| From: OpenWrt community <openwrt-devel@lists.openwrt.org> | ||||
| Date: Wed, 13 Jul 2022 13:52:28 +0200 | ||||
| Subject: [PATCH] of/ftd: add device tree cmdline | ||||
| 
 | ||||
| ---
 | ||||
|  drivers/of/fdt.c | 3 +++ | ||||
|  1 file changed, 3 insertions(+) | ||||
| 
 | ||||
| --- a/drivers/of/fdt.c
 | ||||
| +++ b/drivers/of/fdt.c
 | ||||
| @@ -1183,6 +1183,9 @@ int __init early_init_dt_scan_chosen(cha
 | ||||
|  	p = of_get_flat_dt_prop(node, "bootargs", &l); | ||||
|  	if (p != NULL && l > 0) | ||||
|  		strscpy(cmdline, p, min(l, COMMAND_LINE_SIZE)); | ||||
| +	p = of_get_flat_dt_prop(node, "bootargs-append", &l);
 | ||||
| +	if (p != NULL && l > 0)
 | ||||
| +		strlcat(cmdline, p, min_t(int, strlen(cmdline) + (int)l, COMMAND_LINE_SIZE));
 | ||||
|   | ||||
|  handle_cmdline: | ||||
|  	/* | ||||
|  | @ -0,0 +1,30 @@ | |||
| From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <rafal@milecki.pl> | ||||
| Date: Tue, 19 Jul 2022 06:17:48 +0200 | ||||
| Subject: [PATCH] Revert "Revert "Revert "driver core: Set fw_devlink=on by | ||||
|  default""" | ||||
| MIME-Version: 1.0 | ||||
| Content-Type: text/plain; charset=UTF-8 | ||||
| Content-Transfer-Encoding: 8bit | ||||
| 
 | ||||
| This reverts commit ea718c699055c8566eb64432388a04974c43b2ea. | ||||
| 
 | ||||
| With of_platform_populate() called for MTD partitions that commit breaks | ||||
| probing devices which reference MTD in device tree. | ||||
| 
 | ||||
| Link: https://lore.kernel.org/all/696cb2da-20b9-b3dd-46d9-de4bf91a1506@gmail.com/T/#u | ||||
| Signed-off-by: Rafał Miłecki <rafal@milecki.pl> | ||||
| ---
 | ||||
|  drivers/base/core.c | 2 +- | ||||
|  1 file changed, 1 insertion(+), 1 deletion(-) | ||||
| 
 | ||||
| --- a/drivers/base/core.c
 | ||||
| +++ b/drivers/base/core.c
 | ||||
| @@ -1700,7 +1700,7 @@ static void device_links_purge(struct de
 | ||||
|  #define FW_DEVLINK_FLAGS_RPM		(FW_DEVLINK_FLAGS_ON | \ | ||||
|  					 DL_FLAG_PM_RUNTIME) | ||||
|   | ||||
| -static u32 fw_devlink_flags = FW_DEVLINK_FLAGS_ON;
 | ||||
| +static u32 fw_devlink_flags = FW_DEVLINK_FLAGS_PERMISSIVE;
 | ||||
|  static int __init fw_devlink_setup(char *arg) | ||||
|  { | ||||
|  	if (!arg) | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue