all: compile
endif
-KERNEL_FILE_DEPENDS=$(GENERIC_PATCH_DIR) $(PATCH_DIR) $(GENERIC_FILES_DIR) $(FILES_DIR)
+KERNEL_FILE_DEPENDS=$(BACKPORT_PATCH_DIR) $(GENERIC_PATCH_DIR) $(GENERIC_HACK_DIR) $(PATCH_DIR) $(GENERIC_FILES_DIR) $(FILES_DIR)
STAMP_PREPARED=$(LINUX_DIR)/.prepared$(if $(QUILT)$(DUMP),,_$(shell $(call find_md5,$(KERNEL_FILE_DEPENDS),)))
STAMP_CONFIGURED:=$(LINUX_DIR)/.configured
include $(INCLUDE_DIR)/download.mk
$(if $(QUILT),rm -rf $(PKG_BUILD_DIR)/patches; mkdir -p $(PKG_BUILD_DIR)/patches)
$(if $(kernel_files),$(CP) $(kernel_files) $(LINUX_DIR)/)
find $(LINUX_DIR)/ -name \*.rej -or -name \*.orig | $(XARGS) rm -f
+ if [ -d $(GENERIC_PLATFORM_DIR)/patches$(if $(wildcard $(GENERIC_PLATFORM_DIR)/patches-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER)) ]; then \
+ echo "generic patches directory is present. please move your patches to the pending directory" ; \
+ exit 1; \
+ fi
+ $(call PatchDir,$(PKG_BUILD_DIR),$(GENERIC_BACKPORT_DIR),generic-backport/)
$(call PatchDir,$(PKG_BUILD_DIR),$(GENERIC_PATCH_DIR),generic/)
+ $(call PatchDir,$(PKG_BUILD_DIR),$(GENERIC_HACK_DIR),generic-hack/)
$(call PatchDir,$(PKG_BUILD_DIR),$(PATCH_DIR),platform/)
endef
echo "All kernel patches must start with either generic/ or platform/"; \
false; \
}
+ $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(GENERIC_BACKPORT_DIR),generic-backport/)
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(GENERIC_PATCH_DIR),generic/)
+ $(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(GENERIC_HACK_DIR),generic-hack/)
$(call Quilt/RefreshDir,$(PKG_BUILD_DIR),$(PATCH_DIR),platform/)
endef
endif
GENERIC_PLATFORM_DIR := $(TOPDIR)/target/linux/generic
-GENERIC_PATCH_DIR := $(GENERIC_PLATFORM_DIR)/patches$(if $(wildcard $(GENERIC_PLATFORM_DIR)/patches-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER))
+GENERIC_BACKPORT_DIR := $(GENERIC_PLATFORM_DIR)/backport$(if $(wildcard $(GENERIC_PLATFORM_DIR)/backport-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER))
+GENERIC_PATCH_DIR := $(GENERIC_PLATFORM_DIR)/pending$(if $(wildcard $(GENERIC_PLATFORM_DIR)/pending-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER))
+GENERIC_HACK_DIR := $(GENERIC_PLATFORM_DIR)/hack$(if $(wildcard $(GENERIC_PLATFORM_DIR)/hack-$(KERNEL_PATCHVER)),-$(KERNEL_PATCHVER))
GENERIC_FILES_DIR := $(foreach dir,$(wildcard $(GENERIC_PLATFORM_DIR)/files $(GENERIC_PLATFORM_DIR)/files-$(KERNEL_PATCHVER)),"$(dir)")
__config_name_list = $(1)/config-$(KERNEL_PATCHVER) $(1)/config-default
+From 13b1ecc3401653a355798eb1dee10cc1608202f4 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@nbd.name>
Date: Mon, 18 Jan 2016 12:27:49 +0100
-Subject: [PATCH] Kbuild: don't hardcode path to awk in scripts/ld-version.sh
+Subject: [PATCH 33/34] Kbuild: don't hardcode path to awk in
+ scripts/ld-version.sh
On some systems /usr/bin/awk does not exist, or is broken. Find it via
$PATH instead.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
+ scripts/ld-version.sh | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+diff --git a/scripts/ld-version.sh b/scripts/ld-version.sh
+index d135882e2c40..66e6e5ed1b7b 100755
--- a/scripts/ld-version.sh
+++ b/scripts/ld-version.sh
@@ -1,5 +1,6 @@
exit
}
+'
+--
+2.11.0
+
+From 173019b66dcc9d68ad9333aa744dad1e369b5aa8 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sun, 9 Jul 2017 00:26:53 +0200
+Subject: [PATCH 34/34] kernel: add compile fix for linux 4.9 on x86
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ Makefile | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index dd0a67d6e392..6e37f6bb669a 100644
--- a/Makefile
+++ b/Makefile
-@@ -414,8 +414,8 @@ KERNELRELEASE = $(shell cat include/conf
+@@ -420,8 +420,8 @@ KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION
export MAKE AWK GENKSYMS INSTALLKERNEL PERL PYTHON UTS_MACHINE
export HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
+--
+2.11.0
+
-Subject: netfilter: conntrack: cache route for forwarded connections
+From c4d66e57455f5384128753674cc0f9e02db5e1f6 Mon Sep 17 00:00:00 2001
+From: Florian Westphal <fw@strlen.de>
+Date: Sun, 9 Jul 2017 08:58:30 +0200
+Subject: [PATCH] netfilter: conntrack: cache route for forwarded connections
... to avoid per-packet FIB lookup if possible.
avoid holding on to dsts of 'frozen' conntracks.
Signed-off-by: Florian Westphal <fw@strlen.de>
+---
+ include/net/netfilter/nf_conntrack_extend.h | 4 +
+ include/net/netfilter/nf_conntrack_rtcache.h | 34 +++
+ net/netfilter/Kconfig | 12 +
+ net/netfilter/Makefile | 3 +
+ net/netfilter/nf_conntrack_rtcache.c | 413 +++++++++++++++++++++++++++
+ 5 files changed, 466 insertions(+)
+ create mode 100644 include/net/netfilter/nf_conntrack_rtcache.h
+ create mode 100644 net/netfilter/nf_conntrack_rtcache.c
+diff --git a/include/net/netfilter/nf_conntrack_extend.h b/include/net/netfilter/nf_conntrack_extend.h
+index 1c3035dda31f..0988c7dfa604 100644
--- a/include/net/netfilter/nf_conntrack_extend.h
+++ b/include/net/netfilter/nf_conntrack_extend.h
@@ -27,6 +27,9 @@ enum nf_ct_ext_id {
/* Extensions: optional stuff which isn't permanently in struct. */
struct nf_ct_ext {
+diff --git a/include/net/netfilter/nf_conntrack_rtcache.h b/include/net/netfilter/nf_conntrack_rtcache.h
+new file mode 100644
+index 000000000000..e2fb30243354
--- /dev/null
+++ b/include/net/netfilter/nf_conntrack_rtcache.h
@@ -0,0 +1,34 @@
+{
+ return rtc->cached_dst[dir].iif;
+}
+diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig
+index e8d56d9a4df2..82af5ba64088 100644
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
@@ -114,6 +114,18 @@ config NF_CONNTRACK_EVENTS
config NF_CONNTRACK_TIMEOUT
bool 'Connection tracking timeout'
depends on NETFILTER_ADVANCED
+diff --git a/net/netfilter/Makefile b/net/netfilter/Makefile
+index c23c3c84416f..8adef51367f9 100644
--- a/net/netfilter/Makefile
+++ b/net/netfilter/Makefile
-@@ -16,6 +16,9 @@ obj-$(CONFIG_NETFILTER_NETLINK_LOG) += n
+@@ -16,6 +16,9 @@ obj-$(CONFIG_NETFILTER_NETLINK_LOG) += nfnetlink_log.o
# connection tracking
obj-$(CONFIG_NF_CONNTRACK) += nf_conntrack.o
# SCTP protocol connection tracking
obj-$(CONFIG_NF_CT_PROTO_DCCP) += nf_conntrack_proto_dccp.o
obj-$(CONFIG_NF_CT_PROTO_GRE) += nf_conntrack_proto_gre.o
+diff --git a/net/netfilter/nf_conntrack_rtcache.c b/net/netfilter/nf_conntrack_rtcache.c
+new file mode 100644
+index 000000000000..fb073d01960d
--- /dev/null
+++ b/net/netfilter/nf_conntrack_rtcache.c
@@ -0,0 +1,413 @@
+MODULE_LICENSE("GPL");
+MODULE_AUTHOR("Florian Westphal <fw@strlen.de>");
+MODULE_DESCRIPTION("Conntrack route cache extension");
+--
+2.11.0
+
if (prev == port)
--- a/net/bridge/br_mdb.c
+++ b/net/bridge/br_mdb.c
-@@ -532,7 +532,7 @@ static int br_mdb_add_group(struct net_b
+@@ -531,7 +531,7 @@ static int br_mdb_add_group(struct net_b
break;
}
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1263,6 +1263,13 @@ static int spansion_quad_enable(struct s
- return ret;
+@@ -1256,6 +1256,13 @@ static int spansion_quad_enable(struct s
+ return -EINVAL;
}
+ ret = spi_nor_wait_till_ready(nor);
if (ret < 0)
goto write_err;
written = ret;
-@@ -1319,6 +1408,47 @@ static int spi_nor_check(struct spi_nor
+@@ -1312,6 +1401,47 @@ static int spi_nor_check(struct spi_nor
return 0;
}
int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)
{
const struct flash_info *info = NULL;
-@@ -1367,6 +1497,14 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -1360,6 +1490,14 @@ int spi_nor_scan(struct spi_nor *nor, co
mutex_init(&nor->lock);
/*
* Atmel, SST, Intel/Numonyx, and others serial NOR tend to power up
* with the software protection bits set
*/
-@@ -1524,6 +1662,12 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -1517,6 +1655,12 @@ int spi_nor_scan(struct spi_nor *nor, co
nor->read_dummy = spi_nor_read_dummy_cycles(nor);
static struct seq_rw_config stfsm_s25fl_write4_configs[] = {
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1632,16 +1632,16 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -1625,16 +1625,16 @@ int spi_nor_scan(struct spi_nor *nor, co
/* Dedicated 4-byte command set */
switch (nor->flash_read) {
case SPI_NOR_QUAD:
/* Enable/disable 4-byte addressing mode. */
static inline int set_4byte(struct spi_nor *nor, const struct flash_info *info,
int enable)
-@@ -1628,27 +1704,10 @@ int spi_nor_scan(struct spi_nor *nor, co
+@@ -1621,27 +1697,10 @@ int spi_nor_scan(struct spi_nor *nor, co
else if (mtd->size > 0x1000000) {
/* enable 4-byte addressing if the device exceeds 16MiB */
nor->addr_width = 4;
--- /dev/null
+From fd66884da2f96d2a7ea73f58b1b86251b959a913 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 16:56:19 +0200
+Subject: kernel: strip unnecessary symbol table information from kernel modules
+
+reduces default squashfs size on ar71xx by about 4k
+
+lede-commit: 058d331a39077f159ca8922f1f422a1346d6aa67
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index a40b373eba3a..984eb5907d00 100644
+--- a/Makefile
++++ b/Makefile
+@@ -407,7 +407,7 @@ KBUILD_CFLAGS_KERNEL :=
+ KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
+ KBUILD_AFLAGS_MODULE := -DMODULE
+ KBUILD_CFLAGS_MODULE := -DMODULE
+-KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
++KBUILD_LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds $(if $(CONFIG_PROFILING),,-s)
+
+ # Read KERNELRELEASE from include/config/kernel.release (if it exists)
+ KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
+--
+2.11.0
+
+From a779a482fb9b9f8fcdf8b2519c789b4b9bb5dd05 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@nbd.name>
-Subject: [PATCH] build: add a hack for removing non-essential module info
+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(-)
+
+diff --git a/include/linux/module.h b/include/linux/module.h
+index 0c3207d26ac0..08b58474bfd2 100644
--- a/include/linux/module.h
+++ b/include/linux/module.h
@@ -159,6 +159,7 @@ extern void cleanup_module(void);
/* Creates an alias so file2alias.c can find device table. */
#define MODULE_DEVICE_TABLE(type, name) \
extern const typeof(name) __mod_##type##__##name##_device_table \
-@@ -234,7 +235,9 @@ extern const typeof(name) __mod_##type##
+@@ -234,7 +235,9 @@ extern const typeof(name) __mod_##type##__##name##_device_table \
*/
#if defined(MODULE) || !defined(CONFIG_SYSFS)
#else
#define MODULE_VERSION(_version) \
static struct module_version_attribute ___modver_attr = { \
-@@ -256,7 +259,7 @@ extern const typeof(name) __mod_##type##
+@@ -256,7 +259,7 @@ extern const typeof(name) __mod_##type##__##name##_device_table \
/* Optional firmware file (or files) needed by the module
* format is simply firmware file name. Multiple firmware
* files require multiple MODULE_FIRMWARE() specifiers */
struct notifier_block;
+diff --git a/include/linux/moduleparam.h b/include/linux/moduleparam.h
+index 52666d90ca94..f0db3592906a 100644
--- a/include/linux/moduleparam.h
+++ b/include/linux/moduleparam.h
@@ -16,6 +16,16 @@
#ifdef MODULE
#define __MODULE_INFO(tag, name, info) \
static const char __UNIQUE_ID(name)[] \
-@@ -23,8 +33,7 @@ static const char __UNIQUE_ID(name)[]
+@@ -23,8 +33,7 @@ static const char __UNIQUE_ID(name)[] \
= __stringify(tag) "=" info
#else /* !MODULE */
/* This struct is here for syntactic coherency, it is not used */
#endif
#define __MODULE_PARM_TYPE(name, _type) \
__MODULE_INFO(parmtype, name##type, #name ":" _type)
-@@ -32,7 +41,7 @@ static const char __UNIQUE_ID(name)[]
+@@ -32,7 +41,7 @@ static const char __UNIQUE_ID(name)[] \
/* 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) \
struct kernel_param;
+diff --git a/init/Kconfig b/init/Kconfig
+index 34407f15e6d3..9f2c0cabbc97 100644
--- a/init/Kconfig
+++ b/init/Kconfig
-@@ -2106,6 +2106,13 @@ config TRIM_UNUSED_KSYMS
+@@ -2095,6 +2095,13 @@ config TRIM_UNUSED_KSYMS
If unsure, or if you need to build out-of-tree modules, say N.
endif # MODULES
config MODULES_TREE_LOOKUP
+diff --git a/kernel/module.c b/kernel/module.c
+index 0e54d5bf0097..80b5ac4181c6 100644
--- a/kernel/module.c
+++ b/kernel/module.c
-@@ -2945,9 +2945,11 @@ static struct module *setup_load_info(st
+@@ -2945,9 +2945,11 @@ static struct module *setup_load_info(struct load_info *info, int flags)
static int check_modinfo(struct module *mod, struct load_info *info, int flags)
{
if (flags & MODULE_INIT_IGNORE_VERMAGIC)
modmagic = NULL;
-@@ -2968,6 +2970,7 @@ static int check_modinfo(struct module *
+@@ -2968,6 +2970,7 @@ static int check_modinfo(struct module *mod, struct load_info *info, int flags)
mod->name);
add_taint_module(mod, TAINT_OOT_MODULE, LOCKDEP_STILL_OK);
}
if (get_modinfo(info, "staging")) {
add_taint_module(mod, TAINT_CRAP, LOCKDEP_STILL_OK);
+diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
+index bd8349759095..80f214adbe44 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -1964,7 +1964,9 @@ static void read_symbols(char *modname)
}
if (!is_vmlinux(modname) ||
(is_vmlinux(modname) && vmlinux_section_warnings))
-@@ -2108,7 +2110,9 @@ static void add_header(struct buffer *b,
+@@ -2108,7 +2110,9 @@ static void add_header(struct buffer *b, struct module *mod)
buf_printf(b, "#include <linux/vermagic.h>\n");
buf_printf(b, "#include <linux/compiler.h>\n");
buf_printf(b, "\n");
buf_printf(b, "\n");
buf_printf(b, "__visible struct module __this_module\n");
buf_printf(b, "__attribute__((section(\".gnu.linkonce.this_module\"))) = {\n");
-@@ -2125,16 +2129,20 @@ static void add_header(struct buffer *b,
+@@ -2125,16 +2129,20 @@ static void add_header(struct buffer *b, struct module *mod)
static void add_intree_flag(struct buffer *b, int is_intree)
{
}
/* In kernel, this size is defined in linux/module.h;
-@@ -2238,11 +2246,13 @@ static void add_depends(struct buffer *b
+@@ -2238,11 +2246,13 @@ static void add_depends(struct buffer *b, struct module *mod,
static void add_srcversion(struct buffer *b, struct module *mod)
{
add_srcversion(&buf, mod);
sprintf(fname, "%s.mod.c", mod->name);
+--
+2.11.0
+
-Disable modules.order to improve build performance.
-This file is not needed for anything in LEDE
+From c9ef4ab0f54356ee9f91d9676ea0ec123840ddc7 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 16:57:33 +0200
+Subject: kernel: do not build modules.order
+It is not needed for anything on the system and skipping this saves some
+build time, especially in cases where there is nothing to do.
+
+lede-commit: afc1675833a7bf5df094f59f7250369520646d04
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
+ Makefile | 2 --
+ scripts/Makefile.build | 2 +-
+ 2 files changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 984eb5907d00..cce1c68e48ae 100644
--- a/Makefile
+++ b/Makefile
-@@ -1196,7 +1196,6 @@ all: modules
+@@ -1193,7 +1193,6 @@ all: modules
PHONY += modules
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin
@$(kecho) ' Building modules, stage 2.';
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
-@@ -1226,7 +1225,6 @@ _modinst_:
+@@ -1223,7 +1222,6 @@ _modinst_:
rm -f $(MODLIB)/build ; \
ln -s $(CURDIR) $(MODLIB)/build ; \
fi
@cp -f $(objtree)/modules.builtin $(MODLIB)/
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
+diff --git a/scripts/Makefile.build b/scripts/Makefile.build
+index 7675d11ee65e..108d73273788 100644
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -93,7 +93,7 @@ modorder-target := $(obj)/modules.order
$(subdir-ym) $(always)
@:
+--
+2.11.0
+
+From db7c30dcd9a0391bf13b62c9f91e144d762ef43a Mon Sep 17 00:00:00 2001
+From: Florian Fainelli <f.fainelli@gmail.com>
+Date: Fri, 7 Jul 2017 17:00:49 +0200
+Subject: Add an OSX specific patch to make the kernel be compiled
+
+lede-commit: 3fc2a24f0422b2f55f9ed43f116db3111f700526
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+---
+ scripts/kconfig/Makefile | 3 +
+ scripts/mod/elf.h | 3007 ++++++++++++++++++++++++++++++++++++++++++++
+ scripts/mod/mk_elfconfig.c | 4 +
+ scripts/mod/modpost.h | 4 +
+ 4 files changed, 3018 insertions(+)
+ create mode 100644 scripts/mod/elf.h
+
+diff --git a/scripts/kconfig/Makefile b/scripts/kconfig/Makefile
+index 90a091b6ae4d..f9620652e70a 100644
--- a/scripts/kconfig/Makefile
+++ b/scripts/kconfig/Makefile
-@@ -163,6 +163,9 @@ check-lxdialog := $(srctree)/$(src)/lxd
+@@ -163,6 +163,9 @@ check-lxdialog := $(srctree)/$(src)/lxdialog/check-lxdialog.sh
# we really need to do so. (Do not call gcc as part of make mrproper)
HOST_EXTRACFLAGS += $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags) \
-DLOCALE
# ===========================================================================
# Shared Makefile for the various kconfig executables:
---- a/scripts/mod/mk_elfconfig.c
-+++ b/scripts/mod/mk_elfconfig.c
-@@ -1,7 +1,11 @@
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
-+#ifndef __APPLE__
- #include <elf.h>
-+#else
-+#include "elf.h"
-+#endif
-
- int
- main(int argc, char **argv)
---- a/scripts/mod/modpost.h
-+++ b/scripts/mod/modpost.h
-@@ -7,7 +7,11 @@
- #include <sys/mman.h>
- #include <fcntl.h>
- #include <unistd.h>
-+#if !(defined(__APPLE__) || defined(__CYGWIN__))
- #include <elf.h>
-+#else
-+#include "elf.h"
-+#endif
-
- #include "elfconfig.h"
-
+diff --git a/scripts/mod/elf.h b/scripts/mod/elf.h
+new file mode 100644
+index 000000000000..036a176345eb
--- /dev/null
+++ b/scripts/mod/elf.h
@@ -0,0 +1,3007 @@
+#define R_TILEGX_NUM 130
+
+#endif /* elf.h */
+diff --git a/scripts/mod/mk_elfconfig.c b/scripts/mod/mk_elfconfig.c
+index a4fd71d71d65..5ec3740ebb3c 100644
+--- a/scripts/mod/mk_elfconfig.c
++++ b/scripts/mod/mk_elfconfig.c
+@@ -1,7 +1,11 @@
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <string.h>
++#ifndef __APPLE__
+ #include <elf.h>
++#else
++#include "elf.h"
++#endif
+
+ int
+ main(int argc, char **argv)
+diff --git a/scripts/mod/modpost.h b/scripts/mod/modpost.h
+index 6a5e1515123b..237c50d2ec6c 100644
+--- a/scripts/mod/modpost.h
++++ b/scripts/mod/modpost.h
+@@ -7,7 +7,11 @@
+ #include <sys/mman.h>
+ #include <fcntl.h>
+ #include <unistd.h>
++#if !(defined(__APPLE__) || defined(__CYGWIN__))
+ #include <elf.h>
++#else
++#include "elf.h"
++#endif
+
+ #include "elfconfig.h"
+
+--
+2.11.0
+
--- /dev/null
+From 7f698012384ccb1ed10cc758acfd085096fdb307 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:02:03 +0200
+Subject: kernel: fix linux 4.9 host tools portability issues
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ tools/build/Build.include | 2 +-
+ tools/perf/pmu-events/jevents.c | 1 +
+ tools/perf/pmu-events/json.c | 1 -
+ 3 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tools/build/Build.include b/tools/build/Build.include
+index 1dcb95e76f70..9d6f97a7c1aa 100644
+--- a/tools/build/Build.include
++++ b/tools/build/Build.include
+@@ -95,4 +95,4 @@ cxx_flags = -Wp,-MD,$(depfile),-MT,$@ $(CXXFLAGS) -D"BUILD_STR(s)=\#s" $(CXXFLAG
+ ###
+ ## HOSTCC C flags
+
+-host_c_flags = -Wp,-MD,$(depfile),-MT,$@ $(CHOSTFLAGS) -D"BUILD_STR(s)=\#s" $(CHOSTFLAGS_$(basetarget).o) $(CHOSTFLAGS_$(obj))
++host_c_flags = -MD -MF $(depfile) -MT $@ $(CHOSTFLAGS) -D"BUILD_STR(s)=\#s" $(CHOSTFLAGS_$(basetarget).o) $(CHOSTFLAGS_$(obj))
+diff --git a/tools/perf/pmu-events/jevents.c b/tools/perf/pmu-events/jevents.c
+index 41611d7f9873..51333bee190c 100644
+--- a/tools/perf/pmu-events/jevents.c
++++ b/tools/perf/pmu-events/jevents.c
+@@ -35,6 +35,7 @@
+ #include <stdlib.h>
+ #include <errno.h>
+ #include <string.h>
++#include <strings.h>
+ #include <ctype.h>
+ #include <unistd.h>
+ #include <stdarg.h>
+diff --git a/tools/perf/pmu-events/json.c b/tools/perf/pmu-events/json.c
+index f67bbb0aa36e..a72c70a97fab 100644
+--- a/tools/perf/pmu-events/json.c
++++ b/tools/perf/pmu-events/json.c
+@@ -38,7 +38,6 @@
+ #include <unistd.h>
+ #include "jsmn.h"
+ #include "json.h"
+-#include <linux/kernel.h>
+
+
+ static char *mapfile(const char *fn, size_t *size)
+--
+2.11.0
+
+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: linux-3.6: fix portability of some includes files in tools/ used on the host
+
+lede-commit: 6040b1d29ab1f047c5e49b748abcb6a3196add28
+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
+
+diff --git a/tools/include/tools/be_byteshift.h b/tools/include/tools/be_byteshift.h
+index 84c17d836578..ed9932e97bd4 100644
--- a/tools/include/tools/be_byteshift.h
+++ b/tools/include/tools/be_byteshift.h
@@ -1,6 +1,10 @@
#include <stdint.h>
static inline uint16_t __get_unaligned_be16(const uint8_t *p)
+diff --git a/tools/include/tools/le_byteshift.h b/tools/include/tools/le_byteshift.h
+index 8fe9f2488ec7..2e387b5226d9 100644
--- a/tools/include/tools/le_byteshift.h
+++ b/tools/include/tools/le_byteshift.h
@@ -1,6 +1,10 @@
#include <stdint.h>
static inline uint16_t __get_unaligned_le16(const uint8_t *p)
+diff --git a/tools/include/tools/linux_types.h b/tools/include/tools/linux_types.h
+new file mode 100644
+index 000000000000..f07ef8293ebc
--- /dev/null
+++ b/tools/include/tools/linux_types.h
@@ -0,0 +1,22 @@
+typedef uint64_t __le64;
+
+#endif
+--
+2.11.0
+
--- /dev/null
+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(-)
+
+diff --git a/include/uapi/linux/spi/spidev.h b/include/uapi/linux/spi/spidev.h
+index dd5f21e75805..e5e8fea8b068 100644
+--- a/include/uapi/linux/spi/spidev.h
++++ b/include/uapi/linux/spi/spidev.h
+@@ -111,7 +111,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)])
+
+--
+2.11.0
+
+From e3d8676f5722b7622685581e06e8f53e6138e3ab Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@nbd.name>
-
-use -ffunction-sections, -fdata-sections and --gc-sections
+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: Jonas Gorski <jogo@openwrt.org>
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
+ Makefile | 10 +++----
+ arch/arm/Kconfig | 1 +
+ arch/arm/boot/compressed/Makefile | 1 +
+ arch/arm/kernel/vmlinux.lds.S | 26 ++++++++--------
+ arch/mips/Kconfig | 1 +
+ arch/mips/kernel/vmlinux.lds.S | 4 +--
+ include/asm-generic/vmlinux.lds.h | 63 ++++++++++++++++++++-------------------
+ 7 files changed, 55 insertions(+), 51 deletions(-)
+diff --git a/Makefile b/Makefile
+index 42435dfa5fc3..66cdf6a59b53 100644
+--- a/Makefile
++++ b/Makefile
+@@ -410,6 +410,11 @@ KBUILD_AFLAGS_MODULE := -DMODULE
+ KBUILD_CFLAGS_MODULE := -DMODULE
+ KBUILD_LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds $(if $(CONFIG_PROFILING),,-s)
+
++ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
++KBUILD_CFLAGS_KERNEL += $(call cc-option,-ffunction-sections,)
++KBUILD_CFLAGS_KERNEL += $(call cc-option,-fdata-sections,)
++endif
++
+ # Read KERNELRELEASE from include/config/kernel.release (if it exists)
+ KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
+ KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
+@@ -631,11 +636,6 @@ include arch/$(SRCARCH)/Makefile
+ KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,)
+ KBUILD_CFLAGS += $(call cc-disable-warning,frame-address,)
+
+-ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
+-KBUILD_CFLAGS += $(call cc-option,-ffunction-sections,)
+-KBUILD_CFLAGS += $(call cc-option,-fdata-sections,)
+-endif
+-
+ ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
+ KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,) $(EXTRA_OPTIMIZATION)
+ else
+diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
+index b5d529fdffab..7f69418bf02c 100644
+--- a/arch/arm/Kconfig
++++ b/arch/arm/Kconfig
+@@ -81,6 +81,7 @@ config ARM
+ select HAVE_UID16
+ select HAVE_VIRT_CPU_ACCOUNTING_GEN
+ select IRQ_FORCED_THREADING
++ select LD_DEAD_CODE_DATA_ELIMINATION
+ select MODULES_USE_ELF_REL
+ select NO_BOOTMEM
+ select OF_EARLY_FLATTREE if OF
+diff --git a/arch/arm/boot/compressed/Makefile b/arch/arm/boot/compressed/Makefile
+index d50430c40045..6bdeb009a46d 100644
+--- a/arch/arm/boot/compressed/Makefile
++++ b/arch/arm/boot/compressed/Makefile
+@@ -102,6 +102,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
+ ORIG_CFLAGS := $(KBUILD_CFLAGS)
+ KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
+ endif
++KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))
+
+ # -fstack-protector-strong triggers protection checks in this code,
+ # but it is being used too early to link to meaningful stack_chk logic.
+diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
+index f7f55df0bf7b..e9d70c92d99f 100644
+--- a/arch/arm/kernel/vmlinux.lds.S
++++ b/arch/arm/kernel/vmlinux.lds.S
+@@ -17,7 +17,7 @@
+ #define PROC_INFO \
+ . = ALIGN(4); \
+ VMLINUX_SYMBOL(__proc_info_begin) = .; \
+- *(.proc.info.init) \
++ KEEP(*(.proc.info.init)) \
+ VMLINUX_SYMBOL(__proc_info_end) = .;
+
+ #define HYPERVISOR_TEXT \
+@@ -28,11 +28,11 @@
+ #define IDMAP_TEXT \
+ ALIGN_FUNCTION(); \
+ VMLINUX_SYMBOL(__idmap_text_start) = .; \
+- *(.idmap.text) \
++ KEEP(*(.idmap.text)) \
+ VMLINUX_SYMBOL(__idmap_text_end) = .; \
+ . = ALIGN(PAGE_SIZE); \
+ VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \
+- *(.hyp.idmap.text) \
++ KEEP(*(.hyp.idmap.text)) \
+ VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
+
+ #ifdef CONFIG_HOTPLUG_CPU
+@@ -105,7 +105,7 @@ SECTIONS
+ _stext = .; /* Text and read-only data */
+ IDMAP_TEXT
+ __exception_text_start = .;
+- *(.exception.text)
++ KEEP(*(.exception.text))
+ __exception_text_end = .;
+ IRQENTRY_TEXT
+ SOFTIRQENTRY_TEXT
+@@ -134,7 +134,7 @@ SECTIONS
+ __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
+ __start___ex_table = .;
+ #ifdef CONFIG_MMU
+- *(__ex_table)
++ KEEP(*(__ex_table))
+ #endif
+ __stop___ex_table = .;
+ }
+@@ -146,12 +146,12 @@ SECTIONS
+ . = 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 = .;
+ }
+ #endif
+@@ -171,14 +171,14 @@ SECTIONS
+ */
+ __vectors_start = .;
+ .vectors 0xffff0000 : AT(__vectors_start) {
+- *(.vectors)
++ KEEP(*(.vectors))
+ }
+ . = __vectors_start + SIZEOF(.vectors);
+ __vectors_end = .;
+
+ __stubs_start = .;
+ .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {
+- *(.stubs)
++ KEEP(*(.stubs))
+ }
+ . = __stubs_start + SIZEOF(.stubs);
+ __stubs_end = .;
+@@ -194,24 +194,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 = .;
+ }
+ .init.data : {
+diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
+index 3a97487b8b81..05e7bfeab2f9 100644
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -55,6 +55,7 @@ config MIPS
+ select CLONE_BACKWARDS
+ select HAVE_DEBUG_STACKOVERFLOW
+ select HAVE_CC_STACKPROTECTOR
++ select LD_DEAD_CODE_DATA_ELIMINATION
+ select CPU_PM if CPU_IDLE
+ select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
+ select ARCH_BINFMT_ELF_STATE
+diff --git a/arch/mips/kernel/vmlinux.lds.S b/arch/mips/kernel/vmlinux.lds.S
+index d5de67591735..de5f682b5597 100644
--- a/arch/mips/kernel/vmlinux.lds.S
+++ b/arch/mips/kernel/vmlinux.lds.S
@@ -71,7 +71,7 @@ SECTIONS
__mips_machines_end = .;
}
+diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
+index 31e1d639abed..83784d9492b1 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -114,7 +114,7 @@
VMLINUX_SYMBOL(__setup_end) = .;
#define INIT_CALLS_LEVEL(level) \
---- a/arch/arm/kernel/vmlinux.lds.S
-+++ b/arch/arm/kernel/vmlinux.lds.S
-@@ -17,7 +17,7 @@
- #define PROC_INFO \
- . = ALIGN(4); \
- VMLINUX_SYMBOL(__proc_info_begin) = .; \
-- *(.proc.info.init) \
-+ KEEP(*(.proc.info.init)) \
- VMLINUX_SYMBOL(__proc_info_end) = .;
-
- #define HYPERVISOR_TEXT \
-@@ -28,11 +28,11 @@
- #define IDMAP_TEXT \
- ALIGN_FUNCTION(); \
- VMLINUX_SYMBOL(__idmap_text_start) = .; \
-- *(.idmap.text) \
-+ KEEP(*(.idmap.text)) \
- VMLINUX_SYMBOL(__idmap_text_end) = .; \
- . = ALIGN(PAGE_SIZE); \
- VMLINUX_SYMBOL(__hyp_idmap_text_start) = .; \
-- *(.hyp.idmap.text) \
-+ KEEP(*(.hyp.idmap.text)) \
- VMLINUX_SYMBOL(__hyp_idmap_text_end) = .;
-
- #ifdef CONFIG_HOTPLUG_CPU
-@@ -105,7 +105,7 @@ SECTIONS
- _stext = .; /* Text and read-only data */
- IDMAP_TEXT
- __exception_text_start = .;
-- *(.exception.text)
-+ KEEP(*(.exception.text))
- __exception_text_end = .;
- IRQENTRY_TEXT
- SOFTIRQENTRY_TEXT
-@@ -134,7 +134,7 @@ SECTIONS
- __ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) {
- __start___ex_table = .;
- #ifdef CONFIG_MMU
-- *(__ex_table)
-+ KEEP(*(__ex_table))
- #endif
- __stop___ex_table = .;
- }
-@@ -146,12 +146,12 @@ SECTIONS
- . = 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 = .;
- }
- #endif
-@@ -171,14 +171,14 @@ SECTIONS
- */
- __vectors_start = .;
- .vectors 0xffff0000 : AT(__vectors_start) {
-- *(.vectors)
-+ KEEP(*(.vectors))
- }
- . = __vectors_start + SIZEOF(.vectors);
- __vectors_end = .;
-
- __stubs_start = .;
- .stubs ADDR(.vectors) + 0x1000 : AT(__stubs_start) {
-- *(.stubs)
-+ KEEP(*(.stubs))
- }
- . = __stubs_start + SIZEOF(.stubs);
- __stubs_end = .;
-@@ -194,24 +194,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 = .;
- }
- .init.data : {
---- a/arch/arm/boot/compressed/Makefile
-+++ b/arch/arm/boot/compressed/Makefile
-@@ -102,6 +102,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
- ORIG_CFLAGS := $(KBUILD_CFLAGS)
- KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
- endif
-+KBUILD_CFLAGS_KERNEL := $(patsubst -f%-sections,,$(KBUILD_CFLAGS_KERNEL))
-
- # -fstack-protector-strong triggers protection checks in this code,
- # but it is being used too early to link to meaningful stack_chk logic.
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -81,6 +81,7 @@ config ARM
- select HAVE_UID16
- select HAVE_VIRT_CPU_ACCOUNTING_GEN
- select IRQ_FORCED_THREADING
-+ select LD_DEAD_CODE_DATA_ELIMINATION
- select MODULES_USE_ELF_REL
- select NO_BOOTMEM
- select OF_EARLY_FLATTREE if OF
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -55,6 +55,7 @@ config MIPS
- select CLONE_BACKWARDS
- select HAVE_DEBUG_STACKOVERFLOW
- select HAVE_CC_STACKPROTECTOR
-+ select LD_DEAD_CODE_DATA_ELIMINATION
- select CPU_PM if CPU_IDLE
- select ARCH_HAS_TICK_BROADCAST if GENERIC_CLOCKEVENTS_BROADCAST
- select ARCH_BINFMT_ELF_STATE
---- a/Makefile
-+++ b/Makefile
-@@ -409,6 +409,11 @@ KBUILD_AFLAGS_MODULE := -DMODULE
- KBUILD_CFLAGS_MODULE := -DMODULE
- KBUILD_LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds $(if $(CONFIG_PROFILING),,-s)
-
-+ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
-+KBUILD_CFLAGS_KERNEL += $(call cc-option,-ffunction-sections,)
-+KBUILD_CFLAGS_KERNEL += $(call cc-option,-fdata-sections,)
-+endif
-+
- # Read KERNELRELEASE from include/config/kernel.release (if it exists)
- KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
- KERNELVERSION = $(VERSION)$(if $(PATCHLEVEL),.$(PATCHLEVEL)$(if $(SUBLEVEL),.$(SUBLEVEL)))$(EXTRAVERSION)
-@@ -633,11 +638,6 @@ KBUILD_CFLAGS += $(call cc-disable-warni
- KBUILD_CFLAGS += $(call cc-disable-warning, format-overflow)
- KBUILD_CFLAGS += $(call cc-disable-warning, int-in-bool-context)
-
--ifdef CONFIG_LD_DEAD_CODE_DATA_ELIMINATION
--KBUILD_CFLAGS += $(call cc-option,-ffunction-sections,)
--KBUILD_CFLAGS += $(call cc-option,-fdata-sections,)
--endif
--
- ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
- KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,) $(EXTRA_OPTIMIZATION)
- else
+--
+2.11.0
+
+From b14784e7883390c20ed3ff904892255404a5914b Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:05:53 +0200
+Subject: add an optional config option for stripping all unnecessary symbol exports from the kernel image
+
+lede-commit: bb5a40c64b7c4f4848509fa0a6625055fc9e66cc
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/asm-generic/vmlinux.lds.h | 18 +++++++++++++++---
+ include/linux/export.h | 9 ++++++++-
+ scripts/Makefile.build | 2 +-
+ 3 files changed, 24 insertions(+), 5 deletions(-)
+
+diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
+index 83784d9492b1..189b5c7a0758 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -54,6 +54,16 @@
*(.discard) \
*(.discard.*) \
}
---- a/scripts/Makefile.build
-+++ b/scripts/Makefile.build
-@@ -398,7 +398,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $(
- # Linker scripts preprocessor (.lds.S -> .lds)
- # ---------------------------------------------------------------------------
- quiet_cmd_cpp_lds_S = LDS $@
-- cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \
-+ cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -C -U$(ARCH) \
- -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
-
- $(obj)/%.lds: $(src)/%.lds.S FORCE
+diff --git a/include/linux/export.h b/include/linux/export.h
+index 2a0f61fbc731..889331d9643d 100644
--- a/include/linux/export.h
+++ b/include/linux/export.h
@@ -53,12 +53,19 @@ extern struct module __this_module;
= VMLINUX_SYMBOL_STR(sym); \
static const struct kernel_symbol __ksymtab_##sym \
__used \
+diff --git a/scripts/Makefile.build b/scripts/Makefile.build
+index 108d73273788..76a0e450123c 100644
+--- a/scripts/Makefile.build
++++ b/scripts/Makefile.build
+@@ -398,7 +398,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $(always)
+ # Linker scripts preprocessor (.lds.S -> .lds)
+ # ---------------------------------------------------------------------------
+ quiet_cmd_cpp_lds_S = LDS $@
+- cmd_cpp_lds_S = $(CPP) $(cpp_flags) -P -C -U$(ARCH) \
++ cmd_cpp_lds_S = $(CPP) $(EXTRA_LDSFLAGS) $(cpp_flags) -P -C -U$(ARCH) \
+ -D__ASSEMBLY__ -DLINKER_SCRIPT -o $@ $<
+
+ $(obj)/%.lds: $(src)/%.lds.S FORCE
+--
+2.11.0
+
+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 +-
+ scripts/gen_initramfs_list.sh | 10 +++++-----
+ 3 files changed, 7 insertions(+), 6 deletions(-)
+
+diff --git a/lib/decompress.c b/lib/decompress.c
+index 62696dff5730..d91a26e1a1b2 100644
+--- a/lib/decompress.c
++++ b/lib/decompress.c
+@@ -48,6 +48,7 @@ static const struct compress_format compressed_formats[] __initconst = {
+ { {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 },
+diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
+index 0a07f9014944..5324c072c598 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
-@@ -344,7 +344,7 @@ cmd_bzip2 = (cat $(filter-out FORCE,$^)
+@@ -344,7 +344,7 @@ cmd_bzip2 = (cat $(filter-out FORCE,$^) | \
quiet_cmd_lzma = LZMA $@
cmd_lzma = (cat $(filter-out FORCE,$^) | \
(rm -f $@ ; false)
quiet_cmd_lzo = LZO $@
+diff --git a/scripts/gen_initramfs_list.sh b/scripts/gen_initramfs_list.sh
+index 0055b07b03b6..7710113e6a72 100755
--- a/scripts/gen_initramfs_list.sh
+++ b/scripts/gen_initramfs_list.sh
@@ -229,7 +229,7 @@ cpio_list=
|| (rm -f ${output_file} ; false)
fi
[ -z ${cpio_file} ] && rm ${cpio_tfile}
---- a/lib/decompress.c
-+++ b/lib/decompress.c
-@@ -48,6 +48,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 },
+--
+2.11.0
+
+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(-)
+
+diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig
+index 82af5ba64088..65fe84db77ec 100644
--- a/net/netfilter/Kconfig
+++ b/net/netfilter/Kconfig
@@ -218,7 +218,6 @@ config NF_CONNTRACK_FTP
default m if NETFILTER_ADVANCED=n
---help---
This option adds a `TCPMSS' target, which allows you to alter the
+--
+2.11.0
+
--- /dev/null
+From da3c50704f14132f4adf80d48e9a4cd5d46e54c9 Mon Sep 17 00:00:00 2001
+From: John Crispin <john@phrozen.org>
+Date: Fri, 7 Jul 2017 17:09:21 +0200
+Subject: kconfig: owrt specifc dependencies
+
+Signed-off-by: John Crispin <john@phrozen.org>
+---
+ crypto/Kconfig | 10 +++++-----
+ drivers/bcma/Kconfig | 1 +
+ drivers/ssb/Kconfig | 3 ++-
+ lib/Kconfig | 8 ++++----
+ net/netfilter/Kconfig | 2 +-
+ net/wireless/Kconfig | 17 ++++++++++-------
+ sound/core/Kconfig | 4 ++--
+ 7 files changed, 25 insertions(+), 20 deletions(-)
+
+diff --git a/crypto/Kconfig b/crypto/Kconfig
+index 84d71482bf08..e3552d1c1b84 100644
+--- a/crypto/Kconfig
++++ b/crypto/Kconfig
+@@ -32,7 +32,7 @@ config CRYPTO_FIPS
+ this is.
+
+ config CRYPTO_ALGAPI
+- tristate
++ tristate "ALGAPI"
+ select CRYPTO_ALGAPI2
+ help
+ This option provides the API for cryptographic algorithms.
+@@ -41,7 +41,7 @@ config CRYPTO_ALGAPI2
+ tristate
+
+ config CRYPTO_AEAD
+- tristate
++ tristate "AEAD"
+ select CRYPTO_AEAD2
+ select CRYPTO_ALGAPI
+
+@@ -52,7 +52,7 @@ config CRYPTO_AEAD2
+ select CRYPTO_RNG2
+
+ config CRYPTO_BLKCIPHER
+- tristate
++ tristate "BLKCIPHER"
+ select CRYPTO_BLKCIPHER2
+ select CRYPTO_ALGAPI
+
+@@ -63,7 +63,7 @@ config CRYPTO_BLKCIPHER2
+ select CRYPTO_WORKQUEUE
+
+ config CRYPTO_HASH
+- tristate
++ tristate "HASH"
+ select CRYPTO_HASH2
+ select CRYPTO_ALGAPI
+
+@@ -72,7 +72,7 @@ config CRYPTO_HASH2
+ select CRYPTO_ALGAPI2
+
+ config CRYPTO_RNG
+- tristate
++ tristate "RNG"
+ select CRYPTO_RNG2
+ select CRYPTO_ALGAPI
+
+diff --git a/drivers/bcma/Kconfig b/drivers/bcma/Kconfig
+index b5c48a8d485f..6cb52081b9ef 100644
+--- a/drivers/bcma/Kconfig
++++ b/drivers/bcma/Kconfig
+@@ -17,6 +17,7 @@ config BCMA
+ config BCMA_BLOCKIO
+ bool
+ depends on BCMA
++ default y
+
+ config BCMA_HOST_PCI_POSSIBLE
+ bool
+diff --git a/drivers/ssb/Kconfig b/drivers/ssb/Kconfig
+index d8e4219c2324..a20c168cb7c2 100644
+--- a/drivers/ssb/Kconfig
++++ b/drivers/ssb/Kconfig
+@@ -29,6 +29,7 @@ config SSB_SPROM
+ config SSB_BLOCKIO
+ bool
+ depends on SSB
++ default y
+
+ config SSB_PCIHOST_POSSIBLE
+ bool
+@@ -49,7 +50,7 @@ config SSB_PCIHOST
+ config SSB_B43_PCI_BRIDGE
+ bool
+ depends on SSB_PCIHOST
+- default n
++ default y
+
+ config SSB_PCMCIAHOST_POSSIBLE
+ bool
+diff --git a/lib/Kconfig b/lib/Kconfig
+index 260a80e313b9..d1b788fff727 100644
+--- a/lib/Kconfig
++++ b/lib/Kconfig
+@@ -334,16 +334,16 @@ config BCH_CONST_T
+ # Textsearch support is select'ed if needed
+ #
+ config TEXTSEARCH
+- bool
++ boolean "Textsearch support"
+
+ config TEXTSEARCH_KMP
+- tristate
++ tristate "Textsearch KMP"
+
+ config TEXTSEARCH_BM
+- tristate
++ tristate "Textsearch BM"
+
+ config TEXTSEARCH_FSM
+- tristate
++ tristate "Textsearch FSM"
+
+ config BTREE
+ bool
+diff --git a/net/netfilter/Kconfig b/net/netfilter/Kconfig
+index e8d56d9a4df2..0fb924661988 100644
+--- a/net/netfilter/Kconfig
++++ b/net/netfilter/Kconfig
+@@ -10,7 +10,7 @@ config NETFILTER_INGRESS
+ infrastructure.
+
+ config NETFILTER_NETLINK
+- tristate
++ tristate "Netfilter NFNETLINK interface"
+
+ config NETFILTER_NETLINK_ACCT
+ tristate "Netfilter NFACCT over NFNETLINK interface"
+diff --git a/net/wireless/Kconfig b/net/wireless/Kconfig
+index 6c606120abfe..bd299de9440c 100644
+--- a/net/wireless/Kconfig
++++ b/net/wireless/Kconfig
+@@ -1,5 +1,5 @@
+ config WIRELESS_EXT
+- bool
++ bool "Wireless extensions"
+
+ config WEXT_CORE
+ def_bool y
+@@ -11,10 +11,10 @@ config WEXT_PROC
+ depends on WEXT_CORE
+
+ config WEXT_SPY
+- bool
++ bool "WEXT_SPY"
+
+ config WEXT_PRIV
+- bool
++ bool "WEXT_PRIV"
+
+ config CFG80211
+ tristate "cfg80211 - wireless configuration API"
+@@ -188,7 +188,7 @@ config CFG80211_WEXT_EXPORT
+ wext compatibility symbols to be exported.
+
+ config LIB80211
+- tristate
++ tristate "LIB80211"
+ default n
+ help
+ This options enables a library of common routines used
+@@ -197,13 +197,16 @@ config LIB80211
+ Drivers should select this themselves if needed.
+
+ config LIB80211_CRYPT_WEP
+- tristate
++ tristate "LIB80211_CRYPT_WEP"
++ select LIB80211
+
+ config LIB80211_CRYPT_CCMP
+- tristate
++ tristate "LIB80211_CRYPT_CCMP"
++ select LIB80211
+
+ config LIB80211_CRYPT_TKIP
+- tristate
++ tristate "LIB80211_CRYPT_TKIP"
++ select LIB80211
+
+ config LIB80211_DEBUG
+ bool "lib80211 debugging messages"
+diff --git a/sound/core/Kconfig b/sound/core/Kconfig
+index 9749f9e8b45c..9639a67e7e9b 100644
+--- a/sound/core/Kconfig
++++ b/sound/core/Kconfig
+@@ -16,13 +16,13 @@ config SND_DMAENGINE_PCM
+ tristate
+
+ config SND_HWDEP
+- tristate
++ tristate "Sound hardware support"
+
+ config SND_RAWMIDI
+ tristate
+
+ config SND_COMPRESS_OFFLOAD
+- tristate
++ tristate "Compression offloading support"
+
+ config SND_JACK
+ bool
+--
+2.11.0
+
+From 811d9e2268a62b830cfe93cd8bc929afcb8b198b Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 15 Jul 2017 21:12:38 +0200
+Subject: kernel: move regmap bloat out of the kernel image if it is only being used in modules
+
+lede-commit: 96f39119815028073583e4fca3a9c5fe9141e998
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/base/regmap/Kconfig | 15 ++++++++++-----
+ drivers/base/regmap/Makefile | 12 ++++++++----
+ drivers/base/regmap/regmap.c | 3 +++
+ include/linux/regmap.h | 2 +-
+ 4 files changed, 22 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/base/regmap/Kconfig b/drivers/base/regmap/Kconfig
+index 48b3fc1ee514..c4cb7592392b 100644
--- a/drivers/base/regmap/Kconfig
+++ b/drivers/base/regmap/Kconfig
@@ -3,9 +3,8 @@
config REGMAP_IRQ
+ select REGMAP
bool
---- a/include/linux/regmap.h
-+++ b/include/linux/regmap.h
-@@ -135,7 +135,7 @@ struct reg_sequence {
- pollret ?: ((cond) ? 0 : -ETIMEDOUT); \
- })
-
--#ifdef CONFIG_REGMAP
-+#if IS_ENABLED(CONFIG_REGMAP)
-
- enum regmap_endian {
- /* Unspecified -> 0 -> Backwards compatible default */
+diff --git a/drivers/base/regmap/Makefile b/drivers/base/regmap/Makefile
+index 6271ea9b758a..f23c58a050aa 100644
--- a/drivers/base/regmap/Makefile
+++ b/drivers/base/regmap/Makefile
@@ -1,10 +1,14 @@
obj-$(CONFIG_REGMAP_AC97) += regmap-ac97.o
obj-$(CONFIG_REGMAP_I2C) += regmap-i2c.o
obj-$(CONFIG_REGMAP_SPI) += regmap-spi.o
+diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
+index ae63bb0875ea..2ac56b4f525e 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -13,6 +13,7 @@
postcore_initcall(regmap_initcall);
+
+MODULE_LICENSE("GPL");
+diff --git a/include/linux/regmap.h b/include/linux/regmap.h
+index f6673132431d..95c7db29448b 100644
+--- a/include/linux/regmap.h
++++ b/include/linux/regmap.h
+@@ -135,7 +135,7 @@ struct reg_sequence {
+ pollret ?: ((cond) ? 0 : -ETIMEDOUT); \
+ })
+
+-#ifdef CONFIG_REGMAP
++#if IS_ENABLED(CONFIG_REGMAP)
+
+ enum regmap_endian {
+ /* Unspecified -> 0 -> Backwards compatible default */
+--
+2.11.0
+
+From fd1799b0bf5efa46dd3e6dfbbf3955564807e508 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:12:51 +0200
+Subject: kernel: prevent cryptomgr from pulling in useless extra dependencies for tests that are not run
+
+Reduces kernel size after LZMA by about 5k on MIPS
+
+lede-commit: 044c316167e076479a344c59905e5b435b84a77f
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ crypto/Kconfig | 13 ++++++-------
+ crypto/algboss.c | 4 ++++
+ 2 files changed, 10 insertions(+), 7 deletions(-)
+
+diff --git a/crypto/Kconfig b/crypto/Kconfig
+index e3552d1c1b84..17be110ad162 100644
--- a/crypto/Kconfig
+++ b/crypto/Kconfig
@@ -132,12 +132,12 @@ config CRYPTO_MANAGER
help
Disable run-time self tests that normally take place at
algorithm registration.
+diff --git a/crypto/algboss.c b/crypto/algboss.c
+index 6e39d9c05b98..4bde25d62ec7 100644
--- a/crypto/algboss.c
+++ b/crypto/algboss.c
-@@ -248,12 +248,16 @@ static int cryptomgr_schedule_test(struc
+@@ -248,12 +248,16 @@ static int cryptomgr_schedule_test(struct crypto_alg *alg)
type = alg->cra_flags;
/* This piece of crap needs to disappear into per-type test hooks. */
param->type = type;
+--
+2.11.0
+
+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(-)
+
+diff --git a/include/linux/rfkill.h b/include/linux/rfkill.h
+index e6a0031d1b1f..21cf4dab0b9a 100644
+--- 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
+diff --git a/net/Makefile b/net/Makefile
+index 4cafaa2b4667..6566175e6c0a 100644
+--- a/net/Makefile
++++ b/net/Makefile
+@@ -51,7 +51,7 @@ obj-$(CONFIG_MAC80211) += mac80211/
+ obj-$(CONFIG_TIPC) += tipc/
+ obj-$(CONFIG_NETLABEL) += netlabel/
+ obj-$(CONFIG_IUCV) += iucv/
+-obj-$(CONFIG_RFKILL) += rfkill/
++obj-$(CONFIG_RFKILL_FULL) += rfkill/
+ obj-$(CONFIG_NET_9P) += 9p/
+ obj-$(CONFIG_CAIF) += caif/
+ ifneq ($(CONFIG_DCB),)
+diff --git a/net/rfkill/Kconfig b/net/rfkill/Kconfig
+index 868f1ad0415a..159b6ebeacd8 100644
--- a/net/rfkill/Kconfig
+++ b/net/rfkill/Kconfig
@@ -1,7 +1,11 @@
depends on GPIOLIB || COMPILE_TEST
default n
help
+diff --git a/net/rfkill/Makefile b/net/rfkill/Makefile
+index 311768783f4a..dbb01a8645af 100644
--- a/net/rfkill/Makefile
+++ b/net/rfkill/Makefile
@@ -4,6 +4,6 @@
+obj-$(CONFIG_RFKILL_FULL) += rfkill.o
obj-$(CONFIG_RFKILL_REGULATOR) += rfkill-regulator.o
obj-$(CONFIG_RFKILL_GPIO) += rfkill-gpio.o
---- a/net/Makefile
-+++ b/net/Makefile
-@@ -51,7 +51,7 @@ obj-$(CONFIG_MAC80211) += mac80211/
- obj-$(CONFIG_TIPC) += tipc/
- obj-$(CONFIG_NETLABEL) += netlabel/
- obj-$(CONFIG_IUCV) += iucv/
--obj-$(CONFIG_RFKILL) += rfkill/
-+obj-$(CONFIG_RFKILL_FULL) += rfkill/
- obj-$(CONFIG_NET_9P) += 9p/
- obj-$(CONFIG_CAIF) += caif/
- ifneq ($(CONFIG_DCB),)
---- 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
+--
+2.11.0
+
--- /dev/null
+From: John Crispin <john@phrozen.org>
+Subject: hack: kernel: add generic image_cmdline hack to MIPS targets
+
+lede-commit: d59f5b3a987a48508257a0ddbaeadc7909f9f976
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ arch/mips/Kconfig | 4 ++++
+ arch/mips/kernel/head.S | 6 ++++++
+ 2 files changed, 10 insertions(+)
+
+diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
+index 6a56d75f7e8b..03fbb7b46e7f 100644
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -1149,6 +1149,10 @@ config SYNC_R4K
+ config MIPS_MACHINE
+ def_bool n
+
++config IMAGE_CMDLINE_HACK
++ bool "OpenWrt specific image command line hack"
++ default n
++
+ config NO_IOPORT_MAP
+ def_bool n
+
+diff --git a/arch/mips/kernel/head.S b/arch/mips/kernel/head.S
+index cf052204eb0a..f7327fae5473 100644
+--- a/arch/mips/kernel/head.S
++++ b/arch/mips/kernel/head.S
+@@ -79,6 +79,12 @@ FEXPORT(__kernel_entry)
+ j kernel_entry
+ #endif
+
++#ifdef CONFIG_IMAGE_CMDLINE_HACK
++ .ascii "CMDLINE:"
++EXPORT(__image_cmdline)
++ .fill 0x400
++#endif /* CONFIG_IMAGE_CMDLINE_HACK */
++
+ __REF
+
+ NESTED(kernel_entry, 16, sp) # kernel entry point
+--
+2.11.0
+
--- /dev/null
+From 107c0964cb8db7ca28ac5199426414fdab3c274d Mon Sep 17 00:00:00 2001
+From: "Alexandros C. Couloumbis" <alex@ozo.com>
+Date: Fri, 7 Jul 2017 17:14:51 +0200
+Subject: hack: arch: powerpc: drop register save/restore library from modules
+
+Upstream GCC uses a libgcc function for saving/restoring registers. This
+makes the code bigger, and upstream kernels need to carry that function
+for every single kernel module. Our GCC is patched to avoid those
+references, so we can drop the extra bloat for modules.
+
+lede-commit: e8e1084654f50904e6bf77b70b2de3f137d7b3ec
+Signed-off-by: Alexandros C. Couloumbis <alex@ozo.com>
+---
+ arch/powerpc/Makefile | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
+index 617dece67924..1146daa8e4c2 100644
+--- a/arch/powerpc/Makefile
++++ b/arch/powerpc/Makefile
+@@ -179,7 +179,6 @@ else
+ CHECKFLAGS += -D__LITTLE_ENDIAN__
+ endif
+
+-KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
+
+ ifeq ($(CONFIG_476FPE_ERR46),y)
+ KBUILD_LDFLAGS_MODULE += --ppc476-workaround \
+--
+2.11.0
+
+From 3fd297761ac246c54d7723c57fca95c112b99465 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 15 Jul 2017 21:15:44 +0200
+Subject: lzma: de-bloat the lzma library used by jffs2
+
+lede-commit: 3fd1dd08fbcbb78b34efefd32c3032e5c99108d6
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/lzma/LzFind.h | 17 ---
+ include/linux/lzma/LzmaDec.h | 101 ---------------
+ include/linux/lzma/LzmaEnc.h | 20 ---
+ lib/lzma/LzFind.c | 287 ++++---------------------------------------
+ lib/lzma/LzmaDec.c | 86 +------------
+ lib/lzma/LzmaEnc.c | 172 ++------------------------
+ 6 files changed, 42 insertions(+), 641 deletions(-)
+
+diff --git a/include/linux/lzma/LzFind.h b/include/linux/lzma/LzFind.h
+index 010c4b92ba33..6d4f8e239028 100644
+--- a/include/linux/lzma/LzFind.h
++++ b/include/linux/lzma/LzFind.h
+@@ -55,11 +55,6 @@ typedef struct _CMatchFinder
+
+ #define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
+
+-int MatchFinder_NeedMove(CMatchFinder *p);
+-Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);
+-void MatchFinder_MoveBlock(CMatchFinder *p);
+-void MatchFinder_ReadIfRequired(CMatchFinder *p);
+-
+ void MatchFinder_Construct(CMatchFinder *p);
+
+ /* Conditions:
+@@ -70,12 +65,6 @@ int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
+ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
+ ISzAlloc *alloc);
+ void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);
+-void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);
+-void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
+-
+-UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
+- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
+- UInt32 *distances, UInt32 maxLen);
+
+ /*
+ Conditions:
+@@ -102,12 +91,6 @@ typedef struct _IMatchFinder
+
+ void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);
+
+-void MatchFinder_Init(CMatchFinder *p);
+-UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
+-UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
+-void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
+-void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
+-
+ #ifdef __cplusplus
+ }
+ #endif
+diff --git a/include/linux/lzma/LzmaDec.h b/include/linux/lzma/LzmaDec.h
+index bf7f084ba3dd..c90f95e9fbaf 100644
--- a/include/linux/lzma/LzmaDec.h
+++ b/include/linux/lzma/LzmaDec.h
@@ -31,14 +31,6 @@ typedef struct _CLzmaProps
/* ---------- One Call Interface ---------- */
/* LzmaDecode
---- a/lib/lzma/LzmaDec.c
-+++ b/lib/lzma/LzmaDec.c
-@@ -682,7 +682,7 @@ static void LzmaDec_InitRc(CLzmaDec *p,
- p->needFlush = 0;
- }
-
--void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
-+static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
- {
- p->needFlush = 1;
- p->remainLen = 0;
-@@ -698,7 +698,7 @@ void LzmaDec_InitDicAndState(CLzmaDec *p
- p->needInitState = 1;
- }
-
--void LzmaDec_Init(CLzmaDec *p)
-+static void LzmaDec_Init(CLzmaDec *p)
- {
- p->dicPos = 0;
- LzmaDec_InitDicAndState(p, True, True);
-@@ -716,7 +716,7 @@ static void LzmaDec_InitStateReal(CLzmaD
- p->needInitState = 0;
- }
-
--SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
-+static SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
- ELzmaFinishMode finishMode, ELzmaStatus *status)
- {
- SizeT inSize = *srcLen;
-@@ -837,65 +837,13 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, Si
- return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
- }
-
--SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
--{
-- SizeT outSize = *destLen;
-- SizeT inSize = *srcLen;
-- *srcLen = *destLen = 0;
-- for (;;)
-- {
-- SizeT inSizeCur = inSize, outSizeCur, dicPos;
-- ELzmaFinishMode curFinishMode;
-- SRes res;
-- if (p->dicPos == p->dicBufSize)
-- p->dicPos = 0;
-- dicPos = p->dicPos;
-- if (outSize > p->dicBufSize - dicPos)
-- {
-- outSizeCur = p->dicBufSize;
-- curFinishMode = LZMA_FINISH_ANY;
-- }
-- else
-- {
-- outSizeCur = dicPos + outSize;
-- curFinishMode = finishMode;
-- }
--
-- res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
-- src += inSizeCur;
-- inSize -= inSizeCur;
-- *srcLen += inSizeCur;
-- outSizeCur = p->dicPos - dicPos;
-- memcpy(dest, p->dic + dicPos, outSizeCur);
-- dest += outSizeCur;
-- outSize -= outSizeCur;
-- *destLen += outSizeCur;
-- if (res != 0)
-- return res;
-- if (outSizeCur == 0 || outSize == 0)
-- return SZ_OK;
-- }
--}
--
--void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
-+static void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
- {
- alloc->Free(alloc, p->probs);
- p->probs = 0;
- }
-
--static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
--{
-- alloc->Free(alloc, p->dic);
-- p->dic = 0;
--}
--
--void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
--{
-- LzmaDec_FreeProbs(p, alloc);
-- LzmaDec_FreeDict(p, alloc);
--}
--
--SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
-+static SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
- {
- UInt32 dicSize;
- Byte d;
-@@ -935,7 +883,7 @@ static SRes LzmaDec_AllocateProbs2(CLzma
- return SZ_OK;
- }
-
--SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
-+static SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
- {
- CLzmaProps propNew;
- RINOK(LzmaProps_Decode(&propNew, props, propsSize));
-@@ -943,28 +891,6 @@ SRes LzmaDec_AllocateProbs(CLzmaDec *p,
- p->prop = propNew;
- return SZ_OK;
- }
--
--SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
--{
-- CLzmaProps propNew;
-- SizeT dicBufSize;
-- RINOK(LzmaProps_Decode(&propNew, props, propsSize));
-- RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
-- dicBufSize = propNew.dicSize;
-- if (p->dic == 0 || dicBufSize != p->dicBufSize)
-- {
-- LzmaDec_FreeDict(p, alloc);
-- p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);
-- if (p->dic == 0)
-- {
-- LzmaDec_FreeProbs(p, alloc);
-- return SZ_ERROR_MEM;
-- }
-- }
-- p->dicBufSize = dicBufSize;
-- p->prop = propNew;
-- return SZ_OK;
--}
-
- SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
- const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
+diff --git a/include/linux/lzma/LzmaEnc.h b/include/linux/lzma/LzmaEnc.h
+index 200d60eb83cd..2986c0460be4 100644
--- a/include/linux/lzma/LzmaEnc.h
+++ b/include/linux/lzma/LzmaEnc.h
@@ -31,9 +31,6 @@ typedef struct _CLzmaEncProps
/* ---------- CLzmaEncHandle Interface ---------- */
-@@ -53,26 +50,9 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *
+@@ -53,26 +50,9 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc);
void LzmaEnc_Destroy(CLzmaEncHandle p, ISzAlloc *alloc, ISzAlloc *allocBig);
SRes LzmaEnc_SetProps(CLzmaEncHandle p, const CLzmaEncProps *props);
SRes LzmaEnc_WriteProperties(CLzmaEncHandle p, Byte *properties, SizeT *size);
#ifdef __cplusplus
}
#endif
---- a/lib/lzma/LzmaEnc.c
-+++ b/lib/lzma/LzmaEnc.c
-@@ -53,7 +53,7 @@ void LzmaEncProps_Init(CLzmaEncProps *p)
- p->writeEndMark = 0;
- }
+diff --git a/lib/lzma/LzFind.c b/lib/lzma/LzFind.c
+index e3ecb05420eb..86251ccedfda 100644
+--- a/lib/lzma/LzFind.c
++++ b/lib/lzma/LzFind.c
+@@ -14,9 +14,15 @@
--void LzmaEncProps_Normalize(CLzmaEncProps *p)
-+static void LzmaEncProps_Normalize(CLzmaEncProps *p)
+ #define kStartMaxLen 3
+
++#if 0
++#define DIRECT_INPUT p->directInput
++#else
++#define DIRECT_INPUT 1
++#endif
++
+ static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)
{
- int level = p->level;
- if (level < 0) level = 5;
-@@ -76,7 +76,7 @@ void LzmaEncProps_Normalize(CLzmaEncProp
- #endif
+- if (!p->directInput)
++ if (!DIRECT_INPUT)
+ {
+ alloc->Free(alloc, p->bufferBase);
+ p->bufferBase = 0;
+@@ -28,7 +34,7 @@ static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)
+ static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)
+ {
+ UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
+- if (p->directInput)
++ if (DIRECT_INPUT)
+ {
+ p->blockSize = blockSize;
+ return 1;
+@@ -42,12 +48,12 @@ static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *a
+ return (p->bufferBase != 0);
}
--UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
-+static UInt32 __maybe_unused LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
- {
- CLzmaEncProps props = *props2;
- LzmaEncProps_Normalize(&props);
-@@ -93,7 +93,7 @@ UInt32 LzmaEncProps_GetDictSize(const CL
+-Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
+-Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
++static Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
++static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
- #define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }
+-UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
++static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
--UInt32 GetPosSlot1(UInt32 pos)
-+static UInt32 GetPosSlot1(UInt32 pos)
+-void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
++static void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
{
- UInt32 res;
- BSR2_RET(pos, res);
-@@ -107,7 +107,7 @@ UInt32 GetPosSlot1(UInt32 pos)
- #define kNumLogBits (9 + (int)sizeof(size_t) / 2)
- #define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
+ p->posLimit -= subValue;
+ p->pos -= subValue;
+@@ -58,7 +64,7 @@ static void MatchFinder_ReadBlock(CMatchFinder *p)
+ {
+ if (p->streamEndWasReached || p->result != SZ_OK)
+ return;
+- if (p->directInput)
++ if (DIRECT_INPUT)
+ {
+ UInt32 curSize = 0xFFFFFFFF - p->streamPos;
+ if (curSize > p->directInputRem)
+@@ -89,7 +95,7 @@ static void MatchFinder_ReadBlock(CMatchFinder *p)
+ }
+ }
--void LzmaEnc_FastPosInit(Byte *g_FastPos)
-+static void LzmaEnc_FastPosInit(Byte *g_FastPos)
+-void MatchFinder_MoveBlock(CMatchFinder *p)
++static void MatchFinder_MoveBlock(CMatchFinder *p)
{
- int c = 2, slotFast;
- g_FastPos[0] = 0;
-@@ -339,58 +339,6 @@ typedef struct
- CSaveState saveState;
- } CLzmaEnc;
+ memmove(p->bufferBase,
+ p->buffer - p->keepSizeBefore,
+@@ -97,22 +103,14 @@ void MatchFinder_MoveBlock(CMatchFinder *p)
+ p->buffer = p->bufferBase + p->keepSizeBefore;
+ }
--void LzmaEnc_SaveState(CLzmaEncHandle pp)
--{
-- CLzmaEnc *p = (CLzmaEnc *)pp;
-- CSaveState *dest = &p->saveState;
-- int i;
-- dest->lenEnc = p->lenEnc;
-- dest->repLenEnc = p->repLenEnc;
-- dest->state = p->state;
--
-- for (i = 0; i < kNumStates; i++)
-- {
-- memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
-- memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
-- }
-- for (i = 0; i < kNumLenToPosStates; i++)
-- memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
-- memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
-- memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
-- memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
-- memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
-- memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
-- memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
-- memcpy(dest->reps, p->reps, sizeof(p->reps));
-- memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));
--}
--
--void LzmaEnc_RestoreState(CLzmaEncHandle pp)
+-int MatchFinder_NeedMove(CMatchFinder *p)
++static int MatchFinder_NeedMove(CMatchFinder *p)
+ {
+- if (p->directInput)
++ if (DIRECT_INPUT)
+ return 0;
+ /* if (p->streamEndWasReached) return 0; */
+ return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
+ }
+
+-void MatchFinder_ReadIfRequired(CMatchFinder *p)
-{
-- CLzmaEnc *dest = (CLzmaEnc *)pp;
-- const CSaveState *p = &dest->saveState;
-- int i;
-- dest->lenEnc = p->lenEnc;
-- dest->repLenEnc = p->repLenEnc;
-- dest->state = p->state;
--
-- for (i = 0; i < kNumStates; i++)
-- {
-- memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
-- memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
-- }
-- for (i = 0; i < kNumLenToPosStates; i++)
-- memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
-- memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
-- memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
-- memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
-- memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
-- memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
-- memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
-- memcpy(dest->reps, p->reps, sizeof(p->reps));
-- memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));
+- if (p->streamEndWasReached)
+- return;
+- if (p->keepSizeAfter >= p->streamPos - p->pos)
+- MatchFinder_ReadBlock(p);
-}
-
- SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)
+ static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)
{
- CLzmaEnc *p = (CLzmaEnc *)pp;
-@@ -600,7 +548,7 @@ static void LitEnc_EncodeMatched(CRangeE
- while (symbol < 0x10000);
+ if (MatchFinder_NeedMove(p))
+@@ -268,7 +266,7 @@ static void MatchFinder_SetLimits(CMatchFinder *p)
+ p->posLimit = p->pos + limit;
}
--void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
-+static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
+-void MatchFinder_Init(CMatchFinder *p)
++static void MatchFinder_Init(CMatchFinder *p)
{
UInt32 i;
- for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))
-@@ -1676,7 +1624,7 @@ static void FillDistancesPrices(CLzmaEnc
- p->matchPriceCount = 0;
- }
-
--void LzmaEnc_Construct(CLzmaEnc *p)
-+static void LzmaEnc_Construct(CLzmaEnc *p)
- {
- RangeEnc_Construct(&p->rc);
- MatchFinder_Construct(&p->matchFinderBase);
-@@ -1709,7 +1657,7 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *
- return p;
- }
-
--void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
-+static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
- {
- alloc->Free(alloc, p->litProbs);
- alloc->Free(alloc, p->saveState.litProbs);
-@@ -1717,7 +1665,7 @@ void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAl
- p->saveState.litProbs = 0;
- }
-
--void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
-+static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
- {
- #ifndef _7ZIP_ST
- MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);
-@@ -1947,7 +1895,7 @@ static SRes LzmaEnc_Alloc(CLzmaEnc *p, U
- return SZ_OK;
+ for (i = 0; i < p->hashSizeSum; i++)
+@@ -287,7 +285,7 @@ static UInt32 MatchFinder_GetSubValue(CMatchFinder *p)
+ return (p->pos - p->historySize - 1) & kNormalizeMask;
}
--void LzmaEnc_Init(CLzmaEnc *p)
-+static void LzmaEnc_Init(CLzmaEnc *p)
+-void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
++static void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
{
UInt32 i;
- p->state = 0;
-@@ -2005,7 +1953,7 @@ void LzmaEnc_Init(CLzmaEnc *p)
- p->lpMask = (1 << p->lp) - 1;
- }
-
--void LzmaEnc_InitPrices(CLzmaEnc *p)
-+static void LzmaEnc_InitPrices(CLzmaEnc *p)
- {
- if (!p->fastMode)
- {
-@@ -2037,26 +1985,6 @@ static SRes LzmaEnc_AllocAndInit(CLzmaEn
- return SZ_OK;
+ for (i = 0; i < numItems; i++)
+@@ -319,38 +317,7 @@ static void MatchFinder_CheckLimits(CMatchFinder *p)
+ MatchFinder_SetLimits(p);
}
--static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream,
-- ISzAlloc *alloc, ISzAlloc *allocBig)
--{
-- CLzmaEnc *p = (CLzmaEnc *)pp;
-- p->matchFinderBase.stream = inStream;
-- p->needInit = 1;
-- p->rc.outStream = outStream;
-- return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);
--}
--
--SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,
-- ISeqInStream *inStream, UInt32 keepWindowSize,
-- ISzAlloc *alloc, ISzAlloc *allocBig)
+-static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
+- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
+- UInt32 *distances, UInt32 maxLen)
-{
-- CLzmaEnc *p = (CLzmaEnc *)pp;
-- p->matchFinderBase.stream = inStream;
-- p->needInit = 1;
-- return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
+- son[_cyclicBufferPos] = curMatch;
+- for (;;)
+- {
+- UInt32 delta = pos - curMatch;
+- if (cutValue-- == 0 || delta >= _cyclicBufferSize)
+- return distances;
+- {
+- const Byte *pb = cur - delta;
+- curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
+- if (pb[maxLen] == cur[maxLen] && *pb == *cur)
+- {
+- UInt32 len = 0;
+- while (++len != lenLimit)
+- if (pb[len] != cur[len])
+- break;
+- if (maxLen < len)
+- {
+- *distances++ = maxLen = len;
+- *distances++ = delta - 1;
+- if (len == lenLimit)
+- return distances;
+- }
+- }
+- }
+- }
-}
-
- static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)
+-UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
++static UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
+ UInt32 *distances, UInt32 maxLen)
{
- p->matchFinderBase.directInput = 1;
-@@ -2064,7 +1992,7 @@ static void LzmaEnc_SetInputBuf(CLzmaEnc
- p->matchFinderBase.directInputRem = srcLen;
- }
+@@ -460,10 +427,10 @@ static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const
+ p->buffer++; \
+ if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);
--SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
-+static SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
- UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
- {
- CLzmaEnc *p = (CLzmaEnc *)pp;
-@@ -2074,7 +2002,7 @@ SRes LzmaEnc_MemPrepare(CLzmaEncHandle p
- return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
- }
+-#define MOVE_POS_RET MOVE_POS return offset;
+-
+ static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }
--void LzmaEnc_Finish(CLzmaEncHandle pp)
-+static void LzmaEnc_Finish(CLzmaEncHandle pp)
- {
- #ifndef _7ZIP_ST
- CLzmaEnc *p = (CLzmaEnc *)pp;
-@@ -2107,53 +2035,6 @@ static size_t MyWrite(void *pp, const vo
- return size;
- }
++#define MOVE_POS_RET MatchFinder_MovePos(p); return offset;
++
+ #define GET_MATCHES_HEADER2(minLen, ret_op) \
+ UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \
+ lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \
+@@ -479,62 +446,7 @@ static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }
+ distances + offset, maxLen) - distances); MOVE_POS_RET;
+ #define SKIP_FOOTER \
+- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;
-
--UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
+-static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
-- const CLzmaEnc *p = (CLzmaEnc *)pp;
-- return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
+- UInt32 offset;
+- GET_MATCHES_HEADER(2)
+- HASH2_CALC;
+- curMatch = p->hash[hashValue];
+- p->hash[hashValue] = p->pos;
+- offset = 0;
+- GET_MATCHES_FOOTER(offset, 1)
-}
-
--const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)
+-UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
-- const CLzmaEnc *p = (CLzmaEnc *)pp;
-- return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
+- UInt32 offset;
+- GET_MATCHES_HEADER(3)
+- HASH_ZIP_CALC;
+- curMatch = p->hash[hashValue];
+- p->hash[hashValue] = p->pos;
+- offset = 0;
+- GET_MATCHES_FOOTER(offset, 2)
-}
-
--SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
-- Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)
+-static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
-- CLzmaEnc *p = (CLzmaEnc *)pp;
-- UInt64 nowPos64;
-- SRes res;
-- CSeqOutStreamBuf outStream;
--
-- outStream.funcTable.Write = MyWrite;
-- outStream.data = dest;
-- outStream.rem = *destLen;
-- outStream.overflow = False;
--
-- p->writeEndMark = False;
-- p->finished = False;
-- p->result = SZ_OK;
+- UInt32 hash2Value, delta2, maxLen, offset;
+- GET_MATCHES_HEADER(3)
-
-- if (reInit)
-- LzmaEnc_Init(p);
-- LzmaEnc_InitPrices(p);
-- nowPos64 = p->nowPos64;
-- RangeEnc_Init(&p->rc);
-- p->rc.outStream = &outStream.funcTable;
+- HASH3_CALC;
-
-- res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);
+- delta2 = p->pos - p->hash[hash2Value];
+- curMatch = p->hash[kFix3HashSize + hashValue];
-
-- *unpackSize = (UInt32)(p->nowPos64 - nowPos64);
-- *destLen -= outStream.rem;
-- if (outStream.overflow)
-- return SZ_ERROR_OUTPUT_EOF;
+- p->hash[hash2Value] =
+- p->hash[kFix3HashSize + hashValue] = p->pos;
-
-- return res;
--}
-
- static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)
- {
- SRes res = SZ_OK;
-@@ -2184,13 +2065,6 @@ static SRes LzmaEnc_Encode2(CLzmaEnc *p,
- return res;
- }
-
--SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,
-- ISzAlloc *alloc, ISzAlloc *allocBig)
--{
-- RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));
-- return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);
+- maxLen = 2;
+- offset = 0;
+- if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
+- {
+- for (; maxLen != lenLimit; maxLen++)
+- if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
+- break;
+- distances[0] = maxLen;
+- distances[1] = delta2 - 1;
+- offset = 2;
+- if (maxLen == lenLimit)
+- {
+- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
+- MOVE_POS_RET;
+- }
+- }
+- GET_MATCHES_FOOTER(offset, maxLen)
-}
--
- SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)
++ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MatchFinder_MovePos(p);
+
+ static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
{
- CLzmaEnc *p = (CLzmaEnc *)pp;
-@@ -2247,25 +2121,3 @@ SRes LzmaEnc_MemEncode(CLzmaEncHandle pp
- return SZ_ERROR_OUTPUT_EOF;
- return res;
+@@ -583,108 +495,6 @@ static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+ GET_MATCHES_FOOTER(offset, maxLen)
}
+
+-static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+-{
+- UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
+- GET_MATCHES_HEADER(4)
-
--SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
-- const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
-- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
+- HASH4_CALC;
+-
+- delta2 = p->pos - p->hash[ hash2Value];
+- delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
+- curMatch = p->hash[kFix4HashSize + hashValue];
+-
+- p->hash[ hash2Value] =
+- p->hash[kFix3HashSize + hash3Value] =
+- p->hash[kFix4HashSize + hashValue] = p->pos;
+-
+- maxLen = 1;
+- offset = 0;
+- if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
+- {
+- distances[0] = maxLen = 2;
+- distances[1] = delta2 - 1;
+- offset = 2;
+- }
+- if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
+- {
+- maxLen = 3;
+- distances[offset + 1] = delta3 - 1;
+- offset += 2;
+- delta2 = delta3;
+- }
+- if (offset != 0)
+- {
+- for (; maxLen != lenLimit; maxLen++)
+- if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
+- break;
+- distances[offset - 2] = maxLen;
+- if (maxLen == lenLimit)
+- {
+- p->son[p->cyclicBufferPos] = curMatch;
+- MOVE_POS_RET;
+- }
+- }
+- if (maxLen < 3)
+- maxLen = 3;
+- offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
+- distances + offset, maxLen) - (distances));
+- MOVE_POS_RET
+-}
+-
+-UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
-{
-- CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);
-- SRes res;
-- if (p == 0)
-- return SZ_ERROR_MEM;
+- UInt32 offset;
+- GET_MATCHES_HEADER(3)
+- HASH_ZIP_CALC;
+- curMatch = p->hash[hashValue];
+- p->hash[hashValue] = p->pos;
+- offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
+- distances, 2) - (distances));
+- MOVE_POS_RET
+-}
-
-- res = LzmaEnc_SetProps(p, props);
-- if (res == SZ_OK)
+-static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-{
+- do
- {
-- res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);
-- if (res == SZ_OK)
-- res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,
-- writeEndMark, progress, alloc, allocBig);
+- SKIP_HEADER(2)
+- HASH2_CALC;
+- curMatch = p->hash[hashValue];
+- p->hash[hashValue] = p->pos;
+- SKIP_FOOTER
- }
+- while (--num != 0);
+-}
-
-- LzmaEnc_Destroy(p, alloc, allocBig);
-- return res;
+-void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-{
+- do
+- {
+- SKIP_HEADER(3)
+- HASH_ZIP_CALC;
+- curMatch = p->hash[hashValue];
+- p->hash[hashValue] = p->pos;
+- SKIP_FOOTER
+- }
+- while (--num != 0);
-}
---- a/include/linux/lzma/LzFind.h
-+++ b/include/linux/lzma/LzFind.h
-@@ -55,11 +55,6 @@ typedef struct _CMatchFinder
-
- #define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
-
--int MatchFinder_NeedMove(CMatchFinder *p);
--Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p);
--void MatchFinder_MoveBlock(CMatchFinder *p);
--void MatchFinder_ReadIfRequired(CMatchFinder *p);
-
- void MatchFinder_Construct(CMatchFinder *p);
-
- /* Conditions:
-@@ -70,12 +65,6 @@ int MatchFinder_Create(CMatchFinder *p,
- UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
- ISzAlloc *alloc);
- void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc);
--void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems);
--void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue);
+-static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-{
+- do
+- {
+- UInt32 hash2Value;
+- SKIP_HEADER(3)
+- HASH3_CALC;
+- curMatch = p->hash[kFix3HashSize + hashValue];
+- p->hash[hash2Value] =
+- p->hash[kFix3HashSize + hashValue] = p->pos;
+- SKIP_FOOTER
+- }
+- while (--num != 0);
+-}
-
--UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *buffer, CLzRef *son,
-- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 _cutValue,
-- UInt32 *distances, UInt32 maxLen);
-
- /*
- Conditions:
-@@ -102,12 +91,6 @@ typedef struct _IMatchFinder
-
- void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable);
+ static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+ {
+ do
+@@ -701,61 +511,12 @@ static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+ while (--num != 0);
+ }
--void MatchFinder_Init(CMatchFinder *p);
--UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
--UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances);
--void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
--void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num);
+-static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-{
+- do
+- {
+- UInt32 hash2Value, hash3Value;
+- SKIP_HEADER(4)
+- HASH4_CALC;
+- curMatch = p->hash[kFix4HashSize + hashValue];
+- p->hash[ hash2Value] =
+- p->hash[kFix3HashSize + hash3Value] =
+- p->hash[kFix4HashSize + hashValue] = p->pos;
+- p->son[p->cyclicBufferPos] = curMatch;
+- MOVE_POS
+- }
+- while (--num != 0);
+-}
-
- #ifdef __cplusplus
+-void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-{
+- do
+- {
+- SKIP_HEADER(3)
+- HASH_ZIP_CALC;
+- curMatch = p->hash[hashValue];
+- p->hash[hashValue] = p->pos;
+- p->son[p->cyclicBufferPos] = curMatch;
+- MOVE_POS
+- }
+- while (--num != 0);
+-}
+-
+ void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)
+ {
+ vTable->Init = (Mf_Init_Func)MatchFinder_Init;
+ vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;
+ vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;
+ vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;
+- if (!p->btMode)
+- {
+- vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;
+- vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;
+- }
+- else if (p->numHashBytes == 2)
+- {
+- vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;
+- vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;
+- }
+- else if (p->numHashBytes == 3)
+- {
+- vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;
+- vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;
+- }
+- else
+- {
+- vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
+- vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
+- }
++ vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
++ vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
+ }
+diff --git a/lib/lzma/LzmaDec.c b/lib/lzma/LzmaDec.c
+index 2036761bf146..7666e3f82067 100644
+--- a/lib/lzma/LzmaDec.c
++++ b/lib/lzma/LzmaDec.c
+@@ -682,7 +682,7 @@ static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
+ p->needFlush = 0;
}
- #endif
---- a/lib/lzma/LzFind.c
-+++ b/lib/lzma/LzFind.c
-@@ -14,9 +14,15 @@
-
- #define kStartMaxLen 3
-+#if 0
-+#define DIRECT_INPUT p->directInput
-+#else
-+#define DIRECT_INPUT 1
-+#endif
-+
- static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)
+-void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
++static void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
{
-- if (!p->directInput)
-+ if (!DIRECT_INPUT)
- {
- alloc->Free(alloc, p->bufferBase);
- p->bufferBase = 0;
-@@ -28,7 +34,7 @@ static void LzInWindow_Free(CMatchFinder
- static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)
+ p->needFlush = 1;
+ p->remainLen = 0;
+@@ -698,7 +698,7 @@ void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
+ p->needInitState = 1;
+ }
+
+-void LzmaDec_Init(CLzmaDec *p)
++static void LzmaDec_Init(CLzmaDec *p)
{
- UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
-- if (p->directInput)
-+ if (DIRECT_INPUT)
- {
- p->blockSize = blockSize;
- return 1;
-@@ -42,12 +48,12 @@ static int LzInWindow_Create(CMatchFinde
- return (p->bufferBase != 0);
+ p->dicPos = 0;
+ LzmaDec_InitDicAndState(p, True, True);
+@@ -716,7 +716,7 @@ static void LzmaDec_InitStateReal(CLzmaDec *p)
+ p->needInitState = 0;
}
--Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
--Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
-+static Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
-+static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 index) { return p->buffer[index]; }
+-SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
++static SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
+ ELzmaFinishMode finishMode, ELzmaStatus *status)
+ {
+ SizeT inSize = *srcLen;
+@@ -837,65 +837,13 @@ SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *sr
+ return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
+ }
--UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
-+static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
+-SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
+-{
+- SizeT outSize = *destLen;
+- SizeT inSize = *srcLen;
+- *srcLen = *destLen = 0;
+- for (;;)
+- {
+- SizeT inSizeCur = inSize, outSizeCur, dicPos;
+- ELzmaFinishMode curFinishMode;
+- SRes res;
+- if (p->dicPos == p->dicBufSize)
+- p->dicPos = 0;
+- dicPos = p->dicPos;
+- if (outSize > p->dicBufSize - dicPos)
+- {
+- outSizeCur = p->dicBufSize;
+- curFinishMode = LZMA_FINISH_ANY;
+- }
+- else
+- {
+- outSizeCur = dicPos + outSize;
+- curFinishMode = finishMode;
+- }
+-
+- res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
+- src += inSizeCur;
+- inSize -= inSizeCur;
+- *srcLen += inSizeCur;
+- outSizeCur = p->dicPos - dicPos;
+- memcpy(dest, p->dic + dicPos, outSizeCur);
+- dest += outSizeCur;
+- outSize -= outSizeCur;
+- *destLen += outSizeCur;
+- if (res != 0)
+- return res;
+- if (outSizeCur == 0 || outSize == 0)
+- return SZ_OK;
+- }
+-}
+-
+-void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
++static void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
+ {
+ alloc->Free(alloc, p->probs);
+ p->probs = 0;
+ }
--void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
-+static void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
+-static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
+-{
+- alloc->Free(alloc, p->dic);
+- p->dic = 0;
+-}
+-
+-void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
+-{
+- LzmaDec_FreeProbs(p, alloc);
+- LzmaDec_FreeDict(p, alloc);
+-}
+-
+-SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
++static SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
{
- p->posLimit -= subValue;
- p->pos -= subValue;
-@@ -58,7 +64,7 @@ static void MatchFinder_ReadBlock(CMatch
+ UInt32 dicSize;
+ Byte d;
+@@ -935,33 +883,11 @@ static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAl
+ return SZ_OK;
+ }
+
+-SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
+-{
+- CLzmaProps propNew;
+- RINOK(LzmaProps_Decode(&propNew, props, propsSize));
+- RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
+- p->prop = propNew;
+- return SZ_OK;
+-}
+-
+-SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
++static SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
{
- if (p->streamEndWasReached || p->result != SZ_OK)
- return;
-- if (p->directInput)
-+ if (DIRECT_INPUT)
- {
- UInt32 curSize = 0xFFFFFFFF - p->streamPos;
- if (curSize > p->directInputRem)
-@@ -89,7 +95,7 @@ static void MatchFinder_ReadBlock(CMatch
- }
+ CLzmaProps propNew;
+- SizeT dicBufSize;
+ RINOK(LzmaProps_Decode(&propNew, props, propsSize));
+ RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
+- dicBufSize = propNew.dicSize;
+- if (p->dic == 0 || dicBufSize != p->dicBufSize)
+- {
+- LzmaDec_FreeDict(p, alloc);
+- p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);
+- if (p->dic == 0)
+- {
+- LzmaDec_FreeProbs(p, alloc);
+- return SZ_ERROR_MEM;
+- }
+- }
+- p->dicBufSize = dicBufSize;
+ p->prop = propNew;
+ return SZ_OK;
+ }
+diff --git a/lib/lzma/LzmaEnc.c b/lib/lzma/LzmaEnc.c
+index 6dadf00dfab2..943965647bad 100644
+--- a/lib/lzma/LzmaEnc.c
++++ b/lib/lzma/LzmaEnc.c
+@@ -53,7 +53,7 @@ void LzmaEncProps_Init(CLzmaEncProps *p)
+ p->writeEndMark = 0;
}
--void MatchFinder_MoveBlock(CMatchFinder *p)
-+static void MatchFinder_MoveBlock(CMatchFinder *p)
+-void LzmaEncProps_Normalize(CLzmaEncProps *p)
++static void LzmaEncProps_Normalize(CLzmaEncProps *p)
{
- memmove(p->bufferBase,
- p->buffer - p->keepSizeBefore,
-@@ -97,22 +103,14 @@ void MatchFinder_MoveBlock(CMatchFinder
- p->buffer = p->bufferBase + p->keepSizeBefore;
+ int level = p->level;
+ if (level < 0) level = 5;
+@@ -76,7 +76,7 @@ void LzmaEncProps_Normalize(CLzmaEncProps *p)
+ #endif
}
--int MatchFinder_NeedMove(CMatchFinder *p)
-+static int MatchFinder_NeedMove(CMatchFinder *p)
+-UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
++static UInt32 __maybe_unused LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
{
-- if (p->directInput)
-+ if (DIRECT_INPUT)
- return 0;
- /* if (p->streamEndWasReached) return 0; */
- return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
- }
+ CLzmaEncProps props = *props2;
+ LzmaEncProps_Normalize(&props);
+@@ -93,7 +93,7 @@ UInt32 LzmaEncProps_GetDictSize(const CLzmaEncProps *props2)
--void MatchFinder_ReadIfRequired(CMatchFinder *p)
+ #define BSR2_RET(pos, res) { unsigned long i; _BitScanReverse(&i, (pos)); res = (i + i) + ((pos >> (i - 1)) & 1); }
+
+-UInt32 GetPosSlot1(UInt32 pos)
++static UInt32 GetPosSlot1(UInt32 pos)
+ {
+ UInt32 res;
+ BSR2_RET(pos, res);
+@@ -107,7 +107,7 @@ UInt32 GetPosSlot1(UInt32 pos)
+ #define kNumLogBits (9 + (int)sizeof(size_t) / 2)
+ #define kDicLogSizeMaxCompress ((kNumLogBits - 1) * 2 + 7)
+
+-void LzmaEnc_FastPosInit(Byte *g_FastPos)
++static void LzmaEnc_FastPosInit(Byte *g_FastPos)
+ {
+ int c = 2, slotFast;
+ g_FastPos[0] = 0;
+@@ -339,58 +339,6 @@ typedef struct
+ CSaveState saveState;
+ } CLzmaEnc;
+
+-void LzmaEnc_SaveState(CLzmaEncHandle pp)
-{
-- if (p->streamEndWasReached)
-- return;
-- if (p->keepSizeAfter >= p->streamPos - p->pos)
-- MatchFinder_ReadBlock(p);
+- CLzmaEnc *p = (CLzmaEnc *)pp;
+- CSaveState *dest = &p->saveState;
+- int i;
+- dest->lenEnc = p->lenEnc;
+- dest->repLenEnc = p->repLenEnc;
+- dest->state = p->state;
+-
+- for (i = 0; i < kNumStates; i++)
+- {
+- memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
+- memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
+- }
+- for (i = 0; i < kNumLenToPosStates; i++)
+- memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
+- memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
+- memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
+- memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
+- memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
+- memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
+- memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
+- memcpy(dest->reps, p->reps, sizeof(p->reps));
+- memcpy(dest->litProbs, p->litProbs, (0x300 << p->lclp) * sizeof(CLzmaProb));
-}
-
- static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)
+-void LzmaEnc_RestoreState(CLzmaEncHandle pp)
+-{
+- CLzmaEnc *dest = (CLzmaEnc *)pp;
+- const CSaveState *p = &dest->saveState;
+- int i;
+- dest->lenEnc = p->lenEnc;
+- dest->repLenEnc = p->repLenEnc;
+- dest->state = p->state;
+-
+- for (i = 0; i < kNumStates; i++)
+- {
+- memcpy(dest->isMatch[i], p->isMatch[i], sizeof(p->isMatch[i]));
+- memcpy(dest->isRep0Long[i], p->isRep0Long[i], sizeof(p->isRep0Long[i]));
+- }
+- for (i = 0; i < kNumLenToPosStates; i++)
+- memcpy(dest->posSlotEncoder[i], p->posSlotEncoder[i], sizeof(p->posSlotEncoder[i]));
+- memcpy(dest->isRep, p->isRep, sizeof(p->isRep));
+- memcpy(dest->isRepG0, p->isRepG0, sizeof(p->isRepG0));
+- memcpy(dest->isRepG1, p->isRepG1, sizeof(p->isRepG1));
+- memcpy(dest->isRepG2, p->isRepG2, sizeof(p->isRepG2));
+- memcpy(dest->posEncoders, p->posEncoders, sizeof(p->posEncoders));
+- memcpy(dest->posAlignEncoder, p->posAlignEncoder, sizeof(p->posAlignEncoder));
+- memcpy(dest->reps, p->reps, sizeof(p->reps));
+- memcpy(dest->litProbs, p->litProbs, (0x300 << dest->lclp) * sizeof(CLzmaProb));
+-}
+-
+ SRes LzmaEnc_SetProps(CLzmaEncHandle pp, const CLzmaEncProps *props2)
{
- if (MatchFinder_NeedMove(p))
-@@ -268,7 +266,7 @@ static void MatchFinder_SetLimits(CMatch
- p->posLimit = p->pos + limit;
+ CLzmaEnc *p = (CLzmaEnc *)pp;
+@@ -600,7 +548,7 @@ static void LitEnc_EncodeMatched(CRangeEnc *p, CLzmaProb *probs, UInt32 symbol,
+ while (symbol < 0x10000);
}
--void MatchFinder_Init(CMatchFinder *p)
-+static void MatchFinder_Init(CMatchFinder *p)
+-void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
++static void LzmaEnc_InitPriceTables(UInt32 *ProbPrices)
{
UInt32 i;
- for (i = 0; i < p->hashSizeSum; i++)
-@@ -287,7 +285,7 @@ static UInt32 MatchFinder_GetSubValue(CM
- return (p->pos - p->historySize - 1) & kNormalizeMask;
+ for (i = (1 << kNumMoveReducingBits) / 2; i < kBitModelTotal; i += (1 << kNumMoveReducingBits))
+@@ -1676,7 +1624,7 @@ static void FillDistancesPrices(CLzmaEnc *p)
+ p->matchPriceCount = 0;
}
--void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
-+static void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
+-void LzmaEnc_Construct(CLzmaEnc *p)
++static void LzmaEnc_Construct(CLzmaEnc *p)
{
- UInt32 i;
- for (i = 0; i < numItems; i++)
-@@ -319,38 +317,7 @@ static void MatchFinder_CheckLimits(CMat
- MatchFinder_SetLimits(p);
+ RangeEnc_Construct(&p->rc);
+ MatchFinder_Construct(&p->matchFinderBase);
+@@ -1709,7 +1657,7 @@ CLzmaEncHandle LzmaEnc_Create(ISzAlloc *alloc)
+ return p;
}
--static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
-- UInt32 *distances, UInt32 maxLen)
--{
-- son[_cyclicBufferPos] = curMatch;
-- for (;;)
-- {
-- UInt32 delta = pos - curMatch;
-- if (cutValue-- == 0 || delta >= _cyclicBufferSize)
-- return distances;
-- {
-- const Byte *pb = cur - delta;
-- curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
-- if (pb[maxLen] == cur[maxLen] && *pb == *cur)
-- {
-- UInt32 len = 0;
-- while (++len != lenLimit)
-- if (pb[len] != cur[len])
-- break;
-- if (maxLen < len)
-- {
-- *distances++ = maxLen = len;
-- *distances++ = delta - 1;
-- if (len == lenLimit)
-- return distances;
-- }
-- }
-- }
-- }
--}
--
--UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
-+static UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
- UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
- UInt32 *distances, UInt32 maxLen)
+-void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
++static void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
{
-@@ -460,10 +427,10 @@ static void SkipMatchesSpec(UInt32 lenLi
- p->buffer++; \
- if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);
-
--#define MOVE_POS_RET MOVE_POS return offset;
--
- static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }
+ alloc->Free(alloc, p->litProbs);
+ alloc->Free(alloc, p->saveState.litProbs);
+@@ -1717,7 +1665,7 @@ void LzmaEnc_FreeLits(CLzmaEnc *p, ISzAlloc *alloc)
+ p->saveState.litProbs = 0;
+ }
-+#define MOVE_POS_RET MatchFinder_MovePos(p); return offset;
-+
- #define GET_MATCHES_HEADER2(minLen, ret_op) \
- UInt32 lenLimit; UInt32 hashValue; const Byte *cur; UInt32 curMatch; \
- lenLimit = p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \
-@@ -479,62 +446,7 @@ static void MatchFinder_MovePos(CMatchFi
- distances + offset, maxLen) - distances); MOVE_POS_RET;
+-void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
++static void LzmaEnc_Destruct(CLzmaEnc *p, ISzAlloc *alloc, ISzAlloc *allocBig)
+ {
+ #ifndef _7ZIP_ST
+ MatchFinderMt_Destruct(&p->matchFinderMt, allocBig);
+@@ -1947,7 +1895,7 @@ static SRes LzmaEnc_Alloc(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *alloc, I
+ return SZ_OK;
+ }
- #define SKIP_FOOTER \
-- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;
--
--static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
--{
-- UInt32 offset;
-- GET_MATCHES_HEADER(2)
-- HASH2_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- offset = 0;
-- GET_MATCHES_FOOTER(offset, 1)
--}
--
--UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
--{
-- UInt32 offset;
-- GET_MATCHES_HEADER(3)
-- HASH_ZIP_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- offset = 0;
-- GET_MATCHES_FOOTER(offset, 2)
--}
--
--static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
--{
-- UInt32 hash2Value, delta2, maxLen, offset;
-- GET_MATCHES_HEADER(3)
--
-- HASH3_CALC;
--
-- delta2 = p->pos - p->hash[hash2Value];
-- curMatch = p->hash[kFix3HashSize + hashValue];
--
-- p->hash[hash2Value] =
-- p->hash[kFix3HashSize + hashValue] = p->pos;
--
--
-- maxLen = 2;
-- offset = 0;
-- if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
-- {
-- for (; maxLen != lenLimit; maxLen++)
-- if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
-- break;
-- distances[0] = maxLen;
-- distances[1] = delta2 - 1;
-- offset = 2;
-- if (maxLen == lenLimit)
-- {
-- SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
-- MOVE_POS_RET;
-- }
-- }
-- GET_MATCHES_FOOTER(offset, maxLen)
--}
-+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p)); MatchFinder_MovePos(p);
+-void LzmaEnc_Init(CLzmaEnc *p)
++static void LzmaEnc_Init(CLzmaEnc *p)
+ {
+ UInt32 i;
+ p->state = 0;
+@@ -2005,7 +1953,7 @@ void LzmaEnc_Init(CLzmaEnc *p)
+ p->lpMask = (1 << p->lp) - 1;
+ }
- static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+-void LzmaEnc_InitPrices(CLzmaEnc *p)
++static void LzmaEnc_InitPrices(CLzmaEnc *p)
{
-@@ -583,108 +495,6 @@ static UInt32 Bt4_MatchFinder_GetMatches
- GET_MATCHES_FOOTER(offset, maxLen)
+ if (!p->fastMode)
+ {
+@@ -2037,26 +1985,6 @@ static SRes LzmaEnc_AllocAndInit(CLzmaEnc *p, UInt32 keepWindowSize, ISzAlloc *a
+ return SZ_OK;
}
--static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+-static SRes LzmaEnc_Prepare(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream,
+- ISzAlloc *alloc, ISzAlloc *allocBig)
-{
-- UInt32 hash2Value, hash3Value, delta2, delta3, maxLen, offset;
-- GET_MATCHES_HEADER(4)
--
-- HASH4_CALC;
--
-- delta2 = p->pos - p->hash[ hash2Value];
-- delta3 = p->pos - p->hash[kFix3HashSize + hash3Value];
-- curMatch = p->hash[kFix4HashSize + hashValue];
--
-- p->hash[ hash2Value] =
-- p->hash[kFix3HashSize + hash3Value] =
-- p->hash[kFix4HashSize + hashValue] = p->pos;
--
-- maxLen = 1;
-- offset = 0;
-- if (delta2 < p->cyclicBufferSize && *(cur - delta2) == *cur)
-- {
-- distances[0] = maxLen = 2;
-- distances[1] = delta2 - 1;
-- offset = 2;
-- }
-- if (delta2 != delta3 && delta3 < p->cyclicBufferSize && *(cur - delta3) == *cur)
-- {
-- maxLen = 3;
-- distances[offset + 1] = delta3 - 1;
-- offset += 2;
-- delta2 = delta3;
-- }
-- if (offset != 0)
-- {
-- for (; maxLen != lenLimit; maxLen++)
-- if (cur[(ptrdiff_t)maxLen - delta2] != cur[maxLen])
-- break;
-- distances[offset - 2] = maxLen;
-- if (maxLen == lenLimit)
-- {
-- p->son[p->cyclicBufferPos] = curMatch;
-- MOVE_POS_RET;
-- }
-- }
-- if (maxLen < 3)
-- maxLen = 3;
-- offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
-- distances + offset, maxLen) - (distances));
-- MOVE_POS_RET
+- CLzmaEnc *p = (CLzmaEnc *)pp;
+- p->matchFinderBase.stream = inStream;
+- p->needInit = 1;
+- p->rc.outStream = outStream;
+- return LzmaEnc_AllocAndInit(p, 0, alloc, allocBig);
-}
-
--UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
+-SRes LzmaEnc_PrepareForLzma2(CLzmaEncHandle pp,
+- ISeqInStream *inStream, UInt32 keepWindowSize,
+- ISzAlloc *alloc, ISzAlloc *allocBig)
-{
-- UInt32 offset;
-- GET_MATCHES_HEADER(3)
-- HASH_ZIP_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
-- distances, 2) - (distances));
-- MOVE_POS_RET
+- CLzmaEnc *p = (CLzmaEnc *)pp;
+- p->matchFinderBase.stream = inStream;
+- p->needInit = 1;
+- return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
-}
-
--static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+ static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)
+ {
+ p->matchFinderBase.directInput = 1;
+@@ -2064,7 +1992,7 @@ static void LzmaEnc_SetInputBuf(CLzmaEnc *p, const Byte *src, SizeT srcLen)
+ p->matchFinderBase.directInputRem = srcLen;
+ }
+
+-SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
++static SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
+ UInt32 keepWindowSize, ISzAlloc *alloc, ISzAlloc *allocBig)
+ {
+ CLzmaEnc *p = (CLzmaEnc *)pp;
+@@ -2074,7 +2002,7 @@ SRes LzmaEnc_MemPrepare(CLzmaEncHandle pp, const Byte *src, SizeT srcLen,
+ return LzmaEnc_AllocAndInit(p, keepWindowSize, alloc, allocBig);
+ }
+
+-void LzmaEnc_Finish(CLzmaEncHandle pp)
++static void LzmaEnc_Finish(CLzmaEncHandle pp)
+ {
+ #ifndef _7ZIP_ST
+ CLzmaEnc *p = (CLzmaEnc *)pp;
+@@ -2107,53 +2035,6 @@ static size_t MyWrite(void *pp, const void *data, size_t size)
+ return size;
+ }
+
+-
+-UInt32 LzmaEnc_GetNumAvailableBytes(CLzmaEncHandle pp)
-{
-- do
-- {
-- SKIP_HEADER(2)
-- HASH2_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- SKIP_FOOTER
-- }
-- while (--num != 0);
+- const CLzmaEnc *p = (CLzmaEnc *)pp;
+- return p->matchFinder.GetNumAvailableBytes(p->matchFinderObj);
-}
-
--void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-const Byte *LzmaEnc_GetCurBuf(CLzmaEncHandle pp)
-{
-- do
-- {
-- SKIP_HEADER(3)
-- HASH_ZIP_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- SKIP_FOOTER
-- }
-- while (--num != 0);
+- const CLzmaEnc *p = (CLzmaEnc *)pp;
+- return p->matchFinder.GetPointerToCurrentPos(p->matchFinderObj) - p->additionalOffset;
-}
-
--static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-SRes LzmaEnc_CodeOneMemBlock(CLzmaEncHandle pp, Bool reInit,
+- Byte *dest, size_t *destLen, UInt32 desiredPackSize, UInt32 *unpackSize)
-{
-- do
-- {
-- UInt32 hash2Value;
-- SKIP_HEADER(3)
-- HASH3_CALC;
-- curMatch = p->hash[kFix3HashSize + hashValue];
-- p->hash[hash2Value] =
-- p->hash[kFix3HashSize + hashValue] = p->pos;
-- SKIP_FOOTER
-- }
-- while (--num != 0);
+- CLzmaEnc *p = (CLzmaEnc *)pp;
+- UInt64 nowPos64;
+- SRes res;
+- CSeqOutStreamBuf outStream;
+-
+- outStream.funcTable.Write = MyWrite;
+- outStream.data = dest;
+- outStream.rem = *destLen;
+- outStream.overflow = False;
+-
+- p->writeEndMark = False;
+- p->finished = False;
+- p->result = SZ_OK;
+-
+- if (reInit)
+- LzmaEnc_Init(p);
+- LzmaEnc_InitPrices(p);
+- nowPos64 = p->nowPos64;
+- RangeEnc_Init(&p->rc);
+- p->rc.outStream = &outStream.funcTable;
+-
+- res = LzmaEnc_CodeOneBlock(p, True, desiredPackSize, *unpackSize);
+-
+- *unpackSize = (UInt32)(p->nowPos64 - nowPos64);
+- *destLen -= outStream.rem;
+- if (outStream.overflow)
+- return SZ_ERROR_OUTPUT_EOF;
+-
+- return res;
-}
-
- static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+ static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)
{
- do
-@@ -701,61 +511,12 @@ static void Bt4_MatchFinder_Skip(CMatchF
- while (--num != 0);
+ SRes res = SZ_OK;
+@@ -2184,13 +2065,6 @@ static SRes LzmaEnc_Encode2(CLzmaEnc *p, ICompressProgress *progress)
+ return res;
}
--static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+-SRes LzmaEnc_Encode(CLzmaEncHandle pp, ISeqOutStream *outStream, ISeqInStream *inStream, ICompressProgress *progress,
+- ISzAlloc *alloc, ISzAlloc *allocBig)
-{
-- do
-- {
-- UInt32 hash2Value, hash3Value;
-- SKIP_HEADER(4)
-- HASH4_CALC;
-- curMatch = p->hash[kFix4HashSize + hashValue];
-- p->hash[ hash2Value] =
-- p->hash[kFix3HashSize + hash3Value] =
-- p->hash[kFix4HashSize + hashValue] = p->pos;
-- p->son[p->cyclicBufferPos] = curMatch;
-- MOVE_POS
-- }
-- while (--num != 0);
+- RINOK(LzmaEnc_Prepare(pp, outStream, inStream, alloc, allocBig));
+- return LzmaEnc_Encode2((CLzmaEnc *)pp, progress);
-}
-
--void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
+ SRes LzmaEnc_WriteProperties(CLzmaEncHandle pp, Byte *props, SizeT *size)
+ {
+ CLzmaEnc *p = (CLzmaEnc *)pp;
+@@ -2247,25 +2121,3 @@ SRes LzmaEnc_MemEncode(CLzmaEncHandle pp, Byte *dest, SizeT *destLen, const Byte
+ return SZ_ERROR_OUTPUT_EOF;
+ return res;
+ }
+-
+-SRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
+- const CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
+- ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig)
-{
-- do
-- {
-- SKIP_HEADER(3)
-- HASH_ZIP_CALC;
-- curMatch = p->hash[hashValue];
-- p->hash[hashValue] = p->pos;
-- p->son[p->cyclicBufferPos] = curMatch;
-- MOVE_POS
-- }
-- while (--num != 0);
--}
+- CLzmaEnc *p = (CLzmaEnc *)LzmaEnc_Create(alloc);
+- SRes res;
+- if (p == 0)
+- return SZ_ERROR_MEM;
-
- void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)
- {
- vTable->Init = (Mf_Init_Func)MatchFinder_Init;
- vTable->GetIndexByte = (Mf_GetIndexByte_Func)MatchFinder_GetIndexByte;
- vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;
- vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;
-- if (!p->btMode)
-- {
-- vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;
-- vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;
-- }
-- else if (p->numHashBytes == 2)
-- {
-- vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;
-- vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;
-- }
-- else if (p->numHashBytes == 3)
-- {
-- vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;
-- vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;
-- }
-- else
+- res = LzmaEnc_SetProps(p, props);
+- if (res == SZ_OK)
- {
-- vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
-- vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
+- res = LzmaEnc_WriteProperties(p, propsEncoded, propsSize);
+- if (res == SZ_OK)
+- res = LzmaEnc_MemEncode(p, dest, destLen, src, srcLen,
+- writeEndMark, progress, alloc, allocBig);
- }
-+ vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
-+ vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
- }
+-
+- LzmaEnc_Destroy(p, alloc, allocBig);
+- return res;
+-}
+--
+2.11.0
+
+From c6905cfdeb31a5c049db3da434b10fa0d3e83569 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@nbd.name>
-Subject: [PATCH] bridge: only accept EAP locally
+Date: Fri, 7 Jul 2017 17:18:54 +0200
+Subject: bridge: only accept EAP locally
When bridging, do not forward EAP frames to other ports, only deliver
them locally, regardless of the state.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
+ net/bridge/br_input.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/net/bridge/br_input.c b/net/bridge/br_input.c
+index 267b46af407f..48fa08f32c2a 100644
--- a/net/bridge/br_input.c
+++ b/net/bridge/br_input.c
-@@ -164,11 +164,14 @@ int br_handle_frame_finish(struct net *n
+@@ -164,11 +164,14 @@ int br_handle_frame_finish(struct net *net, struct sock *sk, struct sk_buff *skb
}
}
if (IS_ENABLED(CONFIG_INET) && skb->protocol == htons(ETH_P_ARP))
br_do_proxy_arp(skb, br, vid, p);
+--
+2.11.0
+
+From e988390850731aa1697ed09d47b0932fac1af175 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@nbd.name>
-Subject: [PATCH] bridge: port isolate
+Date: Fri, 7 Jul 2017 17:20:03 +0200
+Subject: bridge: port isolate
Isolating individual bridge ports
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
---- a/include/linux/if_bridge.h
-+++ b/include/linux/if_bridge.h
+ include/linux/if_bridge.h | 1 +
+ net/bridge/br_forward.c | 5 +++++
+ net/bridge/br_input.c | 3 +++
+ net/bridge/br_sysfs_if.c | 2 ++
+ 4 files changed, 11 insertions(+)
+
+Index: linux-4.9.34/include/linux/if_bridge.h
+===================================================================
+--- linux-4.9.34.orig/include/linux/if_bridge.h
++++ linux-4.9.34/include/linux/if_bridge.h
@@ -47,6 +47,7 @@ struct br_ip_list {
#define BR_PROXYARP_WIFI BIT(10)
#define BR_MCAST_FLOOD BIT(11)
#define BR_DEFAULT_AGEING_TIME (300 * HZ)
---- a/net/bridge/br_sysfs_if.c
-+++ b/net/bridge/br_sysfs_if.c
-@@ -172,6 +172,7 @@ BRPORT_ATTR_FLAG(unicast_flood, BR_FLOOD
- BRPORT_ATTR_FLAG(proxyarp, BR_PROXYARP);
- BRPORT_ATTR_FLAG(proxyarp_wifi, BR_PROXYARP_WIFI);
- BRPORT_ATTR_FLAG(multicast_flood, BR_MCAST_FLOOD);
-+BRPORT_ATTR_FLAG(isolate_mode, BR_ISOLATE_MODE);
-
- #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
- static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf)
-@@ -220,6 +221,7 @@ static const struct brport_attribute *br
- &brport_attr_proxyarp,
- &brport_attr_proxyarp_wifi,
- &brport_attr_multicast_flood,
-+ &brport_attr_isolate_mode,
- NULL
- };
-
---- a/net/bridge/br_forward.c
-+++ b/net/bridge/br_forward.c
+Index: linux-4.9.34/net/bridge/br_forward.c
+===================================================================
+--- linux-4.9.34.orig/net/bridge/br_forward.c
++++ linux-4.9.34/net/bridge/br_forward.c
@@ -141,6 +141,9 @@ static int deliver_clone(const struct ne
void br_forward(const struct net_bridge_port *to,
struct sk_buff *skb, bool local_rcv, bool local_orig)
/* Do not flood unicast traffic to ports that turn it off */
if (pkt_type == BR_PKT_UNICAST && !(p->flags & BR_FLOOD))
continue;
---- a/net/bridge/br_input.c
-+++ b/net/bridge/br_input.c
+Index: linux-4.9.34/net/bridge/br_input.c
+===================================================================
+--- linux-4.9.34.orig/net/bridge/br_input.c
++++ linux-4.9.34/net/bridge/br_input.c
@@ -175,6 +175,9 @@ int br_handle_frame_finish(struct net *n
if (IS_ENABLED(CONFIG_INET) && skb->protocol == htons(ETH_P_ARP))
br_do_proxy_arp(skb, br, vid, p);
switch (pkt_type) {
case BR_PKT_MULTICAST:
mdst = br_mdb_get(br, skb, vid);
+Index: linux-4.9.34/net/bridge/br_sysfs_if.c
+===================================================================
+--- linux-4.9.34.orig/net/bridge/br_sysfs_if.c
++++ linux-4.9.34/net/bridge/br_sysfs_if.c
+@@ -172,6 +172,7 @@ BRPORT_ATTR_FLAG(unicast_flood, BR_FLOOD
+ BRPORT_ATTR_FLAG(proxyarp, BR_PROXYARP);
+ BRPORT_ATTR_FLAG(proxyarp_wifi, BR_PROXYARP_WIFI);
+ BRPORT_ATTR_FLAG(multicast_flood, BR_MCAST_FLOOD);
++BRPORT_ATTR_FLAG(isolate_mode, BR_ISOLATE_MODE);
+
+ #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
+ static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf)
+@@ -220,6 +221,7 @@ static const struct brport_attribute *br
+ &brport_attr_proxyarp,
+ &brport_attr_proxyarp_wifi,
+ &brport_attr_multicast_flood,
++ &brport_attr_isolate_mode,
+ NULL
+ };
+
--- /dev/null
+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(-)
+
+diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
+index 780e7171f548..6e0f2c79f79a 100644
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -137,8 +137,8 @@ static inline bool dev_xmit_complete(int rc)
+
+ #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
+--
+2.11.0
+
--- /dev/null
+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
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/sched/sch_fq_codel.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c
+index a5ea0e9b6be4..4467b95795bf 100644
+--- a/net/sched/sch_fq_codel.c
++++ b/net/sched/sch_fq_codel.c
+@@ -479,7 +479,7 @@ static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt)
+
+ sch->limit = 10*1024;
+ q->flows_cnt = 1024;
+- q->memory_limit = 32 << 20; /* 32 MBytes */
++ q->memory_limit = 4 << 20; /* 4 MBytes */
+ q->drop_batch_size = 64;
+ q->quantum = psched_mtu(qdisc_dev(sch));
+ q->perturbation = prandom_u32();
+--
+2.11.0
+
+From 1d418f7e88035ed7a94073f6354246c66e9193e9 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:22:58 +0200
+Subject: fq_codel: switch default qdisc from pfifo_fast to fq_codel and remove pfifo_fast
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/net/sch_generic.h | 3 ++-
+ net/sched/Kconfig | 3 ++-
+ net/sched/sch_api.c | 2 +-
+ net/sched/sch_fq_codel.c | 3 ++-
+ net/sched/sch_generic.c | 4 ++--
+ 5 files changed, 9 insertions(+), 6 deletions(-)
+
+diff --git a/include/net/sch_generic.h b/include/net/sch_generic.h
+index e6aa0a249672..9eeb368d7eea 100644
+--- a/include/net/sch_generic.h
++++ b/include/net/sch_generic.h
+@@ -339,12 +339,13 @@ extern struct Qdisc_ops noop_qdisc_ops;
+ extern struct Qdisc_ops pfifo_fast_ops;
+ extern struct Qdisc_ops mq_qdisc_ops;
+ extern struct Qdisc_ops noqueue_qdisc_ops;
++extern struct Qdisc_ops fq_codel_qdisc_ops;
+ extern const struct Qdisc_ops *default_qdisc_ops;
+ static inline const struct Qdisc_ops *
+ get_default_qdisc_ops(const struct net_device *dev, int ntx)
+ {
+ return ntx < dev->real_num_tx_queues ?
+- default_qdisc_ops : &pfifo_fast_ops;
++ default_qdisc_ops : &fq_codel_qdisc_ops;
+ }
+
+ struct Qdisc_class_common {
+diff --git a/net/sched/Kconfig b/net/sched/Kconfig
+index 87956a768d1b..89c6db93cb63 100644
--- a/net/sched/Kconfig
+++ b/net/sched/Kconfig
@@ -3,8 +3,9 @@
---help---
When the kernel has several packets to send out over a network
device, it has to decide which ones to send first, which ones to
+diff --git a/net/sched/sch_api.c b/net/sched/sch_api.c
+index 206dc24add3a..9b5cfb6ac64b 100644
+--- a/net/sched/sch_api.c
++++ b/net/sched/sch_api.c
+@@ -1976,7 +1976,7 @@ static int __init pktsched_init(void)
+ return err;
+ }
+
+- register_qdisc(&pfifo_fast_ops);
++ register_qdisc(&fq_codel_qdisc_ops);
+ register_qdisc(&pfifo_qdisc_ops);
+ register_qdisc(&bfifo_qdisc_ops);
+ register_qdisc(&pfifo_head_drop_qdisc_ops);
+diff --git a/net/sched/sch_fq_codel.c b/net/sched/sch_fq_codel.c
+index 4467b95795bf..2ebbf50658e5 100644
--- a/net/sched/sch_fq_codel.c
+++ b/net/sched/sch_fq_codel.c
-@@ -705,7 +705,7 @@ static const struct Qdisc_class_ops fq_c
+@@ -705,7 +705,7 @@ static const struct Qdisc_class_ops fq_codel_class_ops = {
.walk = fq_codel_walk,
};
.cl_ops = &fq_codel_class_ops,
.id = "fq_codel",
.priv_size = sizeof(struct fq_codel_sched_data),
-@@ -720,6 +720,7 @@ static struct Qdisc_ops fq_codel_qdisc_o
+@@ -720,6 +720,7 @@ static struct Qdisc_ops fq_codel_qdisc_ops __read_mostly = {
.dump_stats = fq_codel_dump_stats,
.owner = THIS_MODULE,
};
static int __init fq_codel_module_init(void)
{
---- a/include/net/sch_generic.h
-+++ b/include/net/sch_generic.h
-@@ -339,12 +339,13 @@ extern struct Qdisc_ops noop_qdisc_ops;
- extern struct Qdisc_ops pfifo_fast_ops;
- extern struct Qdisc_ops mq_qdisc_ops;
- extern struct Qdisc_ops noqueue_qdisc_ops;
-+extern struct Qdisc_ops fq_codel_qdisc_ops;
- extern const struct Qdisc_ops *default_qdisc_ops;
- static inline const struct Qdisc_ops *
- get_default_qdisc_ops(const struct net_device *dev, int ntx)
- {
- return ntx < dev->real_num_tx_queues ?
-- default_qdisc_ops : &pfifo_fast_ops;
-+ default_qdisc_ops : &fq_codel_qdisc_ops;
- }
-
- struct Qdisc_class_common {
+diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
+index 6cfb6e9038c2..97de97e3c5e2 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -31,7 +31,7 @@
EXPORT_SYMBOL(default_qdisc_ops);
/* Main transmission queue. */
-@@ -759,7 +759,7 @@ static void attach_one_default_qdisc(str
+@@ -759,7 +759,7 @@ static void attach_one_default_qdisc(struct net_device *dev,
void *_unused)
{
struct Qdisc *qdisc;
if (dev->priv_flags & IFF_NO_QUEUE)
ops = &noqueue_qdisc_ops;
---- a/net/sched/sch_api.c
-+++ b/net/sched/sch_api.c
-@@ -1979,7 +1979,7 @@ static int __init pktsched_init(void)
- return err;
- }
-
-- register_qdisc(&pfifo_fast_ops);
-+ register_qdisc(&fq_codel_qdisc_ops);
- register_qdisc(&pfifo_qdisc_ops);
- register_qdisc(&bfifo_qdisc_ops);
- register_qdisc(&pfifo_head_drop_qdisc_ops);
+--
+2.11.0
+
+From b531d492d5ef1cf9dba0f4888eb5fd8624a6d762 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:23:42 +0200
+Subject: net: sched: switch default qdisc from pfifo_fast to fq_codel and remove pfifo_fast
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/sched/sch_generic.c | 140 ------------------------------------------------
+ 1 file changed, 140 deletions(-)
+
+diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
+index 97de97e3c5e2..a62de9e4e897 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
-@@ -449,146 +449,6 @@ struct Qdisc_ops noqueue_qdisc_ops __rea
+@@ -449,146 +449,6 @@ struct Qdisc_ops noqueue_qdisc_ops __read_mostly = {
.owner = THIS_MODULE,
};
static struct lock_class_key qdisc_tx_busylock;
static struct lock_class_key qdisc_running_key;
+--
+2.11.0
+
+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(+)
+
+diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
+index 2651c8d8de2f..a920adb78fea 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -147,6 +147,89 @@ config MDIO_XGENE
comment "MII PHY device drivers"
config AMD_PHY
+diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
+index e58667d111e7..542b6be8953a 100644
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -5,6 +5,21 @@ libphy-$(CONFIG_SWPHY) += swphy.o
obj-$(CONFIG_MDIO_BCM_IPROC) += mdio-bcm-iproc.o
obj-$(CONFIG_MDIO_BCM_UNIMAC) += mdio-bcm-unimac.o
obj-$(CONFIG_MDIO_BITBANG) += mdio-bitbang.o
+diff --git a/include/uapi/linux/Kbuild b/include/uapi/linux/Kbuild
+index cd2be1c8e9fb..ccdd8d586ab8 100644
--- a/include/uapi/linux/Kbuild
+++ b/include/uapi/linux/Kbuild
@@ -399,6 +399,7 @@ header-y += stddef.h
header-y += synclink.h
header-y += sync_file.h
header-y += sysctl.h
+--
+2.11.0
+
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
+From ffe387740bbe88dd88bbe04d6375902708003d6e Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Fri, 7 Jul 2017 17:25:00 +0200
+Subject: net: add packet mangeling patch
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/netdevice.h | 11 +++++++++++
+ include/linux/skbuff.h | 14 ++++----------
+ net/Kconfig | 6 ++++++
+ net/core/dev.c | 18 ++++++++++++++----
+ net/core/skbuff.c | 17 +++++++++++++++++
+ net/ethernet/eth.c | 6 ++++++
+ 6 files changed, 58 insertions(+), 14 deletions(-)
+
+Index: linux-4.9.34/include/linux/netdevice.h
+===================================================================
+--- linux-4.9.34.orig/include/linux/netdevice.h
++++ linux-4.9.34/include/linux/netdevice.h
@@ -1398,6 +1398,7 @@ enum netdev_priv_flags {
IFF_RXFH_CONFIGURED = 1<<25,
IFF_PHONY_HEADROOM = 1<<26,
/*
* Cache lines mostly used on receive path (including eth_type_trans())
*/
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
+Index: linux-4.9.34/include/linux/skbuff.h
+===================================================================
+--- linux-4.9.34.orig/include/linux/skbuff.h
++++ linux-4.9.34/include/linux/skbuff.h
@@ -2334,6 +2334,10 @@ static inline int pskb_trim(struct sk_bu
return (len < skb->len) ? __pskb_trim(skb, len) : 0;
}
static inline struct sk_buff *netdev_alloc_skb_ip_align(struct net_device *dev,
unsigned int length)
{
---- a/net/Kconfig
-+++ b/net/Kconfig
+Index: linux-4.9.34/net/Kconfig
+===================================================================
+--- linux-4.9.34.orig/net/Kconfig
++++ linux-4.9.34/net/Kconfig
@@ -25,6 +25,12 @@ menuconfig NET
if NET
config WANT_COMPAT_NETLINK_MESSAGES
bool
help
---- a/net/core/dev.c
-+++ b/net/core/dev.c
-@@ -2932,10 +2932,20 @@ static int xmit_one(struct sk_buff *skb,
+Index: linux-4.9.34/net/core/dev.c
+===================================================================
+--- linux-4.9.34.orig/net/core/dev.c
++++ linux-4.9.34/net/core/dev.c
+@@ -2931,10 +2931,20 @@ static int xmit_one(struct sk_buff *skb,
if (!list_empty(&ptype_all) || !list_empty(&dev->ptype_all))
dev_queue_xmit_nit(skb, dev);
return rc;
}
---- a/net/core/skbuff.c
-+++ b/net/core/skbuff.c
+Index: linux-4.9.34/net/core/skbuff.c
+===================================================================
+--- linux-4.9.34.orig/net/core/skbuff.c
++++ linux-4.9.34/net/core/skbuff.c
@@ -64,6 +64,7 @@
#include <linux/errqueue.h>
#include <linux/prefetch.h>
void skb_add_rx_frag(struct sk_buff *skb, int i, struct page *page, int off,
int size, unsigned int truesize)
{
---- a/net/ethernet/eth.c
-+++ b/net/ethernet/eth.c
+Index: linux-4.9.34/net/ethernet/eth.c
+===================================================================
+--- linux-4.9.34.orig/net/ethernet/eth.c
++++ linux-4.9.34/net/ethernet/eth.c
@@ -171,6 +171,12 @@ __be16 eth_type_trans(struct sk_buff *sk
const struct ethhdr *eth;
-Register switch connected to srab
+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.c
-+++ b/drivers/net/ethernet/broadcom/bgmac.c
+Index: linux-4.9.34/drivers/net/ethernet/broadcom/bgmac-bcma.c
+===================================================================
+--- linux-4.9.34.orig/drivers/net/ethernet/broadcom/bgmac-bcma.c
++++ linux-4.9.34/drivers/net/ethernet/broadcom/bgmac-bcma.c
+@@ -230,6 +230,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;
+ case BCMA_CHIP_ID_BCM53573:
+ bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
+Index: linux-4.9.34/drivers/net/ethernet/broadcom/bgmac.c
+===================================================================
+--- linux-4.9.34.orig/drivers/net/ethernet/broadcom/bgmac.c
++++ linux-4.9.34/drivers/net/ethernet/broadcom/bgmac.c
@@ -11,6 +11,7 @@
#include <linux/bcma/bcma.h>
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
+Index: linux-4.9.34/drivers/net/ethernet/broadcom/bgmac.h
+===================================================================
+--- linux-4.9.34.orig/drivers/net/ethernet/broadcom/bgmac.h
++++ linux-4.9.34/drivers/net/ethernet/broadcom/bgmac.h
@@ -409,6 +409,7 @@
#define BGMAC_FEAT_CC4_IF_SW_TYPE BIT(17)
#define BGMAC_FEAT_CC4_IF_SW_TYPE_RGMII BIT(18)
};
struct bgmac *bgmac_alloc(struct device *dev);
---- a/drivers/net/ethernet/broadcom/bgmac-bcma.c
-+++ b/drivers/net/ethernet/broadcom/bgmac-bcma.c
-@@ -230,6 +230,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;
- case BCMA_CHIP_ID_BCM53573:
- bgmac->feature_flags |= BGMAC_FEAT_CLKCTLST;
--- /dev/null
+From dd36f935973d91644449bd9749f6062a2bed821b Mon Sep 17 00:00:00 2001
+From: Christian Lamparter <chunkeey@googlemail.com>
+Date: Fri, 7 Jul 2017 17:26:46 +0200
+Subject: misc: owl-loader for delayed Atheros ath9k fixup
+
+Some devices (like the Cisco Meraki Z1 Cloud Managed Teleworker Gateway)
+need to be able to initialize the PCIe wifi device. Normally, this is done
+during the early stages of booting linux, because the necessary init code
+is read from the memory mapped SPI and passed to pci_enable_ath9k_fixup.
+However,this isn't possible for devices which have the init code for the
+Atheros chip stored on NAND in an UBI volume. Hence, this module can be
+used to initialze the chip when the user-space is ready to extract the
+init code.
+
+Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
+Signed-off-by: Christian Lamparter <chunkeey@googlemail.com>
+---
+ drivers/misc/Kconfig | 12 ++++++++++++
+ drivers/misc/Makefile | 1 +
+ 2 files changed, 13 insertions(+)
+
+diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
+index 64971baf11fa..50d2eaa75d41 100644
+--- a/drivers/misc/Kconfig
++++ b/drivers/misc/Kconfig
+@@ -151,6 +151,18 @@ config SGI_IOC4
+ If you have an SGI Altix with an IOC4-based card say Y.
+ Otherwise say N.
+
++config OWL_LOADER
++ tristate "Owl loader for initializing Atheros PCI(e) Wifi chips"
++ depends on PCI
++ ---help---
++ This kernel module helps to initialize certain Qualcomm
++ Atheros' PCI(e) Wifi chips, which have the init data
++ (which contains the PCI device ID for example) stored
++ together with the calibration data in the file system.
++
++ This is necessary for devices like the Cisco Meraki Z1, say M.
++ Otherwise say N.
++
+ config TIFM_CORE
+ tristate "TI Flash Media interface support"
+ depends on PCI
+diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
+index 31983366090a..48c7e74a6e5a 100644
+--- a/drivers/misc/Makefile
++++ b/drivers/misc/Makefile
+@@ -12,6 +12,7 @@ obj-$(CONFIG_ATMEL_TCLIB) += atmel_tclib.o
+ obj-$(CONFIG_DUMMY_IRQ) += dummy-irq.o
+ obj-$(CONFIG_ICS932S401) += ics932s401.o
+ obj-$(CONFIG_LKDTM) += lkdtm.o
++obj-$(CONFIG_OWL_LOADER) += owl-loader.o
+ obj-$(CONFIG_TIFM_CORE) += tifm_core.o
+ obj-$(CONFIG_TIFM_7XX1) += tifm_7xx1.o
+ obj-$(CONFIG_PHANTOM) += phantom.o
+--
+2.11.0
+
+From 3b6115d6b57a263bdc8c9b1df273bd4a7955eead Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 8 Jul 2017 08:16:31 +0200
+Subject: debloat: add some debloat patches, strip down procfs and make O_DIRECT support optional, saves ~15K after lzma on MIPS
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/Kconfig | 3 +++
+ net/core/Makefile | 3 ++-
+ net/core/sock.c | 2 ++
+ net/ipv4/Kconfig | 1 +
+ net/netlink/Kconfig | 1 +
+ net/packet/Kconfig | 1 +
+ net/unix/Kconfig | 1 +
+ 7 files changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/net/Kconfig b/net/Kconfig
+index 38a0c857eb52..b4621e1f3470 100644
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -95,6 +95,9 @@ source "net/netlabel/Kconfig"
config NETWORK_SECMARK
bool "Security Marking"
help
+diff --git a/net/core/Makefile b/net/core/Makefile
+index d6508c2ddca5..bee4adde14d8 100644
--- a/net/core/Makefile
+++ b/net/core/Makefile
-@@ -9,8 +9,9 @@ obj-$(CONFIG_SYSCTL) += sysctl_net_core.
+@@ -9,8 +9,9 @@ obj-$(CONFIG_SYSCTL) += sysctl_net_core.o
obj-y += dev.o ethtool.o dev_addr_lists.o dst.o netevent.o \
neighbour.o rtnetlink.o utils.o link_watch.o filter.o \
obj-$(CONFIG_XFRM) += flow.o
obj-y += net-sysfs.o
obj-$(CONFIG_PROC_FS) += net-procfs.o
+diff --git a/net/core/sock.c b/net/core/sock.c
+index 1989b3dd6d17..d4ca8db4166a 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -1457,9 +1457,11 @@ void sk_destruct(struct sock *sk)
sk_destruct(sk);
}
+diff --git a/net/ipv4/Kconfig b/net/ipv4/Kconfig
+index b54b3ca939db..74ecf598622c 100644
--- a/net/ipv4/Kconfig
+++ b/net/ipv4/Kconfig
@@ -408,6 +408,7 @@ config INET_XFRM_MODE_BEET
default y
---help---
Support for INET (TCP, DCCP, etc) socket monitoring interface used by
---- a/net/unix/Kconfig
-+++ b/net/unix/Kconfig
-@@ -22,6 +22,7 @@ config UNIX
- config UNIX_DIAG
- tristate "UNIX: socket monitoring interface"
- depends on UNIX
-+ select SOCK_DIAG
- default n
- ---help---
- Support for UNIX socket monitoring interface used by the ss tool.
+diff --git a/net/netlink/Kconfig b/net/netlink/Kconfig
+index 5d6e8c05b3d4..8a2696d66c20 100644
--- a/net/netlink/Kconfig
+++ b/net/netlink/Kconfig
@@ -4,6 +4,7 @@
default n
---help---
Support for NETLINK socket monitoring interface used by the ss tool.
+diff --git a/net/packet/Kconfig b/net/packet/Kconfig
+index cc55b35f80e5..9a83c86f5480 100644
--- a/net/packet/Kconfig
+++ b/net/packet/Kconfig
@@ -18,6 +18,7 @@ config PACKET
default n
---help---
Support for PF_PACKET sockets monitoring interface used by the ss tool.
+diff --git a/net/unix/Kconfig b/net/unix/Kconfig
+index 8b31ab85d050..6548cf3ea7f1 100644
+--- a/net/unix/Kconfig
++++ b/net/unix/Kconfig
+@@ -22,6 +22,7 @@ config UNIX
+ config UNIX_DIAG
+ tristate "UNIX: socket monitoring interface"
+ depends on UNIX
++ select SOCK_DIAG
+ default n
+ ---help---
+ Support for UNIX socket monitoring interface used by the ss tool.
+--
+2.11.0
+
---- a/fs/locks.c
-+++ b/fs/locks.c
+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(-)
+
+Index: linux-4.9.34/fs/locks.c
+===================================================================
+--- linux-4.9.34.orig/fs/locks.c
++++ linux-4.9.34/fs/locks.c
@@ -2802,6 +2802,8 @@ static const struct file_operations proc
static int __init proc_locks_init(void)
proc_create("locks", 0, NULL, &proc_locks_operations);
return 0;
}
---- a/fs/proc/Kconfig
-+++ b/fs/proc/Kconfig
+Index: linux-4.9.34/fs/proc/Kconfig
+===================================================================
+--- linux-4.9.34.orig/fs/proc/Kconfig
++++ linux-4.9.34/fs/proc/Kconfig
@@ -81,3 +81,8 @@ config PROC_CHILDREN
Say Y if you are running any user-space software which takes benefit from
+ default n
+ depends on EXPERT
+ bool "Strip non-essential /proc functionality to reduce code size"
---- a/fs/proc/consoles.c
-+++ b/fs/proc/consoles.c
+Index: linux-4.9.34/fs/proc/consoles.c
+===================================================================
+--- linux-4.9.34.orig/fs/proc/consoles.c
++++ linux-4.9.34/fs/proc/consoles.c
@@ -106,6 +106,9 @@ static const struct file_operations proc
static int __init proc_consoles_init(void)
proc_create("consoles", 0, NULL, &proc_consoles_operations);
return 0;
}
---- a/fs/proc/proc_tty.c
-+++ b/fs/proc/proc_tty.c
+Index: linux-4.9.34/fs/proc/proc_tty.c
+===================================================================
+--- linux-4.9.34.orig/fs/proc/proc_tty.c
++++ linux-4.9.34/fs/proc/proc_tty.c
@@ -143,7 +143,10 @@ static const struct file_operations proc
void proc_tty_register_driver(struct tty_driver *driver)
{
if (!proc_mkdir("tty", NULL))
return;
proc_mkdir("tty/ldisc", NULL); /* Preserved: it's userspace visible */
---- a/kernel/exec_domain.c
-+++ b/kernel/exec_domain.c
+Index: linux-4.9.34/include/net/snmp.h
+===================================================================
+--- linux-4.9.34.orig/include/net/snmp.h
++++ linux-4.9.34/include/net/snmp.h
+@@ -123,6 +123,21 @@ struct linux_xfrm_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])
+
+@@ -153,8 +168,9 @@ struct linux_xfrm_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 { \
+Index: linux-4.9.34/ipc/msg.c
+===================================================================
+--- linux-4.9.34.orig/ipc/msg.c
++++ linux-4.9.34/ipc/msg.c
+@@ -1058,6 +1058,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);
+Index: linux-4.9.34/ipc/sem.c
+===================================================================
+--- linux-4.9.34.orig/ipc/sem.c
++++ linux-4.9.34/ipc/sem.c
+@@ -205,6 +205,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);
+Index: linux-4.9.34/ipc/shm.c
+===================================================================
+--- linux-4.9.34.orig/ipc/shm.c
++++ linux-4.9.34/ipc/shm.c
+@@ -118,6 +118,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",
+Index: linux-4.9.34/ipc/util.c
+===================================================================
+--- linux-4.9.34.orig/ipc/util.c
++++ linux-4.9.34/ipc/util.c
+@@ -121,6 +121,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;
+Index: linux-4.9.34/kernel/exec_domain.c
+===================================================================
+--- linux-4.9.34.orig/kernel/exec_domain.c
++++ linux-4.9.34/kernel/exec_domain.c
@@ -41,6 +41,8 @@ static const struct file_operations exec
static int __init proc_execdomains_init(void)
proc_create("execdomains", 0, NULL, &execdomains_proc_fops);
return 0;
}
---- a/kernel/irq/proc.c
-+++ b/kernel/irq/proc.c
+Index: linux-4.9.34/kernel/irq/proc.c
+===================================================================
+--- linux-4.9.34.orig/kernel/irq/proc.c
++++ linux-4.9.34/kernel/irq/proc.c
@@ -326,6 +326,9 @@ void register_irq_proc(unsigned int irq,
static DEFINE_MUTEX(register_lock);
char name [MAX_NAMELEN];
/* 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
+Index: linux-4.9.34/kernel/time/timer_list.c
+===================================================================
+--- linux-4.9.34.orig/kernel/time/timer_list.c
++++ linux-4.9.34/kernel/time/timer_list.c
@@ -393,6 +393,8 @@ static int __init init_timer_list_procfs
{
struct proc_dir_entry *pe;
pe = proc_create("timer_list", 0444, NULL, &timer_list_fops);
if (!pe)
return -ENOMEM;
---- a/mm/vmalloc.c
-+++ b/mm/vmalloc.c
-@@ -2713,6 +2713,8 @@ static const struct file_operations proc
+Index: linux-4.9.34/mm/vmalloc.c
+===================================================================
+--- linux-4.9.34.orig/mm/vmalloc.c
++++ linux-4.9.34/mm/vmalloc.c
+@@ -2703,6 +2703,8 @@ static const struct file_operations proc
static int __init proc_vmalloc_init(void)
{
proc_create("vmallocinfo", S_IRUSR, NULL, &proc_vmalloc_operations);
return 0;
}
---- a/mm/vmstat.c
-+++ b/mm/vmstat.c
+Index: linux-4.9.34/mm/vmstat.c
+===================================================================
+--- linux-4.9.34.orig/mm/vmstat.c
++++ linux-4.9.34/mm/vmstat.c
@@ -1791,10 +1791,12 @@ static int __init setup_vmstat(void)
cpu_notifier_register_done();
#endif
#endif
return 0;
}
---- a/net/8021q/vlanproc.c
-+++ b/net/8021q/vlanproc.c
+Index: linux-4.9.34/net/8021q/vlanproc.c
+===================================================================
+--- linux-4.9.34.orig/net/8021q/vlanproc.c
++++ linux-4.9.34/net/8021q/vlanproc.c
@@ -127,6 +127,9 @@ void vlan_proc_cleanup(struct net *net)
{
struct vlan_net *vn = net_generic(net, vlan_net_id);
vn->proc_vlan_dir = proc_net_mkdir(net, name_root, net->proc_net);
if (!vn->proc_vlan_dir)
goto err;
---- a/net/core/sock.c
-+++ b/net/core/sock.c
+Index: linux-4.9.34/net/core/net-procfs.c
+===================================================================
+--- linux-4.9.34.orig/net/core/net-procfs.c
++++ linux-4.9.34/net/core/net-procfs.c
+@@ -319,10 +319,12 @@ static int __net_init dev_proc_net_init(
+
+ if (!proc_create("dev", S_IRUGO, net->proc_net, &dev_seq_fops))
+ goto out;
+- if (!proc_create("softnet_stat", S_IRUGO, net->proc_net,
++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
++ !proc_create("softnet_stat", S_IRUGO, net->proc_net,
+ &softnet_seq_fops))
+ goto out_dev;
+- if (!proc_create("ptype", S_IRUGO, net->proc_net, &ptype_seq_fops))
++ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
++ !proc_create("ptype", S_IRUGO, net->proc_net, &ptype_seq_fops))
+ goto out_softnet;
+
+ if (wext_proc_init(net))
+@@ -331,9 +333,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;
+@@ -343,8 +347,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);
+ }
+
+Index: linux-4.9.34/net/core/sock.c
+===================================================================
+--- linux-4.9.34.orig/net/core/sock.c
++++ linux-4.9.34/net/core/sock.c
@@ -3082,6 +3082,8 @@ static __net_initdata struct pernet_oper
static int __init proto_init(void)
return register_pernet_subsys(&proto_net_ops);
}
---- a/net/ipv4/fib_trie.c
-+++ b/net/ipv4/fib_trie.c
+Index: linux-4.9.34/net/ipv4/fib_trie.c
+===================================================================
+--- linux-4.9.34.orig/net/ipv4/fib_trie.c
++++ linux-4.9.34/net/ipv4/fib_trie.c
@@ -2667,10 +2667,12 @@ static const struct file_operations fib_
int __net_init fib_proc_init(struct net *net)
remove_proc_entry("route", net->proc_net);
}
---- a/net/ipv4/proc.c
-+++ b/net/ipv4/proc.c
+Index: linux-4.9.34/net/ipv4/proc.c
+===================================================================
+--- linux-4.9.34.orig/net/ipv4/proc.c
++++ linux-4.9.34/net/ipv4/proc.c
@@ -564,6 +564,9 @@ static __net_initdata struct pernet_oper
int __init ip_misc_proc_init(void)
return register_pernet_subsys(&ip_proc_ops);
}
---- a/net/ipv4/route.c
-+++ b/net/ipv4/route.c
+Index: linux-4.9.34/net/ipv4/route.c
+===================================================================
+--- linux-4.9.34.orig/net/ipv4/route.c
++++ linux-4.9.34/net/ipv4/route.c
@@ -420,6 +420,9 @@ static struct pernet_operations ip_rt_pr
static int __init ip_rt_proc_init(void)
return register_pernet_subsys(&ip_rt_proc_ops);
}
---- a/ipc/msg.c
-+++ b/ipc/msg.c
-@@ -1058,6 +1058,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
-@@ -205,6 +205,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
-@@ -118,6 +118,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
-@@ -121,6 +121,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/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("dev", S_IRUGO, net->proc_net, &dev_seq_fops))
- goto out;
-- if (!proc_create("softnet_stat", S_IRUGO, net->proc_net,
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
-+ !proc_create("softnet_stat", S_IRUGO, net->proc_net,
- &softnet_seq_fops))
- goto out_dev;
-- if (!proc_create("ptype", S_IRUGO, net->proc_net, &ptype_seq_fops))
-+ if (!IS_ENABLED(CONFIG_PROC_STRIPPED) &&
-+ !proc_create("ptype", S_IRUGO, net->proc_net, &ptype_seq_fops))
- goto out_softnet;
-
- if (wext_proc_init(net))
-@@ -331,9 +333,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;
-@@ -343,8 +347,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/include/net/snmp.h
-+++ b/include/net/snmp.h
-@@ -123,6 +123,21 @@ struct linux_xfrm_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])
-
-@@ -153,8 +168,9 @@ struct linux_xfrm_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 { \
+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(-)
+
+diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig
+index d02e7c0f5bfd..e1c0e2e0d3a8 100644
--- a/drivers/base/Kconfig
+++ b/drivers/base/Kconfig
@@ -241,7 +241,7 @@ config SOC_BUS
default n
select ANON_INODES
help
+diff --git a/drivers/dma-buf/Makefile b/drivers/dma-buf/Makefile
+index 210a10bfad2b..36ee68dcdffe 100644
--- a/drivers/dma-buf/Makefile
+++ b/drivers/dma-buf/Makefile
@@ -1,3 +1,7 @@
+dma-buf-objs-$(CONFIG_SW_SYNC) += sw_sync.o sync_debug.o
+
+dma-shared-buffer-objs := $(dma-buf-objs-y)
+diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
+index 6b54e02da10c..24e69ef1f243 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -34,6 +34,7 @@
-__exitcall(dma_buf_deinit);
+module_exit(dma_buf_deinit);
+MODULE_LICENSE("GPL");
+diff --git a/kernel/sched/core.c b/kernel/sched/core.c
+index 692c948ae333..eaf379285cca 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
-@@ -2170,6 +2170,7 @@ int wake_up_state(struct task_struct *p,
+@@ -2170,6 +2170,7 @@ int wake_up_state(struct task_struct *p, unsigned int state)
{
return try_to_wake_up(p, state, 0);
}
/*
* This function clears the sched_dl_entity static params.
+--
+2.11.0
+
--- /dev/null
+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(+)
+
+diff --git a/include/linux/kobject.h b/include/linux/kobject.h
+--- a/lib/kobject_uevent.c
++++ b/lib/kobject_uevent.c
+@@ -52,6 +52,18 @@ static const char *kobject_actions[] = {
+ [KOBJ_OFFLINE] = "offline",
+ };
+
++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_action_type - translate action string to numeric type
+ *--- a/include/linux/kobject.h
+--
+2.11.0
+
+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(+)
+
+diff --git a/include/linux/kobject.h b/include/linux/kobject.h
+index a7dc9e61f433..3d6950c957cd 100644
--- a/include/linux/kobject.h
+++ b/include/linux/kobject.h
-@@ -32,6 +32,8 @@
- #define UEVENT_NUM_ENVP 32 /* number of env pointers */
- #define UEVENT_BUFFER_SIZE 2048 /* buffer for the variables */
+@@ -34,6 +34,8 @@
+
+ struct sk_buff;
+struct sk_buff;
+
#ifdef CONFIG_UEVENT_HELPER
/* path to the userspace helper executed on an event */
extern char uevent_helper[];
-@@ -222,4 +224,7 @@ int add_uevent_var(struct kobj_uevent_en
- int kobject_action_type(const char *buf, size_t count,
- enum kobject_action *type);
+@@ -227,4 +229,7 @@ int kobject_action_type(const char *buf, size_t count,
+ int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
+ gfp_t allocation);
+int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
+ gfp_t allocation);
+
#endif /* _KOBJECT_H_ */
+diff --git a/lib/kobject_uevent.c b/lib/kobject_uevent.c
+index ac0c7cfa7292..bd13381a410f 100644
--- a/lib/kobject_uevent.c
+++ b/lib/kobject_uevent.c
-@@ -423,6 +423,43 @@ int add_uevent_var(struct kobj_uevent_en
- EXPORT_SYMBOL_GPL(add_uevent_var);
+@@ -460,6 +460,43 @@ int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
+ EXPORT_SYMBOL_GPL(broadcast_uevent);
#if defined(CONFIG_NET)
+int broadcast_uevent(struct sk_buff *skb, __u32 pid, __u32 group,
static int uevent_net_init(struct net *net)
{
struct uevent_sock *ue_sk;
+--
+2.11.0
+
+From 5d301596fdc72f6cb672f72eb3c66e7cddefb103 Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 8 Jul 2017 08:26:02 +0200
+Subject: initramfs: always create console node
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ scripts/gen_initramfs_list.sh | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/scripts/gen_initramfs_list.sh b/scripts/gen_initramfs_list.sh
+index 7710113e6a72..b8d6cb30e054 100755
--- a/scripts/gen_initramfs_list.sh
+++ b/scripts/gen_initramfs_list.sh
@@ -59,6 +59,18 @@ default_initramfs() {
echo "${dirlist}" | \
while read x; do
${dep_list}parse ${x}
+--
+2.11.0
+
+From 6b1ab74a9917012d0c559edc4ed299d9228ac89f Mon Sep 17 00:00:00 2001
+From: Felix Fietkau <nbd@nbd.name>
+Date: Sat, 8 Jul 2017 08:26:47 +0200
+Subject: kernel: add the new 'crashlog' feature
+
+this tries to store kernel oops/panic logs in a fixed location in RAM to
+recover them available to user space using debugfs
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/crashlog.h | 17 ++++
+ init/Kconfig | 4 +
+ kernel/Makefile | 1 +
+ kernel/crashlog.c | 213 +++++++++++++++++++++++++++++++++++++++++++++++
+ kernel/module.c | 3 +
+ mm/bootmem.c | 2 +
+ mm/memblock.c | 5 ++
+ 7 files changed, 245 insertions(+)
+ create mode 100644 include/linux/crashlog.h
+ create mode 100644 kernel/crashlog.c
+
+diff --git a/include/linux/crashlog.h b/include/linux/crashlog.h
+new file mode 100644
+index 000000000000..7a9ee6138cc4
--- /dev/null
+++ b/include/linux/crashlog.h
@@ -0,0 +1,17 @@
+#endif
+
+#endif
+diff --git a/init/Kconfig b/init/Kconfig
+index 9f2c0cabbc97..6d8f388fb9b3 100644
--- a/init/Kconfig
+++ b/init/Kconfig
-@@ -1308,6 +1308,10 @@ config RELAY
+@@ -1298,6 +1298,10 @@ config RELAY
If unsure, say N.
config BLK_DEV_INITRD
bool "Initial RAM filesystem and RAM disk (initramfs/initrd) support"
depends on BROKEN || !FRV
+diff --git a/kernel/Makefile b/kernel/Makefile
+index 314e7d62f5f0..5fe0d8c3cb35 100644
--- a/kernel/Makefile
+++ b/kernel/Makefile
@@ -113,6 +113,7 @@ obj-$(CONFIG_TORTURE_TEST) += torture.o
$(obj)/configs.o: $(obj)/config_data.h
+diff --git a/kernel/crashlog.c b/kernel/crashlog.c
+new file mode 100644
+index 000000000000..11894b276e54
--- /dev/null
+++ b/kernel/crashlog.c
@@ -0,0 +1,213 @@
+ return 0;
+}
+module_init(crashlog_init_fs);
+diff --git a/kernel/module.c b/kernel/module.c
+index 80b5ac4181c6..51d6e4e6f436 100644
--- a/kernel/module.c
+++ b/kernel/module.c
-@@ -253,6 +253,9 @@ static void mod_update_bounds(struct mod
+@@ -253,6 +253,9 @@ static void mod_update_bounds(struct module *mod)
#ifdef CONFIG_KGDB_KDB
struct list_head *kdb_modules = &modules; /* kdb needs the list of modules */
#endif /* CONFIG_KGDB_KDB */
static void module_assert_mutex(void)
{
+diff --git a/mm/bootmem.c b/mm/bootmem.c
+index e8a55a3c9feb..e0f3c0bf2709 100644
+--- a/mm/bootmem.c
++++ b/mm/bootmem.c
+@@ -14,6 +14,7 @@
+ #include <linux/export.h>
+ #include <linux/kmemleak.h>
+ #include <linux/range.h>
++#include <linux/crashlog.h>
+ #include <linux/bug.h>
+ #include <linux/io.h>
+ #include <linux/bootmem.h>
+@@ -174,6 +175,7 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)
+ if (!bdata->node_bootmem_map)
+ return 0;
+
++ crashlog_init_bootmem(bdata);
+ map = bdata->node_bootmem_map;
+ start = bdata->node_min_pfn;
+ end = bdata->node_low_pfn;
+diff --git a/mm/memblock.c b/mm/memblock.c
+index 68849d0ead09..aef9ca5e7f52 100644
--- a/mm/memblock.c
+++ b/mm/memblock.c
@@ -19,6 +19,7 @@
#include <asm/sections.h>
#include <linux/io.h>
-@@ -499,6 +500,8 @@ static void __init_memblock memblock_ins
+@@ -499,6 +500,8 @@ static void __init_memblock memblock_insert_region(struct memblock_type *type,
memblock_set_region_node(rgn, nid);
type->cnt++;
type->total_size += size;
}
/**
-@@ -538,6 +541,8 @@ int __init_memblock memblock_add_range(s
+@@ -538,6 +541,8 @@ int __init_memblock memblock_add_range(struct memblock_type *type,
type->regions[0].flags = flags;
memblock_set_region_node(&type->regions[0], nid);
type->total_size = size;
return 0;
}
repeat:
---- a/mm/bootmem.c
-+++ b/mm/bootmem.c
-@@ -14,6 +14,7 @@
- #include <linux/export.h>
- #include <linux/kmemleak.h>
- #include <linux/range.h>
-+#include <linux/crashlog.h>
- #include <linux/bug.h>
- #include <linux/io.h>
- #include <linux/bootmem.h>
-@@ -174,6 +175,7 @@ static unsigned long __init free_all_boo
- if (!bdata->node_bootmem_map)
- return 0;
-
-+ crashlog_init_bootmem(bdata);
- map = bdata->node_bootmem_map;
- start = bdata->node_min_pfn;
- end = bdata->node_low_pfn;
+--
+2.11.0
+
+++ /dev/null
---- a/scripts/setlocalversion
-+++ b/scripts/setlocalversion
-@@ -165,7 +165,7 @@ else
- # annotated or signed tagged state (as git describe only
- # looks at signed or annotated tags - git tag -a/-s) and
- # LOCALVERSION= is not specified
-- if test "${LOCALVERSION+set}" != "set"; then
-+ if test "${CONFIG_LOCALVERSION+set}" != "set"; then
- scm=$(scm_version --short)
- res="$res${scm:++}"
- fi
+++ /dev/null
---- a/Makefile
-+++ b/Makefile
-@@ -639,12 +639,12 @@ KBUILD_CFLAGS += $(call cc-option,-fdata
- endif
-
- ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
--KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,)
-+KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,) $(EXTRA_OPTIMIZATION)
- else
- ifdef CONFIG_PROFILE_ALL_BRANCHES
--KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,)
-+KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,) $(EXTRA_OPTIMIZATION)
- else
--KBUILD_CFLAGS += -O2
-+KBUILD_CFLAGS += -O2 -fno-reorder-blocks -fno-tree-ch $(EXTRA_OPTIMIZATION)
- endif
- endif
-
+++ /dev/null
---- a/Makefile
-+++ b/Makefile
-@@ -407,7 +407,7 @@ KBUILD_CFLAGS_KERNEL :=
- KBUILD_AFLAGS := -D__ASSEMBLY__ $(call cc-option,-fno-PIE)
- KBUILD_AFLAGS_MODULE := -DMODULE
- KBUILD_CFLAGS_MODULE := -DMODULE
--KBUILD_LDFLAGS_MODULE := -T $(srctree)/scripts/module-common.lds
-+KBUILD_LDFLAGS_MODULE = -T $(srctree)/scripts/module-common.lds $(if $(CONFIG_PROFILING),,-s)
-
- # Read KERNELRELEASE from include/config/kernel.release (if it exists)
- KERNELRELEASE = $(shell cat include/config/kernel.release 2> /dev/null)
+++ /dev/null
---- a/tools/perf/pmu-events/jevents.c
-+++ b/tools/perf/pmu-events/jevents.c
-@@ -35,6 +35,7 @@
- #include <stdlib.h>
- #include <errno.h>
- #include <string.h>
-+#include <strings.h>
- #include <ctype.h>
- #include <unistd.h>
- #include <stdarg.h>
---- a/tools/perf/pmu-events/json.c
-+++ b/tools/perf/pmu-events/json.c
-@@ -38,7 +38,6 @@
- #include <unistd.h>
- #include "jsmn.h"
- #include "json.h"
--#include <linux/kernel.h>
-
-
- static char *mapfile(const char *fn, size_t *size)
---- a/tools/build/Build.include
-+++ b/tools/build/Build.include
-@@ -95,4 +95,4 @@ cxx_flags = -Wp,-MD,$(depfile),-MT,$@ $(
- ###
- ## HOSTCC C flags
-
--host_c_flags = -Wp,-MD,$(depfile),-MT,$@ $(CHOSTFLAGS) -D"BUILD_STR(s)=\#s" $(CHOSTFLAGS_$(basetarget).o) $(CHOSTFLAGS_$(obj))
-+host_c_flags = -MD -MF $(depfile) -MT $@ $(CHOSTFLAGS) -D"BUILD_STR(s)=\#s" $(CHOSTFLAGS_$(basetarget).o) $(CHOSTFLAGS_$(obj))
+++ /dev/null
---- a/include/uapi/linux/spi/spidev.h
-+++ b/include/uapi/linux/spi/spidev.h
-@@ -111,7 +111,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)])
-
+++ /dev/null
-ARM: implement "uncompressed zImage"
-
-Based on RFC patch by Uwe Kleine-König
-http://www.spinics.net/lists/arm-kernel/msg230153.html
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
---- a/arch/arm/boot/compressed/Makefile
-+++ b/arch/arm/boot/compressed/Makefile
-@@ -71,6 +71,7 @@ compress-$(CONFIG_KERNEL_LZO) = lzo
- compress-$(CONFIG_KERNEL_LZMA) = lzma
- compress-$(CONFIG_KERNEL_XZ) = xzkern
- compress-$(CONFIG_KERNEL_LZ4) = lz4
-+compress-$(CONFIG_KERNEL_CAT) = cat
-
- # Borrowed libfdt files for the ATAG compatibility mode
-
---- a/arch/arm/boot/compressed/decompress.c
-+++ b/arch/arm/boot/compressed/decompress.c
-@@ -55,6 +55,10 @@ extern char * strstr(const char * s1, co
- #include "../../../../lib/decompress_unlz4.c"
- #endif
-
-+#ifdef CONFIG_KERNEL_CAT
-+#include "../../../../lib/decompress_uncat.c"
-+#endif
-+
- int do_decompress(u8 *input, int len, u8 *output, void (*error)(char *x))
- {
- return __decompress(input, len, NULL, NULL, output, 0, NULL, error);
---- /dev/null
-+++ b/arch/arm/boot/compressed/piggy.cat.S
-@@ -0,0 +1,6 @@
-+ .section .piggydata,#alloc
-+ .globl input_data
-+input_data:
-+ .incbin "arch/arm/boot/compressed/piggy.cat"
-+ .globl input_data_end
-+input_data_end:
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -127,6 +127,9 @@ config HAVE_KERNEL_LZO
- config HAVE_KERNEL_LZ4
- bool
-
-+config HAVE_KERNEL_CAT
-+ bool
-+
- choice
- prompt "Kernel compression mode"
- default KERNEL_GZIP
-@@ -193,9 +196,10 @@ config KERNEL_LZO
- bool "LZO"
- depends on HAVE_KERNEL_LZO
- help
-- Its compression ratio is the poorest among the choices. The kernel
-- size is about 10% bigger than gzip; however its speed
-- (both compression and decompression) is the fastest.
-+ Its compression ratio is the poorest among the choices (apart from
-+ uncompressed below). The kernel size is about 10% bigger than gzip;
-+ however its speed (both compression and decompression) is the
-+ fastest.
-
- config KERNEL_LZ4
- bool "LZ4"
-@@ -209,6 +213,12 @@ config KERNEL_LZ4
- is about 8% bigger than LZO. But the decompression speed is
- faster than LZO.
-
-+config KERNEL_CAT
-+ bool "uncompressed"
-+ depends on HAVE_KERNEL_CAT
-+ help
-+ Don't use compression at all.
-+
- endchoice
-
- config DEFAULT_HOSTNAME
---- /dev/null
-+++ b/lib/decompress_uncat.c
-@@ -0,0 +1,17 @@
-+#include <linux/types.h>
-+#include <linux/compiler.h>
-+
-+#ifdef STATIC
-+
-+STATIC int __decompress(unsigned char *buf, long in_len,
-+ long (*fill)(void*, unsigned long),
-+ long (*flush)(void*, unsigned long),
-+ unsigned char *output, long out_len,
-+ long *posp,
-+ void (*error)(char *x))
-+{
-+ memmove(output, buf, in_len);
-+ return 0;
-+}
-+
-+#endif
---- a/scripts/Makefile.lib
-+++ b/scripts/Makefile.lib
-@@ -357,6 +357,13 @@ cmd_lz4 = (cat $(filter-out FORCE,$^) |
- lz4c -l -c1 stdin stdout && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
- (rm -f $@ ; false)
-
-+# uncompressed
-+# ---------------------------------------------------------------------------
-+quiet_cmd_cat = CAT $@
-+cmd_cat = (cat $(filter-out FORCE,$^) \
-+ && $(call size_append, $(filter-out FORCE,$^))) > $@ || \
-+ (rm -f $@ ; false)
-+
- # U-Boot mkimage
- # ---------------------------------------------------------------------------
-
---- a/arch/arm/Kconfig
-+++ b/arch/arm/Kconfig
-@@ -65,6 +65,7 @@ config ARM
- select HAVE_KERNEL_LZMA
- select HAVE_KERNEL_LZO
- select HAVE_KERNEL_XZ
-+ select HAVE_KERNEL_CAT
- select HAVE_KPROBES if !XIP_KERNEL && !CPU_ENDIAN_BE32 && !CPU_V7M
- select HAVE_KRETPROBES if (HAVE_KPROBES)
- select HAVE_MEMBLOCK
+++ /dev/null
---- a/sound/core/Kconfig
-+++ b/sound/core/Kconfig
-@@ -16,13 +16,13 @@ config SND_DMAENGINE_PCM
- tristate
-
- config SND_HWDEP
-- tristate
-+ tristate "Sound hardware support"
-
- config SND_RAWMIDI
- tristate
-
- config SND_COMPRESS_OFFLOAD
-- tristate
-+ tristate "Compression offloading support"
-
- config SND_JACK
- bool
+++ /dev/null
---- a/drivers/crypto/Kconfig
-+++ b/drivers/crypto/Kconfig
-@@ -176,6 +176,7 @@ config CRYPTO_DEV_MV_CESA
- tristate "Marvell's Cryptographic Engine"
- depends on PLAT_ORION
- select CRYPTO_AES
-+ select CRYPTO_HASH2
- select CRYPTO_BLKCIPHER
- select CRYPTO_HASH
- select SRAM
+++ /dev/null
---- a/drivers/ssb/Kconfig
-+++ b/drivers/ssb/Kconfig
-@@ -29,6 +29,7 @@ config SSB_SPROM
- config SSB_BLOCKIO
- bool
- depends on SSB
-+ default y
-
- config SSB_PCIHOST_POSSIBLE
- bool
-@@ -49,7 +50,7 @@ config SSB_PCIHOST
- config SSB_B43_PCI_BRIDGE
- bool
- depends on SSB_PCIHOST
-- default n
-+ default y
-
- config SSB_PCMCIAHOST_POSSIBLE
- bool
---- a/drivers/bcma/Kconfig
-+++ b/drivers/bcma/Kconfig
-@@ -17,6 +17,7 @@ config BCMA
- config BCMA_BLOCKIO
- bool
- depends on BCMA
-+ default y
-
- config BCMA_HOST_PCI_POSSIBLE
- bool
+++ /dev/null
---- a/lib/Kconfig
-+++ b/lib/Kconfig
-@@ -334,16 +334,16 @@ config BCH_CONST_T
- # Textsearch support is select'ed if needed
- #
- config TEXTSEARCH
-- bool
-+ boolean "Textsearch support"
-
- config TEXTSEARCH_KMP
-- tristate
-+ tristate "Textsearch KMP"
-
- config TEXTSEARCH_BM
-- tristate
-+ tristate "Textsearch BM"
-
- config TEXTSEARCH_FSM
-- tristate
-+ tristate "Textsearch FSM"
-
- config BTREE
- bool
+++ /dev/null
---- a/net/wireless/Kconfig
-+++ b/net/wireless/Kconfig
-@@ -188,7 +188,7 @@ config CFG80211_WEXT_EXPORT
- wext compatibility symbols to be exported.
-
- config LIB80211
-- tristate
-+ tristate "LIB80211"
- default n
- help
- This options enables a library of common routines used
-@@ -197,13 +197,16 @@ config LIB80211
- Drivers should select this themselves if needed.
-
- config LIB80211_CRYPT_WEP
-- tristate
-+ tristate "LIB80211_CRYPT_WEP"
-+ select LIB80211
-
- config LIB80211_CRYPT_CCMP
-- tristate
-+ tristate "LIB80211_CRYPT_CCMP"
-+ select LIB80211
-
- config LIB80211_CRYPT_TKIP
-- tristate
-+ tristate "LIB80211_CRYPT_TKIP"
-+ select LIB80211
-
- config LIB80211_DEBUG
- bool "lib80211 debugging messages"
+++ /dev/null
---- a/crypto/Kconfig
-+++ b/crypto/Kconfig
-@@ -32,7 +32,7 @@ config CRYPTO_FIPS
- this is.
-
- config CRYPTO_ALGAPI
-- tristate
-+ tristate "ALGAPI"
- select CRYPTO_ALGAPI2
- help
- This option provides the API for cryptographic algorithms.
-@@ -41,7 +41,7 @@ config CRYPTO_ALGAPI2
- tristate
-
- config CRYPTO_AEAD
-- tristate
-+ tristate "AEAD"
- select CRYPTO_AEAD2
- select CRYPTO_ALGAPI
-
-@@ -52,7 +52,7 @@ config CRYPTO_AEAD2
- select CRYPTO_RNG2
-
- config CRYPTO_BLKCIPHER
-- tristate
-+ tristate "BLKCIPHER"
- select CRYPTO_BLKCIPHER2
- select CRYPTO_ALGAPI
-
-@@ -63,7 +63,7 @@ config CRYPTO_BLKCIPHER2
- select CRYPTO_WORKQUEUE
-
- config CRYPTO_HASH
-- tristate
-+ tristate "HASH"
- select CRYPTO_HASH2
- select CRYPTO_ALGAPI
-
-@@ -72,7 +72,7 @@ config CRYPTO_HASH2
- select CRYPTO_ALGAPI2
-
- config CRYPTO_RNG
-- tristate
-+ tristate "RNG"
- select CRYPTO_RNG2
- select CRYPTO_ALGAPI
-
+++ /dev/null
---- a/net/wireless/Kconfig
-+++ b/net/wireless/Kconfig
-@@ -1,5 +1,5 @@
- config WIRELESS_EXT
-- bool
-+ bool "Wireless extensions"
-
- config WEXT_CORE
- def_bool y
-@@ -11,10 +11,10 @@ config WEXT_PROC
- depends on WEXT_CORE
-
- config WEXT_SPY
-- bool
-+ bool "WEXT_SPY"
-
- config WEXT_PRIV
-- bool
-+ bool "WEXT_PRIV"
-
- config CFG80211
- tristate "cfg80211 - wireless configuration API"
+++ /dev/null
---- a/net/netfilter/Kconfig
-+++ b/net/netfilter/Kconfig
-@@ -10,7 +10,7 @@ config NETFILTER_INGRESS
- infrastructure.
-
- config NETFILTER_NETLINK
-- tristate
-+ tristate "Netfilter NFNETLINK interface"
-
- config NETFILTER_NETLINK_ACCT
- tristate "Netfilter NFACCT over NFNETLINK interface"
+++ /dev/null
-We use backports for driver updates - make sure we can compile in the glue code regardless
-
-Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
-
---- a/drivers/net/wireless/ti/Kconfig
-+++ b/drivers/net/wireless/ti/Kconfig
-@@ -19,7 +19,7 @@ source "drivers/net/wireless/ti/wlcore/K
-
- config WILINK_PLATFORM_DATA
- bool "TI WiLink platform data"
-- depends on WLCORE_SDIO || WL1251_SDIO
-+ depends on WLCORE_SDIO || WL1251_SDIO || ARCH_OMAP2PLUS
- default y
- ---help---
- Small platform data bit needed to pass data to the sdio modules.
+++ /dev/null
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -1150,6 +1150,10 @@ config SYNC_R4K
- config MIPS_MACHINE
- def_bool n
-
-+config IMAGE_CMDLINE_HACK
-+ bool "OpenWrt specific image command line hack"
-+ default n
-+
- config NO_IOPORT_MAP
- def_bool n
-
---- a/arch/mips/kernel/head.S
-+++ b/arch/mips/kernel/head.S
-@@ -79,6 +79,12 @@ FEXPORT(__kernel_entry)
- j kernel_entry
- #endif
-
-+#ifdef CONFIG_IMAGE_CMDLINE_HACK
-+ .ascii "CMDLINE:"
-+EXPORT(__image_cmdline)
-+ .fill 0x400
-+#endif /* CONFIG_IMAGE_CMDLINE_HACK */
-+
- __REF
-
- NESTED(kernel_entry, 16, sp) # kernel entry point
+++ /dev/null
---- a/arch/mips/Makefile
-+++ b/arch/mips/Makefile
-@@ -90,7 +90,7 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
- # machines may also. Since BFD is incredibly buggy with respect to
- # crossformat linking we rely on the elf2ecoff tool for format conversion.
- #
--cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
-+cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely
- cflags-y += -msoft-float
- LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
- KBUILD_AFLAGS_MODULE += -mlong-calls
+++ /dev/null
-Adjust highmem offset to 0x10000000 to ensure that all kmalloc allocations
-stay within the same 256M boundary. This ensures that -mlong-calls is not
-needed on systems with more than 256M RAM.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
----
---- a/arch/mips/include/asm/mach-generic/spaces.h
-+++ b/arch/mips/include/asm/mach-generic/spaces.h
-@@ -46,7 +46,7 @@
- * Memory above this physical address will be considered highmem.
- */
- #ifndef HIGHMEM_START
--#define HIGHMEM_START _AC(0x20000000, UL)
-+#define HIGHMEM_START _AC(0x10000000, UL)
- #endif
-
- #endif /* CONFIG_32BIT */
+++ /dev/null
---- a/arch/arm/kernel/module.c
-+++ b/arch/arm/kernel/module.c
-@@ -88,6 +88,10 @@ apply_relocate(Elf32_Shdr *sechdrs, cons
- return -ENOEXEC;
- }
-
-+ if ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) &&
-+ ELF_ST_BIND(sym->st_info) == STB_WEAK)
-+ continue;
-+
- loc = dstsec->sh_addr + rel->r_offset;
-
- switch (ELF32_R_TYPE(rel->r_info)) {
+++ /dev/null
---- a/arch/powerpc/Makefile
-+++ b/arch/powerpc/Makefile
-@@ -179,7 +179,6 @@ else
- CHECKFLAGS += -D__LITTLE_ENDIAN__
- endif
-
--KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
-
- ifeq ($(CONFIG_476FPE_ERR46),y)
- KBUILD_LDFLAGS_MODULE += --ppc476-workaround \
+++ /dev/null
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -41,6 +41,7 @@
- * Note: writeable partitions require their size and offset be
- * erasesize aligned (e.g. use MTDPART_OFS_NEXTBLK).
- */
-+struct mtd_info;
-
- struct mtd_partition {
- const char *name; /* identifier string */
-@@ -57,7 +58,6 @@ struct mtd_partition {
- #define MTDPART_SIZ_FULL (0)
-
-
--struct mtd_info;
- struct device_node;
-
- /**
+++ /dev/null
---- a/drivers/mtd/mtdpart.c
-+++ b/drivers/mtd/mtdpart.c
-@@ -343,7 +343,16 @@ static int part_lock(struct mtd_info *mt
- static int part_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
- {
- struct mtd_part *part = mtd_to_part(mtd);
-- return part->parent->_unlock(part->parent, ofs + part->offset, len);
-+
-+ ofs += part->offset;
-+
-+ if (mtd->flags & MTD_ERASE_PARTIAL) {
-+ /* round up len to next erasesize and round down offset to prev block */
-+ len = (mtd_div_by_eb(len, part->parent) + 1) * part->parent->erasesize;
-+ ofs &= ~(part->parent->erasesize - 1);
-+ }
-+
-+ return part->parent->_unlock(part->parent, ofs, len);
- }
-
- static int part_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
+++ /dev/null
---- a/drivers/mtd/chips/cfi_cmdset_0002.c
-+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
-@@ -807,7 +807,7 @@ static int get_chip(struct map_info *map
- return 0;
-
- case FL_ERASING:
-- if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||
-+ if (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||
- !(mode == FL_READY || mode == FL_POINT ||
- (mode == FL_WRITING && (cfip->EraseSuspend & 0x2))))
- goto sleep;
+++ /dev/null
-Disable software protection bits for Macronix flashes.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-
---- a/drivers/mtd/spi-nor/spi-nor.c
-+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1595,6 +1595,7 @@ int spi_nor_scan(struct spi_nor *nor, co
-
- if (JEDEC_MFR(info) == SNOR_MFR_ATMEL ||
- JEDEC_MFR(info) == SNOR_MFR_INTEL ||
-+ JEDEC_MFR(info) == SNOR_MFR_MACRONIX ||
- JEDEC_MFR(info) == SNOR_MFR_SST ||
- info->flags & SPI_NOR_HAS_LOCK) {
- write_enable(nor);
+++ /dev/null
---- a/net/netfilter/nf_nat_core.c
-+++ b/net/netfilter/nf_nat_core.c
-@@ -95,6 +95,9 @@ int nf_xfrm_me_harder(struct net *net, s
- struct dst_entry *dst;
- int err;
-
-+ if (skb->dev && !dev_net(skb->dev)->xfrm.policy_count[XFRM_POLICY_OUT])
-+ return 0;
-+
- err = xfrm_decode_session(skb, &fl, family);
- if (err < 0)
- return err;
+++ /dev/null
---- a/drivers/net/ppp/pppoe.c
-+++ b/drivers/net/ppp/pppoe.c
-@@ -861,7 +861,7 @@ static int pppoe_sendmsg(struct socket *
- goto end;
-
-
-- skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32,
-+ skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32 + NET_SKB_PAD,
- 0, GFP_KERNEL);
- if (!skb) {
- error = -ENOMEM;
-@@ -869,7 +869,7 @@ static int pppoe_sendmsg(struct socket *
- }
-
- /* Reserve space for headers. */
-- skb_reserve(skb, dev->hard_header_len);
-+ skb_reserve(skb, dev->hard_header_len + NET_SKB_PAD);
- skb_reset_network_header(skb);
-
- skb->dev = dev;
+++ /dev/null
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -137,8 +137,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
+++ /dev/null
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -2298,7 +2298,7 @@ static inline int pskb_network_may_pull(
- * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
- */
- #ifndef NET_SKB_PAD
--#define NET_SKB_PAD max(32, L1_CACHE_BYTES)
-+#define NET_SKB_PAD max(64, L1_CACHE_BYTES)
- #endif
-
- int ___pskb_trim(struct sk_buff *skb, unsigned int len);
+++ /dev/null
---- a/net/sched/sch_fq_codel.c
-+++ b/net/sched/sch_fq_codel.c
-@@ -479,7 +479,7 @@ static int fq_codel_init(struct Qdisc *s
-
- sch->limit = 10*1024;
- q->flows_cnt = 1024;
-- q->memory_limit = 32 << 20; /* 32 MBytes */
-+ q->memory_limit = 4 << 20; /* 4 MBytes */
- q->drop_batch_size = 64;
- q->quantum = psched_mtu(qdisc_dev(sch));
- q->perturbation = prandom_u32();
+++ /dev/null
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -499,6 +499,12 @@ struct phy_driver {
- /* Determines the negotiated speed and duplex */
- int (*read_status)(struct phy_device *phydev);
-
-+ /*
-+ * Update the value in phydev->link to reflect the
-+ * current link value
-+ */
-+ int (*update_link)(struct phy_device *phydev);
-+
- /* Clears any pending interrupts */
- int (*ack_interrupt)(struct phy_device *phydev);
-
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -1309,6 +1309,9 @@ int genphy_update_link(struct phy_device
- {
- int status;
-
-+ if (phydev->drv && phydev->drv->update_link)
-+ return phydev->drv->update_link(phydev);
-+
- /* Do a fake read */
- status = phy_read(phydev, MII_BMSR);
- if (status < 0)
+++ /dev/null
---- a/drivers/net/phy/phy_device.c
-+++ b/drivers/net/phy/phy_device.c
-@@ -1001,6 +1001,9 @@ void phy_detach(struct phy_device *phyde
- struct mii_bus *bus;
- int i;
-
-+ if (phydev->drv && phydev->drv->detach)
-+ phydev->drv->detach(phydev);
-+
- phydev->attached_dev->phydev = NULL;
- phydev->attached_dev = NULL;
- phy_suspend(phydev);
---- a/include/linux/phy.h
-+++ b/include/linux/phy.h
-@@ -517,6 +517,12 @@ struct phy_driver {
- */
- int (*did_interrupt)(struct phy_device *phydev);
-
-+ /*
-+ * Called before an ethernet device is detached
-+ * from the PHY.
-+ */
-+ void (*detach)(struct phy_device *phydev);
-+
- /* Clears up any memory if needed */
- void (*remove)(struct phy_device *phydev);
-
+++ /dev/null
---- a/drivers/leds/trigger/Kconfig
-+++ b/drivers/leds/trigger/Kconfig
-@@ -126,4 +126,11 @@ config LEDS_TRIGGER_PANIC
- a different trigger.
- If unsure, say Y.
-
-+config LEDS_TRIGGER_NETDEV
-+ tristate "LED Netdev Trigger"
-+ depends on NET && LEDS_TRIGGERS
-+ help
-+ This allows LEDs to be controlled by network device activity.
-+ If unsure, say Y.
-+
- endif # LEDS_TRIGGERS
---- a/drivers/leds/Makefile
-+++ b/drivers/leds/Makefile
-@@ -77,3 +77,4 @@ obj-$(CONFIG_LEDS_DAC124S085) += leds-d
-
- # LED Triggers
- obj-$(CONFIG_LEDS_TRIGGERS) += trigger/
-+obj-$(CONFIG_LEDS_TRIGGER_NETDEV) += ledtrig-netdev.o
+++ /dev/null
---- a/drivers/misc/Kconfig
-+++ b/drivers/misc/Kconfig
-@@ -151,6 +151,18 @@ config SGI_IOC4
- If you have an SGI Altix with an IOC4-based card say Y.
- Otherwise say N.
-
-+config OWL_LOADER
-+ tristate "Owl loader for initializing Atheros PCI(e) Wifi chips"
-+ depends on PCI
-+ ---help---
-+ This kernel module helps to initialize certain Qualcomm
-+ Atheros' PCI(e) Wifi chips, which have the init data
-+ (which contains the PCI device ID for example) stored
-+ together with the calibration data in the file system.
-+
-+ This is necessary for devices like the Cisco Meraki Z1, say M.
-+ Otherwise say N.
-+
- config TIFM_CORE
- tristate "TI Flash Media interface support"
- depends on PCI
---- a/drivers/misc/Makefile
-+++ b/drivers/misc/Makefile
-@@ -12,6 +12,7 @@ obj-$(CONFIG_ATMEL_TCLIB) += atmel_tclib
- obj-$(CONFIG_DUMMY_IRQ) += dummy-irq.o
- obj-$(CONFIG_ICS932S401) += ics932s401.o
- obj-$(CONFIG_LKDTM) += lkdtm.o
-+obj-$(CONFIG_OWL_LOADER) += owl-loader.o
- obj-$(CONFIG_TIFM_CORE) += tifm_core.o
- obj-$(CONFIG_TIFM_7XX1) += tifm_7xx1.o
- obj-$(CONFIG_PHANTOM) += phantom.o
+++ /dev/null
---- a/drivers/rtc/Kconfig
-+++ b/drivers/rtc/Kconfig
-@@ -1202,6 +1202,15 @@ config RTC_DRV_ZYNQMP
- If you say yes here you get support for the RTC controller found on
- Xilinx Zynq Ultrascale+ MPSoC.
-
-+config RTC_DRV_RTC7301
-+ tristate "Epson RTC-7301 SF/DG"
-+ help
-+ If you say Y here you will get support for the
-+ Epson RTC-7301 SF/DG RTC chips.
-+
-+ This driver can also be built as a module. If so, the module
-+ will be called rtc-7301.
-+
- comment "on-CPU RTC drivers"
-
- config RTC_DRV_ASM9260
---- a/drivers/rtc/Makefile
-+++ b/drivers/rtc/Makefile
-@@ -127,6 +127,7 @@ obj-$(CONFIG_RTC_DRV_RP5C01) += rtc-rp5c
- obj-$(CONFIG_RTC_DRV_RS5C313) += rtc-rs5c313.o
- obj-$(CONFIG_RTC_DRV_RS5C348) += rtc-rs5c348.o
- obj-$(CONFIG_RTC_DRV_RS5C372) += rtc-rs5c372.o
-+obj-$(CONFIG_RTC_DRV_RTC7301) += rtc-rtc7301.o
- obj-$(CONFIG_RTC_DRV_RV3029C2) += rtc-rv3029c2.o
- obj-$(CONFIG_RTC_DRV_RV8803) += rtc-rv8803.o
- obj-$(CONFIG_RTC_DRV_RX4581) += rtc-rx4581.o
---- /dev/null
-+++ b/drivers/rtc/rtc-rtc7301.c
-@@ -0,0 +1,219 @@
-+/*
-+ * Driver for Epson RTC-7301SF/DG
-+ *
-+ * Copyright (C) 2009 Jose Vasconcellos
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License version 2 as
-+ * published by the Free Software Foundation.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/rtc.h>
-+#include <linux/platform_device.h>
-+#include <linux/io.h>
-+#include <linux/delay.h>
-+#include <linux/bcd.h>
-+
-+#define RTC_NAME "rtc7301"
-+#define RTC_VERSION "0.1"
-+
-+/* Epson RTC-7301 register addresses */
-+#define RTC7301_SEC 0x00
-+#define RTC7301_SEC10 0x01
-+#define RTC7301_MIN 0x02
-+#define RTC7301_MIN10 0x03
-+#define RTC7301_HOUR 0x04
-+#define RTC7301_HOUR10 0x05
-+#define RTC7301_WEEKDAY 0x06
-+#define RTC7301_DAY 0x07
-+#define RTC7301_DAY10 0x08
-+#define RTC7301_MON 0x09
-+#define RTC7301_MON10 0x0A
-+#define RTC7301_YEAR 0x0B
-+#define RTC7301_YEAR10 0x0C
-+#define RTC7301_YEAR100 0x0D
-+#define RTC7301_YEAR1000 0x0E
-+#define RTC7301_CTRLREG 0x0F
-+
-+static uint8_t __iomem *rtc7301_base;
-+
-+#define read_reg(offset) (readb(rtc7301_base + offset) & 0xf)
-+#define write_reg(offset, data) writeb(data, rtc7301_base + (offset))
-+
-+#define rtc7301_isbusy() (read_reg(RTC7301_CTRLREG) & 1)
-+
-+static void rtc7301_init_settings(void)
-+{
-+ int i;
-+
-+ write_reg(RTC7301_CTRLREG, 2);
-+ write_reg(RTC7301_YEAR1000, 2);
-+ udelay(122);
-+
-+ /* bank 1 */
-+ write_reg(RTC7301_CTRLREG, 6);
-+ for (i=0; i<15; i++)
-+ write_reg(i, 0);
-+
-+ /* bank 2 */
-+ write_reg(RTC7301_CTRLREG, 14);
-+ for (i=0; i<15; i++)
-+ write_reg(i, 0);
-+ write_reg(RTC7301_CTRLREG, 0);
-+}
-+
-+static int rtc7301_get_datetime(struct device *dev, struct rtc_time *dt)
-+{
-+ int cnt;
-+ uint8_t buf[16];
-+
-+ cnt = 0;
-+ while (rtc7301_isbusy()) {
-+ udelay(244);
-+ if (cnt++ > 100) {
-+ dev_err(dev, "%s: timeout error %x\n", __func__, rtc7301_base[RTC7301_CTRLREG]);
-+ return -EIO;
-+ }
-+ }
-+
-+ for (cnt=0; cnt<16; cnt++)
-+ buf[cnt] = read_reg(cnt);
-+
-+ if (buf[RTC7301_SEC10] & 8) {
-+ dev_err(dev, "%s: RTC not set\n", __func__);
-+ return -EINVAL;
-+ }
-+
-+ memset(dt, 0, sizeof(*dt));
-+
-+ dt->tm_sec = buf[RTC7301_SEC] + buf[RTC7301_SEC10]*10;
-+ dt->tm_min = buf[RTC7301_MIN] + buf[RTC7301_MIN10]*10;
-+ dt->tm_hour = buf[RTC7301_HOUR] + buf[RTC7301_HOUR10]*10;
-+
-+ dt->tm_mday = buf[RTC7301_DAY] + buf[RTC7301_DAY10]*10;
-+ dt->tm_mon = buf[RTC7301_MON] + buf[RTC7301_MON10]*10 - 1;
-+ dt->tm_year = buf[RTC7301_YEAR] + buf[RTC7301_YEAR10]*10 +
-+ buf[RTC7301_YEAR100]*100 +
-+ ((buf[RTC7301_YEAR1000] & 3)*1000) - 1900;
-+
-+ /* the rtc device may contain illegal values on power up
-+ * according to the data sheet. make sure they are valid.
-+ */
-+
-+ return rtc_valid_tm(dt);
-+}
-+
-+static int rtc7301_set_datetime(struct device *dev, struct rtc_time *dt)
-+{
-+ int data;
-+
-+ data = dt->tm_year + 1900;
-+ if (data >= 2100 || data < 1900)
-+ return -EINVAL;
-+
-+ write_reg(RTC7301_CTRLREG, 2);
-+ udelay(122);
-+
-+ data = bin2bcd(dt->tm_sec);
-+ write_reg(RTC7301_SEC, data);
-+ write_reg(RTC7301_SEC10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_min);
-+ write_reg(RTC7301_MIN, data );
-+ write_reg(RTC7301_MIN10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_hour);
-+ write_reg(RTC7301_HOUR, data);
-+ write_reg(RTC7301_HOUR10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_mday);
-+ write_reg(RTC7301_DAY, data);
-+ write_reg(RTC7301_DAY10, (data>> 4));
-+
-+ data = bin2bcd(dt->tm_mon + 1);
-+ write_reg(RTC7301_MON, data);
-+ write_reg(RTC7301_MON10, (data >> 4));
-+
-+ data = bin2bcd(dt->tm_year % 100);
-+ write_reg(RTC7301_YEAR, data);
-+ write_reg(RTC7301_YEAR10, (data >> 4));
-+ data = bin2bcd((1900 + dt->tm_year) / 100);
-+ write_reg(RTC7301_YEAR100, data);
-+
-+ data = bin2bcd(dt->tm_wday);
-+ write_reg(RTC7301_WEEKDAY, data);
-+
-+ write_reg(RTC7301_CTRLREG, 0);
-+
-+ return 0;
-+}
-+
-+static const struct rtc_class_ops rtc7301_rtc_ops = {
-+ .read_time = rtc7301_get_datetime,
-+ .set_time = rtc7301_set_datetime,
-+};
-+
-+static int rtc7301_probe(struct platform_device *pdev)
-+{
-+ struct rtc_device *rtc;
-+ struct resource *res;
-+
-+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-+ if (!res)
-+ return -ENOENT;
-+
-+ rtc7301_base = ioremap_nocache(res->start, 0x1000 /*res->end - res->start + 1*/);
-+ if (!rtc7301_base)
-+ return -EINVAL;
-+
-+ rtc = rtc_device_register(RTC_NAME, &pdev->dev,
-+ &rtc7301_rtc_ops, THIS_MODULE);
-+ if (IS_ERR(rtc)) {
-+ iounmap(rtc7301_base);
-+ return PTR_ERR(rtc);
-+ }
-+
-+ platform_set_drvdata(pdev, rtc);
-+
-+ rtc7301_init_settings();
-+ return 0;
-+}
-+
-+static int rtc7301_remove(struct platform_device *pdev)
-+{
-+ struct rtc_device *rtc = platform_get_drvdata(pdev);
-+
-+ if (rtc)
-+ rtc_device_unregister(rtc);
-+ if (rtc7301_base)
-+ iounmap(rtc7301_base);
-+ return 0;
-+}
-+
-+static struct platform_driver rtc7301_driver = {
-+ .driver = {
-+ .name = RTC_NAME,
-+ .owner = THIS_MODULE,
-+ },
-+ .probe = rtc7301_probe,
-+ .remove = rtc7301_remove,
-+};
-+
-+static __init int rtc7301_init(void)
-+{
-+ return platform_driver_register(&rtc7301_driver);
-+}
-+module_init(rtc7301_init);
-+
-+static __exit void rtc7301_exit(void)
-+{
-+ platform_driver_unregister(&rtc7301_driver);
-+}
-+module_exit(rtc7301_exit);
-+
-+MODULE_DESCRIPTION("Epson 7301 RTC driver");
-+MODULE_AUTHOR("Jose Vasconcellos <jvasco@verizon.net>");
-+MODULE_LICENSE("GPL");
-+MODULE_ALIAS("platform:" RTC_NAME);
-+MODULE_VERSION(RTC_VERSION);
+++ /dev/null
---- a/drivers/rtc/Kconfig
-+++ b/drivers/rtc/Kconfig
-@@ -610,6 +610,15 @@ config RTC_DRV_S5M
- This driver can also be built as a module. If so, the module
- will be called rtc-s5m.
-
-+config RTC_DRV_PT7C4338
-+ tristate "Pericom Technology Inc. PT7C4338 RTC"
-+ help
-+ If you say yes here you get support for the Pericom Technology
-+ Inc. PT7C4338 RTC chip.
-+
-+ This driver can also be built as a module. If so, the module
-+ will be called rtc-pt7c4338.
-+
- endif # I2C
-
- comment "SPI RTC drivers"
---- a/drivers/rtc/Makefile
-+++ b/drivers/rtc/Makefile
-@@ -118,6 +118,7 @@ obj-$(CONFIG_RTC_DRV_PL030) += rtc-pl030
- obj-$(CONFIG_RTC_DRV_PL031) += rtc-pl031.o
- obj-$(CONFIG_RTC_DRV_PM8XXX) += rtc-pm8xxx.o
- obj-$(CONFIG_RTC_DRV_PS3) += rtc-ps3.o
-+obj-$(CONFIG_RTC_DRV_PT7C4338) += rtc-pt7c4338.o
- obj-$(CONFIG_RTC_DRV_PUV3) += rtc-puv3.o
- obj-$(CONFIG_RTC_DRV_PXA) += rtc-pxa.o
- obj-$(CONFIG_RTC_DRV_R9701) += rtc-r9701.o
---- /dev/null
-+++ b/drivers/rtc/rtc-pt7c4338.c
-@@ -0,0 +1,216 @@
-+/*
-+ * Copyright 2010 Freescale Semiconductor, Inc.
-+ *
-+ * Author: Priyanka Jain <Priyanka.Jain@freescale.com>
-+ *
-+ * See file CREDITS for list of people who contributed to this
-+ * project.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of
-+ * the License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-+ * MA 02111-1307 USA
-+ */
-+
-+/*
-+ * This file provides Date & Time support (no alarms) for PT7C4338 chip.
-+ *
-+ * This file is based on drivers/rtc/rtc-ds1307.c
-+ *
-+ * PT7C4338 chip is manufactured by Pericom Technology Inc.
-+ * It is a serial real-time clock which provides
-+ * 1)Low-power clock/calendar.
-+ * 2)Programmable square-wave output.
-+ * It has 56 bytes of nonvolatile RAM.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+#include <linux/i2c.h>
-+#include <linux/rtc.h>
-+#include <linux/bcd.h>
-+
-+/* RTC register addresses */
-+#define PT7C4338_REG_SECONDS 0x00
-+#define PT7C4338_REG_MINUTES 0x01
-+#define PT7C4338_REG_HOURS 0x02
-+#define PT7C4338_REG_AMPM 0x02
-+#define PT7C4338_REG_DAY 0x03
-+#define PT7C4338_REG_DATE 0x04
-+#define PT7C4338_REG_MONTH 0x05
-+#define PT7C4338_REG_YEAR 0x06
-+#define PT7C4338_REG_CTRL_STAT 0x07
-+
-+/* RTC second register address bit */
-+#define PT7C4338_SEC_BIT_CH 0x80 /*Clock Halt (in Register 0)*/
-+
-+/* RTC control and status register bits */
-+#define PT7C4338_CTRL_STAT_BIT_RS0 0x1 /*Rate select 0*/
-+#define PT7C4338_CTRL_STAT_BIT_RS1 0x2 /*Rate select 1*/
-+#define PT7C4338_CTRL_STAT_BIT_SQWE 0x10 /*Square Wave Enable*/
-+#define PT7C4338_CTRL_STAT_BIT_OSF 0x20 /*Oscillator Stop Flag*/
-+#define PT7C4338_CTRL_STAT_BIT_OUT 0x80 /*Output Level Control*/
-+
-+static const struct i2c_device_id pt7c4338_id[] = {
-+ { "pt7c4338", 0 },
-+ { }
-+};
-+MODULE_DEVICE_TABLE(i2c, pt7c4338_id);
-+
-+struct pt7c4338{
-+ struct i2c_client *client;
-+ struct rtc_device *rtc;
-+};
-+
-+static int pt7c4338_read_time(struct device *dev, struct rtc_time *time)
-+{
-+ struct i2c_client *client = to_i2c_client(dev);
-+ int ret;
-+ u8 buf[7];
-+ u8 year, month, day, hour, minute, second;
-+ u8 week, twelve_hr, am_pm;
-+
-+ ret = i2c_smbus_read_i2c_block_data(client,
-+ PT7C4338_REG_SECONDS, 7, buf);
-+ if (ret < 0)
-+ return ret;
-+ if (ret < 7)
-+ return -EIO;
-+
-+ second = buf[0];
-+ minute = buf[1];
-+ hour = buf[2];
-+ week = buf[3];
-+ day = buf[4];
-+ month = buf[5];
-+ year = buf[6];
-+
-+ /* Extract additional information for AM/PM */
-+ twelve_hr = hour & 0x40;
-+ am_pm = hour & 0x20;
-+
-+ /* Write to rtc_time structure */
-+ time->tm_sec = bcd2bin(second & 0x7f);
-+ time->tm_min = bcd2bin(minute & 0x7f);
-+ if (twelve_hr) {
-+ /* Convert to 24 hr */
-+ if (am_pm)
-+ time->tm_hour = bcd2bin(hour & 0x10) + 12;
-+ else
-+ time->tm_hour = bcd2bin(hour & 0xBF);
-+ } else {
-+ time->tm_hour = bcd2bin(hour);
-+ }
-+
-+ time->tm_wday = bcd2bin(week & 0x07) - 1;
-+ time->tm_mday = bcd2bin(day & 0x3f);
-+ time->tm_mon = bcd2bin(month & 0x1F) - 1;
-+ /* assume 20YY not 19YY */
-+ time->tm_year = bcd2bin(year) + 100;
-+
-+ return 0;
-+}
-+
-+static int pt7c4338_set_time(struct device *dev, struct rtc_time *time)
-+{
-+ struct i2c_client *client = to_i2c_client(dev);
-+ u8 buf[7];
-+
-+ /* Extract time from rtc_time and load into pt7c4338*/
-+ buf[0] = bin2bcd(time->tm_sec);
-+ buf[1] = bin2bcd(time->tm_min);
-+ buf[2] = bin2bcd(time->tm_hour);
-+ buf[3] = bin2bcd(time->tm_wday + 1); /* Day of the week */
-+ buf[4] = bin2bcd(time->tm_mday); /* Date */
-+ buf[5] = bin2bcd(time->tm_mon + 1);
-+
-+ /* assume 20YY not 19YY */
-+ if (time->tm_year >= 100)
-+ buf[6] = bin2bcd(time->tm_year - 100);
-+ else
-+ buf[6] = bin2bcd(time->tm_year);
-+
-+ return i2c_smbus_write_i2c_block_data(client,
-+ PT7C4338_REG_SECONDS, 7, buf);
-+}
-+
-+static const struct rtc_class_ops pt7c4338_rtc_ops = {
-+ .read_time = pt7c4338_read_time,
-+ .set_time = pt7c4338_set_time,
-+};
-+
-+static int pt7c4338_probe(struct i2c_client *client,
-+ const struct i2c_device_id *id)
-+{
-+ struct pt7c4338 *pt7c4338;
-+ struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);
-+ int ret;
-+
-+ pt7c4338 = kzalloc(sizeof(struct pt7c4338), GFP_KERNEL);
-+ if (!pt7c4338)
-+ return -ENOMEM;
-+
-+ pt7c4338->client = client;
-+ i2c_set_clientdata(client, pt7c4338);
-+ pt7c4338->rtc = rtc_device_register(client->name, &client->dev,
-+ &pt7c4338_rtc_ops, THIS_MODULE);
-+ if (IS_ERR(pt7c4338->rtc)) {
-+ ret = PTR_ERR(pt7c4338->rtc);
-+ dev_err(&client->dev, "unable to register the class device\n");
-+ goto out_free;
-+ }
-+
-+ return 0;
-+out_free:
-+ i2c_set_clientdata(client, NULL);
-+ kfree(pt7c4338);
-+ return ret;
-+}
-+
-+static int pt7c4338_remove(struct i2c_client *client)
-+{
-+ struct pt7c4338 *pt7c4338 = i2c_get_clientdata(client);
-+
-+ rtc_device_unregister(pt7c4338->rtc);
-+ i2c_set_clientdata(client, NULL);
-+ kfree(pt7c4338);
-+ return 0;
-+}
-+
-+static struct i2c_driver pt7c4338_driver = {
-+ .driver = {
-+ .name = "rtc-pt7c4338",
-+ .owner = THIS_MODULE,
-+ },
-+ .probe = pt7c4338_probe,
-+ .remove = pt7c4338_remove,
-+ .id_table = pt7c4338_id,
-+};
-+
-+static int __init pt7c4338_init(void)
-+{
-+ return i2c_add_driver(&pt7c4338_driver);
-+}
-+
-+static void __exit pt7c4338_exit(void)
-+{
-+ i2c_del_driver(&pt7c4338_driver);
-+}
-+
-+module_init(pt7c4338_init);
-+module_exit(pt7c4338_exit);
-+
-+MODULE_AUTHOR("Priyanka Jain <Priyanka.Jain@freescale.com>");
-+MODULE_DESCRIPTION("pericom Technology Inc. PT7C4338 RTC Driver");
-+MODULE_LICENSE("GPL");
+++ /dev/null
---- a/lib/Kconfig.debug
-+++ b/lib/Kconfig.debug
-@@ -397,6 +397,11 @@ config MAGIC_SYSRQ_DEFAULT_ENABLE
- This may be set to 1 or 0 to enable or disable them all, or
- to a bitmask as described in Documentation/sysrq.txt.
-
-+config MAGIC_SYSRQ_SERIAL
-+ bool "Enable magic SysRq key over serial"
-+ depends on MAGIC_SYSRQ
-+ default y
-+
- config DEBUG_KERNEL
- bool "Kernel debugging"
- help
---- a/include/linux/serial_core.h
-+++ b/include/linux/serial_core.h
-@@ -448,7 +448,7 @@ extern void uart_handle_cts_change(struc
- extern void uart_insert_char(struct uart_port *port, unsigned int status,
- unsigned int overrun, unsigned int ch, unsigned int flag);
-
--#ifdef SUPPORT_SYSRQ
-+#if defined(SUPPORT_SYSRQ) && defined(CONFIG_MAGIC_SYSRQ_SERIAL)
- static inline int
- uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
- {
+++ /dev/null
---- a/lib/kobject_uevent.c
-+++ b/lib/kobject_uevent.c
-@@ -52,6 +52,18 @@ static const char *kobject_actions[] = {
- [KOBJ_OFFLINE] = "offline",
- };
-
-+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_action_type - translate action string to numeric type
- *
From: Felix Fietkau <nbd@nbd.name>
-Date: Sun, 24 Jan 2016 01:03:51 +0100
-Subject: [PATCH] MIPS: fix cache flushing for highmem pages
+Subject: MIPS: fix cache flushing for highmem pages
Most cache flush ops were no-op for highmem pages. This led to nasty
segfaults and (in the case of page_address(page) == NULL) kernel
-From 1e311820ec3055e3f08e687de6564692a7cec675 Mon Sep 17 00:00:00 2001
From: Florian Fainelli <florian@openwrt.org>
-Date: Mon, 28 Jan 2013 20:06:29 +0100
-Subject: [PATCH 11/12] USB: EHCI: add ignore_oc flag to disable overcurrent
- checking
+Subject: USB: EHCI: add ignore_oc flag to disable overcurrent checking
This patch adds an ignore_oc flag which can be set by EHCI controller
not supporting or wanting to disable overcurrent checking. The EHCI
From: Tobias Wolf <dev-NTEO@vplace.de>
-Date: Wed, 30 Nov 2016 09:16:41 +0100
-Subject: [PATCH] mm: Fix alloc_node_mem_map with ARCH_PFN_OFFSET
- calculation
-
-Dear folks,
+Subject: mm: Fix alloc_node_mem_map with ARCH_PFN_OFFSET calculation
An rt288x (ralink) based router (Belkin F5D8235 v1) does not boot with any
kernel beyond version 4.3 resulting in:
-Add the linux,spidev compatible in spidev
-Several device in ramips have this binding in the dts
+From: Giuseppe Lippolis <giu.lippolis@gmail.com>
+Subject: Add the linux,spidev compatible in spidev Several device in ramips have this binding in the dts
Signed-off-by: Giuseppe Lippolis <giu.lippolis@gmail.com>
---
+ drivers/spi/spidev.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
+index 2e05046f866b..09d03763f39b 100644
--- a/drivers/spi/spidev.c
+++ b/drivers/spi/spidev.c
@@ -696,6 +696,7 @@ static struct class *spidev_class;
{},
};
MODULE_DEVICE_TABLE(of, spidev_dt_ids);
+--
+2.11.0
+
From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 30 Dec 2016 14:53:45 +0100
-Subject: [PATCH] spi: use gpio_set_value_cansleep for setting chipselect GPIO
+Subject: spi: use gpio_set_value_cansleep for setting chipselect GPIO
Sleeping is safe inside spi_transfer_one_message, and some GPIO chips
need to sleep for setting values
--- a/drivers/spi/spi.c
+++ b/drivers/spi/spi.c
-@@ -700,7 +700,7 @@ static void spi_set_cs(struct spi_device
+@@ -698,7 +698,7 @@ static void spi_set_cs(struct spi_device
enable = !enable;
if (gpio_is_valid(spi->cs_gpio))
From: Felix Fietkau <nbd@nbd.name>
-Date: Fri, 10 Apr 2015 13:35:29 +0200
-Subject: [PATCH] jffs2: use .rename2 and add RENAME_WHITEOUT support
+Subject: jffs2: use .rename2 and add RENAME_WHITEOUT support
It is required for renames on overlayfs
From: Felix Fietkau <nbd@nbd.name>
-Date: Sat, 25 Apr 2015 12:41:32 +0200
-Subject: [PATCH] jffs2: add RENAME_EXCHANGE support
+Subject: jffs2: add RENAME_EXCHANGE support
Signed-off-by: Felix Fietkau <nbd@nbd.name>
---
-From 3e7056c3a369e9ef9ca804bc626b60ef6b62ee27 Mon Sep 17 00:00:00 2001
From: Hauke Mehrtens <hauke@hauke-m.de>
-Date: Sun, 17 May 2015 18:48:38 +0200
-Subject: [PATCH 2/3] mtd: part: add generic parsing of linux,part-probe
+Subject: mtd: part: add generic parsing of linux,part-probe
This moves the linux,part-probe device tree parsing code from
physmap_of.c to mtdpart.c. Now all drivers can use this feature by just
From: Mathias Kresin <dev@kresin.me>
-Date: Sun, 26 Mar 2017 19:05:36 +0200
Subject: MIPS: PCI: add controllers before the specified head
With commit 23dac14d058f ("MIPS: PCI: Use struct list_head lists") new
From: Felix Fietkau <nbd@nbd.name>
-Date: Wed, 30 Nov 2016 11:31:03 +0100
-Subject: [PATCH] net: phy: at803x: add support for AT8032
+Subject: net: phy: at803x: add support for AT8032
Like AT8030, this PHY needs the GPIO reset workaround
--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Subject: Upgrade to Linux 2.6.19
+
+- Includes large parts of the patch from #1021 by dpalffy
+- Includes RB532 NAND driver changes by n0-1
+
+[john@phrozen.org: feix will add this to his upstream queue]
+
+lede-commit: bff468813f78f81e36ebb2a3f4354de7365e640f
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ Makefile | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/Makefile b/Makefile
+index 598494bc9a4b..1f02ac9b571a 100644
+--- a/Makefile
++++ b/Makefile
+@@ -637,12 +637,12 @@ KBUILD_CFLAGS += $(call cc-option,-fdata-sections,)
+ endif
+
+ ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
+-KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,)
++KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,) $(EXTRA_OPTIMIZATION)
+ else
+ ifdef CONFIG_PROFILE_ALL_BRANCHES
+-KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,)
++KBUILD_CFLAGS += -O2 $(call cc-disable-warning,maybe-uninitialized,) $(EXTRA_OPTIMIZATION)
+ else
+-KBUILD_CFLAGS += -O2
++KBUILD_CFLAGS += -O2 -fno-reorder-blocks -fno-tree-ch $(EXTRA_OPTIMIZATION)
+ endif
+ endif
+
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: add a config option for keeping the kallsyms table uncompressed, saving ~9kb kernel size after lzma on ar71xx
+
+[john@phrozen.org: added to my upstream queue 30.12.2016]
+lede-commit: e0e3509b5ce2ccf93d4d67ea907613f5f7ec2eed
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ init/Kconfig | 11 +++++++++++
+ kernel/kallsyms.c | 8 ++++++++
+ scripts/kallsyms.c | 12 ++++++++++++
+ scripts/link-vmlinux.sh | 4 ++++
+ 4 files changed, 35 insertions(+)
+
+diff --git a/init/Kconfig b/init/Kconfig
+index 34407f15e6d3..9063c81b9665 100644
+--- a/init/Kconfig
++++ b/init/Kconfig
+@@ -1370,6 +1370,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
+ the unaligned access emulation.
+ see arch/parisc/kernel/unaligned.c for reference
+
++config KALLSYMS_UNCOMPRESSED
++ bool "Keep kallsyms uncompressed"
++ depends on KALLSYMS
++ help
++ Normally kallsyms contains compressed symbols (using a token table),
++ reducing the uncompressed kernel image size. Keeping the symbol table
++ uncompressed significantly improves the size of this part in compressed
++ kernel images.
++
++ Say N unless you need compressed kernel images to be small.
++
+ config HAVE_PCSPKR_PLATFORM
+ bool
+
+diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c
+index fafd1a3ef0da..abe49579212f 100644
+--- a/kernel/kallsyms.c
++++ b/kernel/kallsyms.c
+@@ -113,6 +113,11 @@ static unsigned int kallsyms_expand_symbol(unsigned int off,
+ * For every byte on the compressed symbol data, copy the table
+ * entry for that byte.
+ */
++#ifdef CONFIG_KALLSYMS_UNCOMPRESSED
++ memcpy(result, data + 1, len - 1);
++ result += len - 1;
++ len = 0;
++#endif
+ while (len) {
+ tptr = &kallsyms_token_table[kallsyms_token_index[*data]];
+ data++;
+@@ -145,6 +150,9 @@ static unsigned int kallsyms_expand_symbol(unsigned int off,
+ */
+ static char kallsyms_get_symbol_type(unsigned int off)
+ {
++#ifdef CONFIG_KALLSYMS_UNCOMPRESSED
++ return kallsyms_names[off + 1];
++#endif
+ /*
+ * Get just the first code, look it up in the token table,
+ * and return the first char from this token.
+diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c
+index 1f22a186c18c..e7f0f19e39a9 100644
--- a/scripts/kallsyms.c
+++ b/scripts/kallsyms.c
-@@ -61,6 +61,7 @@ static struct addr_range percpu_range =
+@@ -61,6 +61,7 @@ static struct addr_range percpu_range = {
static struct sym_entry *table;
static unsigned int table_size, table_cnt;
static int all_symbols = 0;
output_label("kallsyms_token_table");
off = 0;
for (i = 0; i < 256; i++) {
-@@ -504,6 +508,9 @@ static void *find_token(unsigned char *s
+@@ -504,6 +508,9 @@ static void *find_token(unsigned char *str, int len, unsigned char *token)
{
int i;
else
usage();
}
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -1370,6 +1370,17 @@ config SYSCTL_ARCH_UNALIGN_ALLOW
- the unaligned access emulation.
- see arch/parisc/kernel/unaligned.c for reference
-
-+config KALLSYMS_UNCOMPRESSED
-+ bool "Keep kallsyms uncompressed"
-+ depends on KALLSYMS
-+ help
-+ Normally kallsyms contains compressed symbols (using a token table),
-+ reducing the uncompressed kernel image size. Keeping the symbol table
-+ uncompressed significantly improves the size of this part in compressed
-+ kernel images.
-+
-+ Say N unless you need compressed kernel images to be small.
-+
- config HAVE_PCSPKR_PLATFORM
- bool
-
+diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
+index f742c65108b9..6aabf1d71bb6 100755
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
@@ -136,6 +136,10 @@ kallsyms()
local aflags="${KBUILD_AFLAGS} ${KBUILD_AFLAGS_KERNEL} \
${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS}"
---- a/kernel/kallsyms.c
-+++ b/kernel/kallsyms.c
-@@ -113,6 +113,11 @@ static unsigned int kallsyms_expand_symb
- * For every byte on the compressed symbol data, copy the table
- * entry for that byte.
- */
-+#ifdef CONFIG_KALLSYMS_UNCOMPRESSED
-+ memcpy(result, data + 1, len - 1);
-+ result += len - 1;
-+ len = 0;
-+#endif
- while (len) {
- tptr = &kallsyms_token_table[kallsyms_token_index[*data]];
- data++;
-@@ -145,6 +150,9 @@ tail:
- */
- static char kallsyms_get_symbol_type(unsigned int off)
- {
-+#ifdef CONFIG_KALLSYMS_UNCOMPRESSED
-+ return kallsyms_names[off + 1];
-+#endif
- /*
- * Get just the first code, look it up in the token table,
- * and return the first char from this token.
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: when KALLSYMS is disabled, print module address + size for matching backtrace entries
+
+[john@phrozen.org: felix will add this to his upstream queue]
+
+lede-commit 53827cdc824556cda910b23ce5030c363b8f1461
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ lib/vsprintf.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/lib/vsprintf.c b/lib/vsprintf.c
+index 0967771d8f7f..5d27eae49198 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
-@@ -669,8 +669,10 @@ char *symbol_string(char *buf, char *end
+@@ -669,8 +669,10 @@ char *symbol_string(char *buf, char *end, void *ptr,
struct printf_spec spec, const char *fmt)
{
unsigned long value;
#endif
if (fmt[1] == 'R')
-@@ -684,11 +686,16 @@ char *symbol_string(char *buf, char *end
+@@ -684,11 +686,16 @@ char *symbol_string(char *buf, char *end, void *ptr,
sprint_symbol(sym, value);
else
sprint_symbol_no_offset(sym, value);
}
static noinline_for_stack
+--
+2.11.0
+
-Disable MIPS VDSO until the cache issues have been sorted out.
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: disable MIPS VDSO by default until the cache issues have been resolved
+lede-commit: 1185e645a773c86aa88cf04d0e2911dc62eb43f5
Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/mips/vdso/Makefile | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+diff --git a/arch/mips/vdso/Makefile b/arch/mips/vdso/Makefile
+index c3dc12a8b7d9..28f66e3bb2c3 100644
--- a/arch/mips/vdso/Makefile
+++ b/arch/mips/vdso/Makefile
@@ -28,9 +28,9 @@ aflags-vdso := $(ccflags-vdso) \
endif
# VDSO linker flags.
+--
+2.11.0
+
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: usr: sanitize deps_initramfs list
+
+If any filename in the intramfs dependency
+list contains a colon, that causes a kernel
+build error like this:
+
+/devel/openwrt/build_dir/linux-ar71xx_generic/linux-3.6.6/usr/Makefile:58: *** multiple target patterns. Stop.
+make[5]: *** [usr] Error 2
+
+Fix it by removing such filenames from the
+deps_initramfs list.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ usr/Makefile | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+diff --git a/usr/Makefile b/usr/Makefile
+index e767f019accf..17328d3c11cc 100644
--- a/usr/Makefile
+++ b/usr/Makefile
-@@ -53,6 +53,8 @@ ifneq ($(wildcard $(obj)/.initramfs_data
+@@ -53,6 +53,8 @@ ifneq ($(wildcard $(obj)/.initramfs_data.cpio.d),)
include $(obj)/.initramfs_data.cpio.d
endif
quiet_cmd_initfs = GEN $@
cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input)
-@@ -61,14 +63,14 @@ targets := initramfs_data.cpio.gz initra
+@@ -61,14 +63,14 @@ targets := initramfs_data.cpio.gz initramfs_data.cpio.bz2 \
initramfs_data.cpio.lzo initramfs_data.cpio.lz4 \
initramfs_data.cpio
# do not try to update files included in initramfs
+$(obj)/initramfs_data.cpio$(suffix_y): $(obj)/gen_init_cpio $(deps_initramfs_sane) klibcdirs
$(Q)$(initramfs) -l $(ramfs-input) > $(obj)/.initramfs_data.cpio.d
$(call if_changed,initfs)
+--
+2.11.0
+
--- /dev/null
+From: Imre Kaloz <kaloz@openwrt.org>
+Subject: [PATCH] hack: net: wireless: make the wl12xx glue code available with
+ compat-wireless, too
+
+Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
+---
+ drivers/net/wireless/ti/Kconfig | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/wireless/ti/Kconfig b/drivers/net/wireless/ti/Kconfig
+index 92fbd6597e34..3b1f951cacf7 100644
+--- a/drivers/net/wireless/ti/Kconfig
++++ b/drivers/net/wireless/ti/Kconfig
+@@ -19,7 +19,7 @@ source "drivers/net/wireless/ti/wlcore/Kconfig"
+
+ config WILINK_PLATFORM_DATA
+ bool "TI WiLink platform data"
+- depends on WLCORE_SDIO || WL1251_SDIO
++ depends on WLCORE_SDIO || WL1251_SDIO || ARCH_OMAP2PLUS
+ default y
+ ---help---
+ Small platform data bit needed to pass data to the sdio modules.
+--
+2.11.0
+
-From 8b05e325824d3b38e52a7748b3b5dc34dc1c0f6d Mon Sep 17 00:00:00 2001
From: David Heidelberger <david.heidelberger@ixit.cz>
-Date: Mon, 29 Jun 2015 14:37:54 +0200
-Subject: [PATCH 1/3] uapi/kernel.h: glibc specific inclusion of sysinfo.h
+Subject: uapi/kernel.h: glibc specific inclusion of sysinfo.h
including sysinfo.h from kernel.h makes no sense whatsoever,
but removing it breaks glibc's userspace header,
-From f972afc2509eebcb00d370256c55b112a3b5ffca Mon Sep 17 00:00:00 2001
From: David Heidelberger <david.heidelberger@ixit.cz>
-Date: Mon, 29 Jun 2015 16:50:40 +0200
-Subject: [PATCH 2/3] uapi/libc-compat.h: do not rely on __GLIBC__
+Subject: uapi/libc-compat.h: do not rely on __GLIBC__
Musl provides the same structs as glibc, but does not provide a define to
allow its detection. Since the absence of __GLIBC__ also can mean that it
-From fcbb6fed85ea9ff4feb4f1ebd4f0f235fdaf06b6 Mon Sep 17 00:00:00 2001
From: David Heidelberger <david.heidelberger@ixit.cz>
-Date: Mon, 29 Jun 2015 16:53:03 +0200
-Subject: [PATCH 3/3] uapi/if_ether.h: prevent redefinition of struct ethhdr
+Subject: uapi/if_ether.h: prevent redefinition of struct ethhdr
Musl provides its own ethhdr struct definition. Add a guard to prevent
its definition of the appropriate musl header has already been included.
From: Mark Miller <mark@mirell.org>
+Subject: mips: expose CONFIG_BOOT_RAW
This exposes the CONFIG_BOOT_RAW symbol in Kconfig. This is needed on
certain Broadcom chipsets running CFE in order to load the kernel.
--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Subject: mips: use -mno-branch-likely for kernel and userspace
+
+saves ~11k kernel size after lzma and ~12k squashfs size in the
+
+lede-commit: 41a039f46450ffae9483d6216422098669da2900
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/mips/Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/mips/Makefile b/arch/mips/Makefile
+index 1a6bac7b076f..5b656d9a1bbe 100644
+--- a/arch/mips/Makefile
++++ b/arch/mips/Makefile
+@@ -90,7 +90,7 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlinuz
+ # machines may also. Since BFD is incredibly buggy with respect to
+ # crossformat linking we rely on the elf2ecoff tool for format conversion.
+ #
+-cflags-y += -G 0 -mno-abicalls -fno-pic -pipe
++cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely
+ cflags-y += -msoft-float
+ LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
+ KBUILD_AFLAGS_MODULE += -mlong-calls
+--
+2.11.0
+
From: Manuel Lauss <manuel.lauss@gmail.com>
Subject: [RFC PATCH v4 2/2] MIPS: make FPU emulator optional
-Date: Mon, 7 Apr 2014 12:57:04 +0200
-Message-Id: <1396868224-252888-2-git-send-email-manuel.lauss@gmail.com>
This small patch makes the MIPS FPU emulator optional. The kernel
kills float-users on systems without a hardware FPU by sending a SIGILL.
+From: Felix Fietkau <nbd@nbd.name>
+Subject: mips: replace -mlong-calls with -mno-long-calls to make function calls faster in kernel modules to achieve this, try to
+
+lede-commit: 3b3d64743ba2a874df9d70cd19e242205b0a788c
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/mips/Makefile | 5 +
+ arch/mips/include/asm/module.h | 5 +
+ arch/mips/kernel/module.c | 279 ++++++++++++++++++++++++++++++++++++++++-
+ 3 files changed, 284 insertions(+), 5 deletions(-)
+
+diff --git a/arch/mips/Makefile b/arch/mips/Makefile
+index 48dc1a9c3e42..77bf5db20d65 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
-@@ -93,8 +93,13 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
+@@ -93,8 +93,13 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlinuz
cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely
cflags-y += -msoft-float
LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
ifeq ($(CONFIG_RELOCATABLE),y)
LDFLAGS_vmlinux += --emit-relocs
+diff --git a/arch/mips/include/asm/module.h b/arch/mips/include/asm/module.h
+index 702c273e67a9..1d4f3b37cefe 100644
--- a/arch/mips/include/asm/module.h
+++ b/arch/mips/include/asm/module.h
@@ -11,6 +11,11 @@ struct mod_arch_specific {
};
typedef uint8_t Elf64_Byte; /* Type for a 8-bit quantity. */
+diff --git a/arch/mips/kernel/module.c b/arch/mips/kernel/module.c
+index 94627a3a6a0d..947981a9aa72 100644
--- a/arch/mips/kernel/module.c
+++ b/arch/mips/kernel/module.c
@@ -44,14 +44,221 @@ struct mips_hi16 {
int apply_r_mips_none(struct module *me, u32 *location, Elf_Addr v)
{
-@@ -65,8 +272,39 @@ static int apply_r_mips_32_rel(struct mo
+@@ -65,8 +272,39 @@ static int apply_r_mips_32_rel(struct module *me, u32 *location, Elf_Addr v)
return 0;
}
if (v % 4) {
pr_err("module %s: dangerous R_MIPS_26 REL relocation\n",
me->name);
-@@ -74,13 +312,17 @@ static int apply_r_mips_26_rel(struct mo
+@@ -74,13 +312,17 @@ static int apply_r_mips_26_rel(struct module *me, u32 *location, Elf_Addr v)
}
if ((v & 0xf0000000) != (((unsigned long)location + 4) & 0xf0000000)) {
void module_arch_cleanup(struct module *mod)
{
spin_lock_irq(&dbe_lock);
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: [PATCH] mips: allow the compiler to optimize memset, memcmp, memcpy for better performance and (in some instances) smaller code
+
+lede-commit: 07e59c7bc7f375f792ec9734be42fe4fa391a8bb
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/mips/boot/compressed/Makefile | 3 ++-
+ arch/mips/include/asm/string.h | 38 ++++++++++++++++++++++++++++++++++++++
+ arch/mips/lib/Makefile | 2 +-
+ arch/mips/lib/memcmp.c | 22 ++++++++++++++++++++++
+ 4 files changed, 63 insertions(+), 2 deletions(-)
+ create mode 100644 arch/mips/lib/memcmp.c
+
+diff --git a/arch/mips/boot/compressed/Makefile b/arch/mips/boot/compressed/Makefile
+index 90aca95fe314..3cd3b391ef49 100644
+--- a/arch/mips/boot/compressed/Makefile
++++ b/arch/mips/boot/compressed/Makefile
+@@ -23,7 +23,8 @@ KBUILD_CFLAGS := $(shell echo $(KBUILD_CFLAGS) | sed -e "s/-pg//")
+ KBUILD_CFLAGS := $(filter-out -fstack-protector, $(KBUILD_CFLAGS))
+
+ KBUILD_CFLAGS := $(LINUXINCLUDE) $(KBUILD_CFLAGS) -D__KERNEL__ \
+- -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) -D"VMLINUX_LOAD_ADDRESS_ULL=$(VMLINUX_LOAD_ADDRESS)ull"
++ -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) -D"VMLINUX_LOAD_ADDRESS_ULL=$(VMLINUX_LOAD_ADDRESS)ull" \
++ -D__ZBOOT__
+
+ KBUILD_AFLAGS := $(LINUXINCLUDE) $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
+ -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) \
+diff --git a/arch/mips/include/asm/string.h b/arch/mips/include/asm/string.h
+index 29030cb398ee..7b737f9b6d58 100644
--- a/arch/mips/include/asm/string.h
+++ b/arch/mips/include/asm/string.h
-@@ -140,4 +140,42 @@ extern void *memcpy(void *__to, __const_
+@@ -140,4 +140,42 @@ extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
#define __HAVE_ARCH_MEMMOVE
extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
+#endif
+
#endif /* _ASM_STRING_H */
+diff --git a/arch/mips/lib/Makefile b/arch/mips/lib/Makefile
+index 0344e575f522..33a0211e954a 100644
--- a/arch/mips/lib/Makefile
+++ b/arch/mips/lib/Makefile
@@ -4,7 +4,7 @@
obj-y += iomap.o
obj-$(CONFIG_PCI) += iomap-pci.o
+diff --git a/arch/mips/lib/memcmp.c b/arch/mips/lib/memcmp.c
+new file mode 100644
+index 000000000000..35ef1646286e
--- /dev/null
+++ b/arch/mips/lib/memcmp.c
@@ -0,0 +1,22 @@
+}
+EXPORT_SYMBOL(memcmp);
+
---- a/arch/mips/boot/compressed/Makefile
-+++ b/arch/mips/boot/compressed/Makefile
-@@ -23,7 +23,8 @@ KBUILD_CFLAGS := $(shell echo $(KBUILD_C
- KBUILD_CFLAGS := $(filter-out -fstack-protector, $(KBUILD_CFLAGS))
-
- KBUILD_CFLAGS := $(LINUXINCLUDE) $(KBUILD_CFLAGS) -D__KERNEL__ \
-- -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) -D"VMLINUX_LOAD_ADDRESS_ULL=$(VMLINUX_LOAD_ADDRESS)ull"
-+ -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) -D"VMLINUX_LOAD_ADDRESS_ULL=$(VMLINUX_LOAD_ADDRESS)ull" \
-+ -D__ZBOOT__
-
- KBUILD_AFLAGS := $(LINUXINCLUDE) $(KBUILD_AFLAGS) -D__ASSEMBLY__ \
- -DBOOT_HEAP_SIZE=$(BOOT_HEAP_SIZE) \
+--
+2.11.0
+
--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: adjust mips highmem offset to avoid the need for -mlong-calls on systems with >256M RAM
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/mips/include/asm/mach-generic/spaces.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/mips/include/asm/mach-generic/spaces.h b/arch/mips/include/asm/mach-generic/spaces.h
+index 952b0fdfda0e..fbb4e4cd4537 100644
+--- a/arch/mips/include/asm/mach-generic/spaces.h
++++ b/arch/mips/include/asm/mach-generic/spaces.h
+@@ -46,7 +46,7 @@
+ * Memory above this physical address will be considered highmem.
+ */
+ #ifndef HIGHMEM_START
+-#define HIGHMEM_START _AC(0x20000000, UL)
++#define HIGHMEM_START _AC(0x10000000, UL)
+ #endif
+
+ #endif /* CONFIG_32BIT */
+--
+2.11.0
+
-Add -mtune=34kc to MIPS CFLAGS when building for mips32r2
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: add -mtune=34kc to MIPS CFLAGS when building for mips32r2
+
This provides a good tradeoff across at least 24Kc-74Kc, while also
producing smaller code.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/mips/Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+diff --git a/arch/mips/Makefile b/arch/mips/Makefile
+index 77bf5db20d65..1ac83e281f90 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
-@@ -148,7 +148,7 @@ cflags-$(CONFIG_CPU_R4X00) += -march=r46
+@@ -148,7 +148,7 @@ cflags-$(CONFIG_CPU_R4X00) += -march=r4600 -Wa,--trap
cflags-$(CONFIG_CPU_TX49XX) += -march=r4600 -Wa,--trap
cflags-$(CONFIG_CPU_MIPS32_R1) += $(call cc-option,-march=mips32,-mips32 -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS32) \
-Wa,-mips32 -Wa,--trap
-Wa,-mips32r2 -Wa,--trap
cflags-$(CONFIG_CPU_MIPS32_R6) += -march=mips32r6 -Wa,--trap
cflags-$(CONFIG_CPU_MIPS64_R1) += $(call cc-option,-march=mips64,-mips64 -U_MIPS_ISA -D_MIPS_ISA=_MIPS_ISA_MIPS64) \
+--
+2.11.0
+
--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Subject: fix errors in unresolved weak symbols on arm
+
+lede-commit: 570699d4838a907c3ef9f2819bf19eb72997b32f
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ arch/arm/kernel/module.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/arch/arm/kernel/module.c b/arch/arm/kernel/module.c
+index 4f14b5ce6535..4b4b0461663f 100644
+--- a/arch/arm/kernel/module.c
++++ b/arch/arm/kernel/module.c
+@@ -88,6 +88,10 @@ apply_relocate(Elf32_Shdr *sechdrs, const char *strtab, unsigned int symindex,
+ return -ENOEXEC;
+ }
+
++ if ((IS_ERR_VALUE(sym->st_value) || !sym->st_value) &&
++ ELF_ST_BIND(sym->st_info) == STB_WEAK)
++ continue;
++
+ loc = dstsec->sh_addr + rel->r_offset;
+
+ switch (ELF32_R_TYPE(rel->r_info)) {
+--
+2.11.0
+
-From d8582dcf1ed66eee88a11e4760f42c0d6c8822be Mon Sep 17 00:00:00 2001
From: Yousong Zhou <yszhou4tech@gmail.com>
-Date: Sat, 31 Jan 2015 22:26:03 +0800
-Subject: [PATCH 331/331] MIPS: kexec: Accept command line parameters from
- userspace.
+Subject: MIPS: kexec: Accept command line parameters from userspace.
Signed-off-by: Yousong Zhou <yszhou4tech@gmail.com>
---
-From 690e7f2cad271595ff68cace1c45fb10779bde41 Mon Sep 17 00:00:00 2001
From: Alexey Brodkin <abrodkin@synopsys.com>
-Date: Fri, 15 Jan 2016 00:34:01 +0300
-Subject: [PATCH 2/2] openwrt: arc - add OWRTDTB section
+Subject: openwrt: arc - add OWRTDTB section
This change allows OpenWRT to patch resulting kernel binary with
external .dtb.
-From af737b55fc7c61f17da9ae89fba536e0a9338e98 Mon Sep 17 00:00:00 2001
From: Alexey Brodkin <abrodkin@synopsys.com>
-Date: Mon, 14 Mar 2016 17:26:34 +0300
-Subject: [PATCH] arc: enable unaligned access in kernel mode
+Subject: arc: enable unaligned access in kernel mode
This enables misaligned access handling even in kernel mode.
Some wireless drivers (ath9k-htc and mt7601u) use misaligned accesses
+From: Felix Fietkau <nbd@nbd.name>
+Subject: make rootfs split/detection more generic - patch can be moved to generic-2.6 after testing on other platforms
+
+lede-commit: 328e660b31f0937d52c5ae3d6e7029409918a9df
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/mtd/Kconfig | 17 +++++++++++++++++
+ drivers/mtd/mtdpart.c | 35 +++++++++++++++++++++++++++++++++++
+ include/linux/mtd/partitions.h | 2 ++
+ 3 files changed, 54 insertions(+)
+
+diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
+index 5a2d71729b9a..f5ac04e288eb 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -12,6 +12,23 @@ menuconfig MTD
config MTD_TESTS
tristate "MTD tests support (DANGEROUS)"
depends on m
+diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
+index dd86b430e46e..33d152d1876a 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -29,10 +29,12 @@
/*
* Given a pointer to the MTD object in the mtd_part structure, we can retrieve
* the pointer to that structure.
-@@ -678,6 +682,7 @@ int mtd_add_partition(struct mtd_info *p
+@@ -678,6 +682,7 @@ int mtd_add_partition(struct mtd_info *parent, const char *name,
mutex_unlock(&mtd_partitions_mutex);
add_mtd_device(&new->mtd);
mtd_add_partition_attrs(new);
-@@ -756,6 +761,35 @@ int mtd_del_partition(struct mtd_info *m
+@@ -756,6 +761,35 @@ int mtd_del_partition(struct mtd_info *mtd, int partno)
}
EXPORT_SYMBOL_GPL(mtd_del_partition);
/*
* This function, given a master MTD object and a partition table, creates
* and registers slave MTD objects which are bound to the master according to
-@@ -787,6 +821,7 @@ int add_mtd_partitions(struct mtd_info *
+@@ -787,6 +821,7 @@ int add_mtd_partitions(struct mtd_info *master,
mutex_unlock(&mtd_partitions_mutex);
add_mtd_device(&slave->mtd);
mtd_add_partition_attrs(slave);
if (parts[i].types)
mtd_parse_part(slave, parts[i].types);
+diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h
+index c4beb70dacbd..320a791290c5 100644
--- a/include/linux/mtd/partitions.h
+++ b/include/linux/mtd/partitions.h
-@@ -109,5 +109,7 @@ int mtd_add_partition(struct mtd_info *m
+@@ -109,5 +109,7 @@ int mtd_add_partition(struct mtd_info *master, const char *name,
long long offset, long long length);
int mtd_del_partition(struct mtd_info *master, int partno);
uint64_t mtd_get_device_size(const struct mtd_info *mtd);
+ const char *name, int offset, int size);
#endif
+--
+2.11.0
+
-From 02cff0ccaa6d364f5c1eeea83f47ac80ccc967d4 Mon Sep 17 00:00:00 2001
From: Gabor Juhos <juhosg@openwrt.org>
-Date: Tue, 3 Sep 2013 18:11:50 +0200
-Subject: [PATCH] mtd: add support for different partition parser types
+Subject: mtd: add support for different partition parser types
Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
---
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: kernel/3.10: allow to use partition parsers for rootfs and firmware split
+
+lede-commit: 3b71cd94bc9517bc25267dccb393b07d4b54564e
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/mtd/mtdpart.c | 37 +++++++++++++++++++++++++++++++++++++
+ include/linux/mtd/partitions.h | 2 ++
+ 2 files changed, 39 insertions(+)
+
+diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
+index f20207e32075..28f76315dfa0 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -761,6 +761,36 @@ int mtd_del_partition(struct mtd_info *m
+@@ -761,6 +761,36 @@ int mtd_del_partition(struct mtd_info *mtd, int partno)
}
EXPORT_SYMBOL_GPL(mtd_del_partition);
}
void __weak arch_split_mtd_part(struct mtd_info *master, const char *name,
-@@ -783,6 +814,12 @@ static void mtd_partition_split(struct m
+@@ -783,6 +814,12 @@ static void mtd_partition_split(struct mtd_info *master, struct mtd_part *part)
if (rootfs_found)
return;
if (!strcmp(part->mtd.name, SPLIT_FIRMWARE_NAME) &&
IS_ENABLED(CONFIG_MTD_SPLIT_FIRMWARE))
split_firmware(master, part);
+diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h
+index baafd542432e..356e29815aa2 100644
--- a/include/linux/mtd/partitions.h
+++ b/include/linux/mtd/partitions.h
@@ -74,6 +74,8 @@ struct mtd_part_parser_data {
};
struct mtd_part_parser {
+--
+2.11.0
+
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: [PATCH] kernel/3.10: move squashfs check from rootfs split code into a separate file
+
+lede-commit: d89bea92b31b4e157a0fa438e75370f089f73427
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/mtd/Kconfig | 2 ++
+ drivers/mtd/Makefile | 2 ++
+ 2 files changed, 4 insertions(+)
+
+diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
+index f5ac04e288eb..4185e04760dd 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -27,6 +27,8 @@ config MTD_SPLIT_FIRMWARE_NAME
endmenu
config MTD_TESTS
+diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
+index 151d60df303a..48fd01e9f6e3 100644
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
@@ -6,6 +6,8 @@
obj-$(CONFIG_MTD_OF_PARTS) += ofpart.o
obj-$(CONFIG_MTD_REDBOOT_PARTS) += redboot.o
obj-$(CONFIG_MTD_CMDLINE_PARTS) += cmdlinepart.o
+--
+2.11.0
+
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: kernel/3.10: add separate rootfs partition parser
+
+lede-commit: daec7ad7688415156e2730e401503d09bd3acf91
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/mtd/mtdpart.c | 29 +++++++++++++++++++++++++++++
+ include/linux/mtd/mtd.h | 18 ++++++++++++++++++
+ include/linux/mtd/partitions.h | 2 ++
+ 3 files changed, 49 insertions(+)
+
+diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
+index 28f76315dfa0..fce83882fd4e 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
-@@ -791,6 +791,17 @@ run_parsers_by_type(struct mtd_part *sla
+@@ -791,6 +791,17 @@ run_parsers_by_type(struct mtd_part *slave, enum mtd_parser_type type)
return nr_parts;
}
#ifdef CONFIG_MTD_SPLIT_FIRMWARE_NAME
#define SPLIT_FIRMWARE_NAME CONFIG_MTD_SPLIT_FIRMWARE_NAME
#else
-@@ -1146,6 +1157,24 @@ int mtd_is_partition(const struct mtd_in
+@@ -1146,6 +1157,24 @@ int mtd_is_partition(const struct mtd_info *mtd)
}
EXPORT_SYMBOL_GPL(mtd_is_partition);
/* Returns the size of the entire flash chip */
uint64_t mtd_get_device_size(const struct mtd_info *mtd)
{
---- a/include/linux/mtd/partitions.h
-+++ b/include/linux/mtd/partitions.h
-@@ -114,6 +114,8 @@ int mtd_is_partition(const struct mtd_in
- int mtd_add_partition(struct mtd_info *master, const char *name,
- long long offset, long long length);
- int mtd_del_partition(struct mtd_info *master, int partno);
-+struct mtd_info *mtdpart_get_master(const struct mtd_info *mtd);
-+uint64_t mtdpart_get_offset(const struct mtd_info *mtd);
- uint64_t mtd_get_device_size(const struct mtd_info *mtd);
- extern void __weak arch_split_mtd_part(struct mtd_info *master,
- const char *name, int offset, int size);
+diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
+index 5bb42c6dacdc..e7d5091bb447 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
-@@ -485,6 +485,24 @@ static inline uint32_t mtd_mod_by_eb(uin
+@@ -485,6 +485,24 @@ static inline uint32_t mtd_mod_by_eb(uint64_t sz, struct mtd_info *mtd)
return do_div(sz, mtd->erasesize);
}
static inline uint32_t mtd_div_by_ws(uint64_t sz, struct mtd_info *mtd)
{
if (mtd->writesize_shift)
+diff --git a/include/linux/mtd/partitions.h b/include/linux/mtd/partitions.h
+index 356e29815aa2..c0937ff4797b 100644
+--- a/include/linux/mtd/partitions.h
++++ b/include/linux/mtd/partitions.h
+@@ -114,6 +114,8 @@ int mtd_is_partition(const struct mtd_info *mtd);
+ int mtd_add_partition(struct mtd_info *master, const char *name,
+ long long offset, long long length);
+ int mtd_del_partition(struct mtd_info *master, int partno);
++struct mtd_info *mtdpart_get_master(const struct mtd_info *mtd);
++uint64_t mtdpart_get_offset(const struct mtd_info *mtd);
+ uint64_t mtd_get_device_size(const struct mtd_info *mtd);
+ extern void __weak arch_split_mtd_part(struct mtd_info *master,
+ const char *name, int offset, int size);
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: mtd: implement write support for partitions covering only a part of an eraseblock (buffer data that would otherwise be erased)
+
+lede-commit: 87a8e8ac1067f58ba831c4aae443f3655c31cd80
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/mtd/mtdpart.c | 90 ++++++++++++++++++++++++++++++++++++++++++++-----
+ include/linux/mtd/mtd.h | 4 +++
+ 2 files changed, 85 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
+index fce83882fd4e..0238b0babe2f 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -36,6 +36,8 @@
/* Our partition linked list */
static LIST_HEAD(mtd_partitions);
static DEFINE_MUTEX(mtd_partitions_mutex);
-@@ -241,13 +243,61 @@ static int part_erase(struct mtd_info *m
+@@ -241,13 +243,61 @@ static int part_erase(struct mtd_info *mtd, struct erase_info *instr)
struct mtd_part *part = mtd_to_part(mtd);
int ret;
return ret;
}
-@@ -255,6 +305,25 @@ void mtd_erase_callback(struct erase_inf
+@@ -255,6 +305,25 @@ void mtd_erase_callback(struct erase_info *instr)
{
if (instr->mtd->_erase == part_erase) {
struct mtd_part *part = mtd_to_part(instr->mtd);
if (instr->fail_addr != MTD_FAIL_ADDR_UNKNOWN)
instr->fail_addr -= part->offset;
-@@ -590,19 +659,22 @@ static struct mtd_part *allocate_partiti
+@@ -590,19 +659,22 @@ static struct mtd_part *allocate_partition(struct mtd_info *parent,
remainder = do_div(tmp, wr_alignment);
if ((slave->mtd.flags & MTD_WRITEABLE) && remainder) {
/* Doesn't start on a boundary of major erase size */
}
mtd_set_ooblayout(&slave->mtd, &part_ooblayout_ops);
+diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
+index e7d5091bb447..0db85491f085 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -55,6 +55,10 @@ struct erase_info {
};
struct mtd_erase_region_info {
+--
+2.11.0
+
--- /dev/null
+From: Tim Harvey <tharvey@gateworks.com>
+Subject: mtd: allow partial block unlock
+
+This allows sysupgrade for devices such as the Gateworks Avila/Cambria
+product families based on the ixp4xx using the redboot bootloader with
+combined FIS directory and RedBoot config partitions on larger FLASH
+devices with larger eraseblocks.
+
+This second iteration of this patch addresses previous issues:
+- whitespace breakage fixed
+- unlock in all scenarios
+- simplification and fix logic bug
+
+[john@phrozen.org: this should be moved to the ixp4xx folder]
+
+Signed-off-by: Tim Harvey <tharvey@gateworks.com>
+---
+ drivers/mtd/mtdpart.c | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
+index 0238b0babe2f..d41418524833 100644
+--- a/drivers/mtd/mtdpart.c
++++ b/drivers/mtd/mtdpart.c
+@@ -343,7 +343,16 @@ static int part_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
+ static int part_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
+ {
+ struct mtd_part *part = mtd_to_part(mtd);
+- return part->parent->_unlock(part->parent, ofs + part->offset, len);
++
++ ofs += part->offset;
++
++ if (mtd->flags & MTD_ERASE_PARTIAL) {
++ /* round up len to next erasesize and round down offset to prev block */
++ len = (mtd_div_by_eb(len, part->parent) + 1) * part->parent->erasesize;
++ ofs &= ~(part->parent->erasesize - 1);
++ }
++
++ return part->parent->_unlock(part->parent, ofs, len);
+ }
+
+ static int part_is_locked(struct mtd_info *mtd, loff_t ofs, uint64_t len)
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: add patch for including unpartitioned space in the rootfs partition for redboot devices (if applicable)
+
+[john@phrozen.org: used by ixp and others]
+
+lede-commit: 394918851f84e4d00fa16eb900e7700e95091f00
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/mtd/redboot.c | 19 +++++++++++++------
+ 1 file changed, 13 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/mtd/redboot.c b/drivers/mtd/redboot.c
+index 7623ac5fc586..181ea0fb3c91 100644
--- a/drivers/mtd/redboot.c
+++ b/drivers/mtd/redboot.c
-@@ -265,14 +265,21 @@ static int parse_redboot_partitions(stru
+@@ -265,14 +265,21 @@ static int parse_redboot_partitions(struct mtd_info *master,
#endif
names += strlen(names)+1;
tmp_fl = fl;
fl = fl->next;
kfree(tmp_fl);
+--
+2.11.0
+
+From: Florian Fainelli <f.fainelli@gmail.com>
+Subject: Add myloader partition table parser
+
+[john@phozen.org: shoud be upstreamable]
+
+lede-commit: d8bf22859b51faa09d22c056fe221a45d2f7a3b8
+Signed-off-by: Florian Fainelli <f.fainelli@gmail.com>
+---
+ drivers/mtd/Kconfig | 16 ++++++++++++++++
+ drivers/mtd/Makefile | 1 +
+ 2 files changed, 17 insertions(+)
+
+diff --git a/drivers/mtd/Kconfig b/drivers/mtd/Kconfig
+index 4185e04760dd..cb55144d4db6 100644
--- a/drivers/mtd/Kconfig
+++ b/drivers/mtd/Kconfig
@@ -178,6 +178,22 @@ menu "Partition parsers"
comment "User Modules And Translation Layers"
#
+diff --git a/drivers/mtd/Makefile b/drivers/mtd/Makefile
+index 48fd01e9f6e3..5bca69c63bdc 100644
--- a/drivers/mtd/Makefile
+++ b/drivers/mtd/Makefile
@@ -15,6 +15,7 @@ obj-$(CONFIG_MTD_AFS_PARTS) += afs.o
obj-y += parsers/
# 'Users' - code which presents functionality to userspace.
+--
+2.11.0
+
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Sat, 2 Jan 2016 01:04:52 +0100
-Subject: [PATCH] mtd: bcm47xxpart: check for bad blocks when calculating
- offsets
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
+Subject: [PATCH] mtd: bcm47xxpart: check for bad blocks when calculating offsets
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
---
-From fd54aa583296f9adfb1f519affbc10ba521eb809 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= <zajec5@gmail.com>
-Date: Wed, 28 Jan 2015 22:14:41 +0100
-Subject: [PATCH] mtd: bcm47xxpart: detect T_Meter partition
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
+Subject: mtd: bcm47xxpart: detect T_Meter partition
It can be found on many Netgear devices. It consists of many 0x30 blocks
starting with 4D 54.
+From: Felix Fietkau <nbd@nbd.name>
+Subject: block2mtd
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/mtd/devices/block2mtd.c | 30 ++++++++++++++++++++----------
+ 1 file changed, 20 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c
+index 7c887f111a7d..22135cc48879 100644
--- a/drivers/mtd/devices/block2mtd.c
+++ b/drivers/mtd/devices/block2mtd.c
@@ -26,6 +26,7 @@
#include <linux/mutex.h>
#include <linux/mount.h>
#include <linux/slab.h>
-@@ -219,7 +220,7 @@ static void block2mtd_free_device(struct
+@@ -219,7 +220,7 @@ static void block2mtd_free_device(struct block2mtd_dev *dev)
static struct block2mtd_dev *add_device(char *devname, int erase_size,
{
#ifndef MODULE
int i;
-@@ -227,6 +228,7 @@ static struct block2mtd_dev *add_device(
+@@ -227,6 +228,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size,
const fmode_t mode = FMODE_READ | FMODE_WRITE | FMODE_EXCL;
struct block_device *bdev = ERR_PTR(-ENODEV);
struct block2mtd_dev *dev;
char *name;
if (!devname)
-@@ -283,13 +285,16 @@ static struct block2mtd_dev *add_device(
+@@ -283,13 +285,16 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size,
/* Setup the MTD structure */
/* make the name contain the block device in */
dev->mtd.erasesize = erase_size;
dev->mtd.writesize = 1;
dev->mtd.writebufsize = PAGE_SIZE;
-@@ -302,7 +307,11 @@ static struct block2mtd_dev *add_device(
+@@ -302,7 +307,11 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size,
dev->mtd.priv = dev;
dev->mtd.owner = THIS_MODULE;
/* Device didn't get added, so free the entry */
goto err_destroy_mutex;
}
-@@ -310,8 +319,7 @@ static struct block2mtd_dev *add_device(
+@@ -310,8 +319,7 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size,
list_add(&dev->list, &blkmtd_device_list);
pr_info("mtd%d: [%s] erase_size = %dKiB [%d]\n",
dev->mtd.index,
return dev;
err_destroy_mutex:
-@@ -384,7 +392,7 @@ static int block2mtd_setup2(const char *
+@@ -384,7 +392,7 @@ static int block2mtd_setup2(const char *val)
/* 80 for device, 12 for erase size, 80 for name, 8 for timeout */
char buf[80 + 12 + 80 + 8];
char *str = buf;
char *name;
size_t erase_size = PAGE_SIZE;
unsigned long timeout = MTD_DEFAULT_TIMEOUT;
-@@ -398,7 +406,7 @@ static int block2mtd_setup2(const char *
+@@ -398,7 +406,7 @@ static int block2mtd_setup2(const char *val)
strcpy(str, val);
kill_final_newline(str);
token[i] = strsep(&str, ",");
if (str) {
-@@ -424,8 +432,10 @@ static int block2mtd_setup2(const char *
+@@ -424,8 +432,10 @@ static int block2mtd_setup2(const char *val)
return 0;
}
}
return 0;
}
-@@ -459,7 +469,7 @@ static int block2mtd_setup(const char *v
+@@ -459,7 +469,7 @@ static int block2mtd_setup(const char *val, struct kernel_param *kp)
module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
static int __init block2mtd_init(void)
{
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: block2mtd
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/mtd/devices/block2mtd.c | 9 ++++++---
+ 1 file changed, 6 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c
+index 22135cc48879..9865041c347b 100644
--- a/drivers/mtd/devices/block2mtd.c
+++ b/drivers/mtd/devices/block2mtd.c
-@@ -392,7 +392,7 @@ static int block2mtd_setup2(const char *
+@@ -392,7 +392,7 @@ static int block2mtd_setup2(const char *val)
/* 80 for device, 12 for erase size, 80 for name, 8 for timeout */
char buf[80 + 12 + 80 + 8];
char *str = buf;
char *name;
size_t erase_size = PAGE_SIZE;
unsigned long timeout = MTD_DEFAULT_TIMEOUT;
-@@ -406,7 +406,7 @@ static int block2mtd_setup2(const char *
+@@ -406,7 +406,7 @@ static int block2mtd_setup2(const char *val)
strcpy(str, val);
kill_final_newline(str);
token[i] = strsep(&str, ",");
if (str) {
-@@ -435,6 +435,9 @@ static int block2mtd_setup2(const char *
+@@ -435,6 +435,9 @@ static int block2mtd_setup2(const char *val)
if (token[2] && (strlen(token[2]) + 1 > 80))
pr_err("mtd device name too long\n");
add_device(name, erase_size, token[2], timeout);
return 0;
-@@ -469,7 +472,7 @@ static int block2mtd_setup(const char *v
+@@ -469,7 +472,7 @@ static int block2mtd_setup(const char *val, struct kernel_param *kp)
module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
static int __init block2mtd_init(void)
{
+--
+2.11.0
+
--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: disable cfi cmdset 0002 erase suspend
+
+on some platforms, erase suspend leads to data corruption and lockups when write
+ops collide with erase ops. this has been observed on the buffalo wzr-hp-g300nh.
+rather than play whack-a-mole with a hard to reproduce issue on a variety of devices,
+simply disable erase suspend, as it will usually not produce any useful gain on
+the small filesystems used on embedded hardware.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/mtd/chips/cfi_cmdset_0002.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
+index 9dca881bb378..ea4db1917334 100644
+--- a/drivers/mtd/chips/cfi_cmdset_0002.c
++++ b/drivers/mtd/chips/cfi_cmdset_0002.c
+@@ -807,7 +807,7 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr
+ return 0;
+
+ case FL_ERASING:
+- if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||
++ if (1 /* no suspend */ || !cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||
+ !(mode == FL_READY || mode == FL_POINT ||
+ (mode == FL_WRITING && (cfip->EraseSuspend & 0x2))))
+ goto sleep;
+--
+2.11.0
+
From: George Kashperko <george@znau.edu.ua>
+Subject: Issue map read after Write Buffer Load command to ensure chip is ready to receive data.
-Issue map read after Write Buffer Load command to ensure chip is ready
-to receive data.
Signed-off-by: George Kashperko <george@znau.edu.ua>
---
drivers/mtd/chips/cfi_cmdset_0002.c | 1 +
--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Subject: Disable software protection bits for Macronix flashes.
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/mtd/spi-nor/spi-nor.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
+index 54868b19bf32..30adbc34ccac 100644
+--- a/drivers/mtd/spi-nor/spi-nor.c
++++ b/drivers/mtd/spi-nor/spi-nor.c
+@@ -1588,6 +1588,7 @@ int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode)
+
+ if (JEDEC_MFR(info) == SNOR_MFR_ATMEL ||
+ JEDEC_MFR(info) == SNOR_MFR_INTEL ||
++ JEDEC_MFR(info) == SNOR_MFR_MACRONIX ||
+ JEDEC_MFR(info) == SNOR_MFR_SST ||
+ info->flags & SPI_NOR_HAS_LOCK) {
+ write_enable(nor);
+--
+2.11.0
+
+From: Piotr Dymacz <pepe2k@gmail.com>
+Subject: kernel/mtd: add support for EON EN25Q128
+
+Signed-off-by: Piotr Dymacz <pepe2k@gmail.com>
+---
+ drivers/mtd/spi-nor/spi-nor.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
+index 30adbc34ccac..8c0ad628ddc6 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -954,6 +954,7 @@ static const struct flash_info spi_nor_i
+@@ -954,6 +954,7 @@ static const struct flash_info spi_nor_ids[] = {
{ "en25q32b", INFO(0x1c3016, 0, 64 * 1024, 64, 0) },
{ "en25p64", INFO(0x1c2017, 0, 64 * 1024, 128, 0) },
{ "en25q64", INFO(0x1c3017, 0, 64 * 1024, 128, SECT_4K) },
{ "en25qh128", INFO(0x1c7018, 0, 64 * 1024, 256, 0) },
{ "en25qh256", INFO(0x1c7019, 0, 64 * 1024, 512, 0) },
{ "en25s64", INFO(0x1c3817, 0, 64 * 1024, 128, SECT_4K) },
+--
+2.11.0
+
+From: André Valentin <avalentin@marcant.net>
+Subject: linux/mtd: add id for mx25u3235f needed by ZyXEL NBG6817
+
+Signed-off-by: André Valentin <avalentin@marcant.net>
+---
+ drivers/mtd/spi-nor/spi-nor.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
+index 8c0ad628ddc6..5288fcfbdb3b 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
-@@ -1014,6 +1014,7 @@ static const struct flash_info spi_nor_i
+@@ -1014,6 +1014,7 @@ static const struct flash_info spi_nor_ids[] = {
{ "mx25l3205d", INFO(0xc22016, 0, 64 * 1024, 64, SECT_4K) },
{ "mx25l3255e", INFO(0xc29e16, 0, 64 * 1024, 64, SECT_4K) },
{ "mx25l6405d", INFO(0xc22017, 0, 64 * 1024, 128, SECT_4K) },
{ "mx25u6435f", INFO(0xc22537, 0, 64 * 1024, 128, SECT_4K) },
{ "mx25l12805d", INFO(0xc22018, 0, 64 * 1024, 256, 0) },
{ "mx25l12855e", INFO(0xc22618, 0, 64 * 1024, 256, 0) },
+--
+2.11.0
+
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: kernel/3.1[02]: move MTD root device setup code to mtdcore
+
+The current code only allows to automatically set
+root device on MTD partitions. Move the code to MTD
+core to allow to use it with all MTD devices.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/mtd/mtdcore.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
+index d46e4adf6d2b..4d62d898dadc 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -40,6 +40,7 @@
return 0;
fail_added:
+--
+2.11.0
+
-From 8a52e4100d7c3a4a1dfddfa02b8864a9b0068c13 Mon Sep 17 00:00:00 2001
From: Daniel Golle <daniel@makrotopia.org>
-Date: Sat, 17 May 2014 03:36:18 +0200
-Subject: [PATCH 1/5] ubi: auto-attach mtd device named "ubi" or "data" on boot
-To: openwrt-devel@lists.openwrt.org
+Subject: ubi: auto-attach mtd device named "ubi" or "data" on boot
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
-From 0f3966579815f889bb2fcb4846152c35f65e79c4 Mon Sep 17 00:00:00 2001
From: Daniel Golle <daniel@makrotopia.org>
-Date: Thu, 15 May 2014 21:06:33 +0200
-Subject: [PATCH 2/5] ubi: auto-create ubiblock device for rootfs
-To: openwrt-devel@lists.openwrt.org
+Subject: ubi: auto-create ubiblock device for rootfs
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
-From eea9e1785e4c05c2a3444506aabafa0ae958538f Mon Sep 17 00:00:00 2001
From: Daniel Golle <daniel@makrotopia.org>
-Date: Sat, 17 May 2014 03:35:02 +0200
-Subject: [PATCH 4/5] try auto-mounting ubi0:rootfs in init/do_mounts.c
-To: openwrt-devel@lists.openwrt.org
+Subject: try auto-mounting ubi0:rootfs in init/do_mounts.c
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
-From cd68d1b12b5ea4c01a664c064179ada42bf55d3d Mon Sep 17 00:00:00 2001
From: Daniel Golle <daniel@makrotopia.org>
-Date: Thu, 15 May 2014 20:55:42 +0200
-Subject: [PATCH 5/5] ubi: set ROOT_DEV to ubiblock "rootfs" if unset
-To: openwrt-devel@lists.openwrt.org
+Subject: ubi: set ROOT_DEV to ubiblock "rootfs" if unset
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
---
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: mtd: add EOF marker support to the UBI layer
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/mtd/ubi/attach.c | 25 ++++++++++++++++++++++---
+ drivers/mtd/ubi/ubi.h | 1 +
+ 2 files changed, 23 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/mtd/ubi/attach.c b/drivers/mtd/ubi/attach.c
+index 93ceea4f27d5..a4f849d69104 100644
--- a/drivers/mtd/ubi/attach.c
+++ b/drivers/mtd/ubi/attach.c
@@ -939,6 +939,13 @@ static bool vol_ignored(int vol_id)
/**
* scan_peb - scan and process UBI headers of a PEB.
* @ubi: UBI device description object
-@@ -971,9 +978,21 @@ static int scan_peb(struct ubi_device *u
+@@ -971,9 +978,21 @@ static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai,
return 0;
}
switch (err) {
case 0:
break;
+diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
+index 697dbcba7371..92d207ff2458 100644
--- a/drivers/mtd/ubi/ubi.h
+++ b/drivers/mtd/ubi/ubi.h
@@ -779,6 +779,7 @@ struct ubi_attach_info {
struct kmem_cache *aeb_slab_cache;
struct ubi_ec_hdr *ech;
struct ubi_vid_io_buf *vidb;
+--
+2.11.0
+
+From: Alexandros C. Couloumbis <alex@ozo.com>
+Subject: fs: add jffs2/lzma support (not activated by default yet)
+
+lede-commit: c2c88d315fa0e881f8b19da07b62859b915b11b2
+Signed-off-by: Alexandros C. Couloumbis <alex@ozo.com>
+---
+ fs/jffs2/Kconfig | 9 +
+ fs/jffs2/Makefile | 3 +
+ fs/jffs2/compr.c | 6 +
+ fs/jffs2/compr.h | 10 +-
+ fs/jffs2/compr_lzma.c | 128 +++
+ fs/jffs2/super.c | 33 +-
+ include/linux/lzma.h | 62 ++
+ include/linux/lzma/LzFind.h | 115 +++
+ include/linux/lzma/LzHash.h | 54 +
+ include/linux/lzma/LzmaDec.h | 231 +++++
+ include/linux/lzma/LzmaEnc.h | 80 ++
+ include/linux/lzma/Types.h | 226 +++++
+ include/uapi/linux/jffs2.h | 1 +
+ lib/Kconfig | 6 +
+ lib/Makefile | 12 +
+ lib/lzma/LzFind.c | 761 ++++++++++++++
+ lib/lzma/LzmaDec.c | 999 +++++++++++++++++++
+ lib/lzma/LzmaEnc.c | 2271 ++++++++++++++++++++++++++++++++++++++++++
+ lib/lzma/Makefile | 7 +
+ 19 files changed, 5008 insertions(+), 6 deletions(-)
+ create mode 100644 fs/jffs2/compr_lzma.c
+ create mode 100644 include/linux/lzma.h
+ create mode 100644 include/linux/lzma/LzFind.h
+ create mode 100644 include/linux/lzma/LzHash.h
+ create mode 100644 include/linux/lzma/LzmaDec.h
+ create mode 100644 include/linux/lzma/LzmaEnc.h
+ create mode 100644 include/linux/lzma/Types.h
+ create mode 100644 lib/lzma/LzFind.c
+ create mode 100644 lib/lzma/LzmaDec.c
+ create mode 100644 lib/lzma/LzmaEnc.c
+ create mode 100644 lib/lzma/Makefile
+
+diff --git a/fs/jffs2/Kconfig b/fs/jffs2/Kconfig
+index d8bb6c411e96..74bf4b162e36 100644
--- a/fs/jffs2/Kconfig
+++ b/fs/jffs2/Kconfig
@@ -139,6 +139,15 @@ config JFFS2_LZO
config JFFS2_RTIME
bool "JFFS2 RTIME compression support" if JFFS2_COMPRESSION_OPTIONS
depends on JFFS2_FS
+diff --git a/fs/jffs2/Makefile b/fs/jffs2/Makefile
+index 60e5d49ca03e..23ba6efd1f3f 100644
--- a/fs/jffs2/Makefile
+++ b/fs/jffs2/Makefile
-@@ -18,4 +18,7 @@ jffs2-$(CONFIG_JFFS2_RUBIN) += compr_rub
+@@ -18,4 +18,7 @@ jffs2-$(CONFIG_JFFS2_RUBIN) += compr_rubin.o
jffs2-$(CONFIG_JFFS2_RTIME) += compr_rtime.o
jffs2-$(CONFIG_JFFS2_ZLIB) += compr_zlib.o
jffs2-$(CONFIG_JFFS2_LZO) += compr_lzo.o
jffs2-$(CONFIG_JFFS2_SUMMARY) += summary.o
+
+CFLAGS_compr_lzma.o += -Iinclude/linux -Ilib/lzma
+diff --git a/fs/jffs2/compr.c b/fs/jffs2/compr.c
+index 4849a4c9a0e2..6ec806abb7b9 100644
--- a/fs/jffs2/compr.c
+++ b/fs/jffs2/compr.c
@@ -378,6 +378,9 @@ int __init jffs2_compressors_init(void)
#ifdef CONFIG_JFFS2_LZO
jffs2_lzo_exit();
#endif
+diff --git a/fs/jffs2/compr.h b/fs/jffs2/compr.h
+index 5e91d578f4ed..32db2e1ec610 100644
--- a/fs/jffs2/compr.h
+++ b/fs/jffs2/compr.h
@@ -29,9 +29,9 @@
+#endif
#endif /* __JFFS2_COMPR_H__ */
+diff --git a/fs/jffs2/compr_lzma.c b/fs/jffs2/compr_lzma.c
+new file mode 100644
+index 000000000000..0fe3b75d7dcc
--- /dev/null
+++ b/fs/jffs2/compr_lzma.c
@@ -0,0 +1,128 @@
+ jffs2_unregister_compressor(&jffs2_lzma_comp);
+ lzma_free_workspace();
+}
+diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c
+index 5ef21f4c4c77..62e730216e7d 100644
--- a/fs/jffs2/super.c
+++ b/fs/jffs2/super.c
@@ -372,14 +372,41 @@ static int __init init_jffs2_fs(void)
jffs2_inode_cachep = kmem_cache_create("jffs2_i",
sizeof(struct jffs2_inode_info),
---- a/include/uapi/linux/jffs2.h
-+++ b/include/uapi/linux/jffs2.h
-@@ -46,6 +46,7 @@
- #define JFFS2_COMPR_DYNRUBIN 0x05
- #define JFFS2_COMPR_ZLIB 0x06
- #define JFFS2_COMPR_LZO 0x07
-+#define JFFS2_COMPR_LZMA 0x08
- /* Compatibility flags. */
- #define JFFS2_COMPAT_MASK 0xc000 /* What do to if an unknown nodetype is found */
- #define JFFS2_NODE_ACCURATE 0x2000
+diff --git a/include/linux/lzma.h b/include/linux/lzma.h
+new file mode 100644
+index 000000000000..5f31334dfc31
--- /dev/null
+++ b/include/linux/lzma.h
@@ -0,0 +1,62 @@
+static ISzAlloc lzma_alloc = {p_lzma_malloc, p_lzma_free};
+
+#endif
+diff --git a/include/linux/lzma/LzFind.h b/include/linux/lzma/LzFind.h
+new file mode 100644
+index 000000000000..010c4b92ba33
--- /dev/null
+++ b/include/linux/lzma/LzFind.h
@@ -0,0 +1,115 @@
+#endif
+
+#endif
+diff --git a/include/linux/lzma/LzHash.h b/include/linux/lzma/LzHash.h
+new file mode 100644
+index 000000000000..f3e89966cc70
--- /dev/null
+++ b/include/linux/lzma/LzHash.h
@@ -0,0 +1,54 @@
+ hash4Value = (temp ^ ((UInt32)cur[2] << 8) ^ (p->crc[cur[3]] << 5)) & (kHash4Size - 1); }
+
+#endif
+diff --git a/include/linux/lzma/LzmaDec.h b/include/linux/lzma/LzmaDec.h
+new file mode 100644
+index 000000000000..bf7f084ba3dd
--- /dev/null
+++ b/include/linux/lzma/LzmaDec.h
@@ -0,0 +1,231 @@
+#endif
+
+#endif
+diff --git a/include/linux/lzma/LzmaEnc.h b/include/linux/lzma/LzmaEnc.h
+new file mode 100644
+index 000000000000..200d60eb83cd
--- /dev/null
+++ b/include/linux/lzma/LzmaEnc.h
@@ -0,0 +1,80 @@
+#endif
+
+#endif
+diff --git a/include/linux/lzma/Types.h b/include/linux/lzma/Types.h
+new file mode 100644
+index 000000000000..4751acde0722
--- /dev/null
+++ b/include/linux/lzma/Types.h
@@ -0,0 +1,226 @@
+EXTERN_C_END
+
+#endif
+diff --git a/include/uapi/linux/jffs2.h b/include/uapi/linux/jffs2.h
+index a18b719f49d4..f3431a5ff4ff 100644
+--- a/include/uapi/linux/jffs2.h
++++ b/include/uapi/linux/jffs2.h
+@@ -46,6 +46,7 @@
+ #define JFFS2_COMPR_DYNRUBIN 0x05
+ #define JFFS2_COMPR_ZLIB 0x06
+ #define JFFS2_COMPR_LZO 0x07
++#define JFFS2_COMPR_LZMA 0x08
+ /* Compatibility flags. */
+ #define JFFS2_COMPAT_MASK 0xc000 /* What do to if an unknown nodetype is found */
+ #define JFFS2_NODE_ACCURATE 0x2000
+diff --git a/lib/Kconfig b/lib/Kconfig
+index 260a80e313b9..2e20b2b1ba02 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -241,6 +241,12 @@ config LZ4_DECOMPRESS
#
# These all provide a common interface (hence the apparent duplication with
# ZLIB_INFLATE; DECOMPRESS_GZIP is just a wrapper.)
+diff --git a/lib/Makefile b/lib/Makefile
+index 50144a3aeebd..603630df298d 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -2,6 +2,16 @@
lib-$(CONFIG_DECOMPRESS_GZIP) += decompress_inflate.o
lib-$(CONFIG_DECOMPRESS_BZIP2) += decompress_bunzip2.o
+diff --git a/lib/lzma/LzFind.c b/lib/lzma/LzFind.c
+new file mode 100644
+index 000000000000..e3ecb05420eb
--- /dev/null
+++ b/lib/lzma/LzFind.c
@@ -0,0 +1,761 @@
+ vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
+ }
+}
+diff --git a/lib/lzma/LzmaDec.c b/lib/lzma/LzmaDec.c
+new file mode 100644
+index 000000000000..2036761bf146
--- /dev/null
+++ b/lib/lzma/LzmaDec.c
@@ -0,0 +1,999 @@
+ LzmaDec_FreeProbs(&p, alloc);
+ return res;
+}
+diff --git a/lib/lzma/LzmaEnc.c b/lib/lzma/LzmaEnc.c
+new file mode 100644
+index 000000000000..6dadf00dfab2
--- /dev/null
+++ b/lib/lzma/LzmaEnc.c
@@ -0,0 +1,2271 @@
+ LzmaEnc_Destroy(p, alloc, allocBig);
+ return res;
+}
+diff --git a/lib/lzma/Makefile b/lib/lzma/Makefile
+new file mode 100644
+index 000000000000..02e799c99381
--- /dev/null
+++ b/lib/lzma/Makefile
@@ -0,0 +1,7 @@
+obj-$(CONFIG_LZMA_DECOMPRESS) += lzma_decompress.o
+
+EXTRA_CFLAGS += -Iinclude/linux -Iinclude/linux/lzma -include types.h
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: fs: jffs2: EOF marker
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ fs/jffs2/build.c | 10 ++++++++++
+ fs/jffs2/scan.c | 21 +++++++++++++++++++--
+ 2 files changed, 29 insertions(+), 2 deletions(-)
+
+diff --git a/fs/jffs2/build.c b/fs/jffs2/build.c
+index b288c8ae1236..e768f9d41661 100644
--- a/fs/jffs2/build.c
+++ b/fs/jffs2/build.c
-@@ -117,6 +117,16 @@ static int jffs2_build_filesystem(struct
+@@ -117,6 +117,16 @@ static int jffs2_build_filesystem(struct jffs2_sb_info *c)
dbg_fsbuild("scanned flash completely\n");
jffs2_dbg_dump_block_lists_nolock(c);
dbg_fsbuild("pass 1 starting\n");
c->flags |= JFFS2_SB_FLAG_BUILDING;
/* Now scan the directory tree, increasing nlink according to every dirent found. */
+diff --git a/fs/jffs2/scan.c b/fs/jffs2/scan.c
+index 90431dd613b8..8c78ab19cdab 100644
--- a/fs/jffs2/scan.c
+++ b/fs/jffs2/scan.c
-@@ -148,8 +148,14 @@ int jffs2_scan_medium(struct jffs2_sb_in
+@@ -148,8 +148,14 @@ int jffs2_scan_medium(struct jffs2_sb_info *c)
/* reset summary info for next eraseblock scan */
jffs2_sum_reset_collected(s);
if (ret < 0)
goto out;
-@@ -561,6 +567,17 @@ full_scan:
+@@ -561,6 +567,17 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo
return err;
}
/* We temporarily use 'ofs' as a pointer into the buffer/jeb */
ofs = 0;
max_ofs = EMPTY_SCAN_SIZE(c->sector_size);
+--
+2.11.0
+
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: fs: ubifs: fix default compression selection in ubifs
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ fs/ubifs/sb.c | 13 ++++++++++++-
+ 1 file changed, 12 insertions(+), 1 deletion(-)
+
+diff --git a/fs/ubifs/sb.c b/fs/ubifs/sb.c
+index 3cbb904a6d7d..460cb9e3b4ea 100644
--- a/fs/ubifs/sb.c
+++ b/fs/ubifs/sb.c
@@ -63,6 +63,17 @@
/**
* create_default_filesystem - format empty UBI volume.
* @c: UBIFS file-system description object
-@@ -183,7 +194,7 @@ static int create_default_filesystem(str
+@@ -183,7 +194,7 @@ static int create_default_filesystem(struct ubifs_info *c)
if (c->mount_opts.override_compr)
sup->default_compr = cpu_to_le16(c->mount_opts.compr_type);
else
generate_random_uuid(sup->uuid);
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: netfilter: add support for flushing conntrack via /proc
+
+lede-commit 8193bbe59a74d34d6a26d4a8cb857b1952905314
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/netfilter/nf_conntrack_standalone.c | 59 ++++++++++++++++++++++++++++++++-
+ 1 file changed, 58 insertions(+), 1 deletion(-)
+
+diff --git a/net/netfilter/nf_conntrack_standalone.c b/net/netfilter/nf_conntrack_standalone.c
+index 5f446cd9f3fd..4c1856b5151f 100644
--- a/net/netfilter/nf_conntrack_standalone.c
+++ b/net/netfilter/nf_conntrack_standalone.c
@@ -17,6 +17,7 @@
#include <net/net_namespace.h>
#ifdef CONFIG_SYSCTL
#include <linux/sysctl.h>
-@@ -298,10 +299,66 @@ static int ct_open(struct inode *inode,
+@@ -298,10 +299,66 @@ static int ct_open(struct inode *inode, struct file *file)
sizeof(struct ct_iter_state));
}
.llseek = seq_lseek,
.release = seq_release_net,
};
-@@ -405,7 +462,7 @@ static int nf_conntrack_standalone_init_
+@@ -405,7 +462,7 @@ static int nf_conntrack_standalone_init_proc(struct net *net)
kuid_t root_uid;
kgid_t root_gid;
if (!pde)
goto out_nf_conntrack;
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: add a new version of my netfilter speedup patches for linux 2.6.39 and 3.0
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/uapi/linux/netfilter_ipv4/ip_tables.h | 1 +
+ net/ipv4/netfilter/ip_tables.c | 37 +++++++++++++++++++++++++++
+ 2 files changed, 38 insertions(+)
+
+diff --git a/include/uapi/linux/netfilter_ipv4/ip_tables.h b/include/uapi/linux/netfilter_ipv4/ip_tables.h
+index d0da53d96d93..f279daa13c0f 100644
--- a/include/uapi/linux/netfilter_ipv4/ip_tables.h
+++ b/include/uapi/linux/netfilter_ipv4/ip_tables.h
@@ -88,6 +88,7 @@ struct ipt_ip {
/* Values for "inv" field in struct ipt_ip. */
#define IPT_INV_VIA_IN 0x01 /* Invert the sense of IN IFACE. */
+diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
+index 7c00ce90adb8..d919350a0e8b 100644
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
@@ -58,6 +58,9 @@ ip_packet_match(const struct iphdr *ip,
static bool
ip_checkentry(const struct ipt_ip *ip)
{
-@@ -545,6 +571,8 @@ find_check_entry(struct ipt_entry *e, st
+@@ -545,6 +571,8 @@ find_check_entry(struct ipt_entry *e, struct net *net, const char *name,
struct xt_entry_match *ematch;
unsigned long pcnt;
pcnt = xt_percpu_counter_alloc();
if (IS_ERR_VALUE(pcnt))
return -ENOMEM;
-@@ -824,6 +852,7 @@ copy_entries_to_user(unsigned int total_
+@@ -824,6 +852,7 @@ copy_entries_to_user(unsigned int total_size,
const struct xt_table_info *private = table->private;
int ret = 0;
const void *loc_cpu_entry;
counters = alloc_counters(table);
if (IS_ERR(counters))
-@@ -850,6 +879,14 @@ copy_entries_to_user(unsigned int total_
- ret = -EFAULT;
+@@ -851,6 +880,14 @@ copy_entries_to_user(unsigned int total_size,
goto free_counters;
}
-+
+
+ flags = e->ip.flags & IPT_F_MASK;
+ if (copy_to_user(userptr + off
+ + offsetof(struct ipt_entry, ip.flags),
+ ret = -EFAULT;
+ goto free_counters;
+ }
-
++
for (i = sizeof(struct ipt_entry);
i < e->target_offset;
+ i += m->u.match_size) {
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: netfilter: match bypass default table
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/ipv4/netfilter/ip_tables.c | 79 +++++++++++++++++++++++++++++++-----------
+ 1 file changed, 58 insertions(+), 21 deletions(-)
+
+diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
+index d919350a0e8b..9178930fca17 100644
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
-@@ -254,6 +254,33 @@ struct ipt_entry *ipt_next_entry(const s
+@@ -254,6 +254,33 @@ struct ipt_entry *ipt_next_entry(const struct ipt_entry *entry)
return (void *)entry + entry->next_offset;
}
do {
const struct xt_entry_target *t;
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: netfilter: reduce match memory access
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/ipv4/netfilter/ip_tables.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
+index 9178930fca17..35d1db7b78f1 100644
--- a/net/ipv4/netfilter/ip_tables.c
+++ b/net/ipv4/netfilter/ip_tables.c
@@ -61,9 +61,9 @@ ip_packet_match(const struct iphdr *ip,
(ip->daddr & ipinfo->dmsk.s_addr) != ipinfo->dst.s_addr))
return false;
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: netfilter: optional tcp window check
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/netfilter/nf_conntrack_proto_tcp.c | 13 +++++++++++++
+ 1 file changed, 13 insertions(+)
+
+diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c
+index 69f687740c76..f24b62668dc8 100644
--- a/net/netfilter/nf_conntrack_proto_tcp.c
+++ b/net/netfilter/nf_conntrack_proto_tcp.c
@@ -33,6 +33,9 @@
/* "Be conservative in what you do,
be liberal in what you accept from others."
If it's non-zero, we mark only out of window RST segments as INVALID. */
-@@ -513,6 +516,9 @@ static bool tcp_in_window(const struct n
+@@ -513,6 +516,9 @@ static bool tcp_in_window(const struct nf_conn *ct,
s32 receiver_offset;
bool res, in_recv_win;
/*
* Get the required data from the packet.
*/
-@@ -1479,6 +1485,13 @@ static struct ctl_table tcp_sysctl_table
+@@ -1479,6 +1485,13 @@ static struct ctl_table tcp_sysctl_table[] = {
.mode = 0644,
.proc_handler = proc_dointvec,
},
{ }
};
#endif /* CONFIG_SYSCTL */
+--
+2.11.0
+
--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: add a small xfrm related performance optimization
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ net/netfilter/nf_nat_core.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/net/netfilter/nf_nat_core.c b/net/netfilter/nf_nat_core.c
+index 5b9c884a452e..4ea363755085 100644
+--- a/net/netfilter/nf_nat_core.c
++++ b/net/netfilter/nf_nat_core.c
+@@ -95,6 +95,9 @@ int nf_xfrm_me_harder(struct net *net, struct sk_buff *skb, unsigned int family)
+ struct dst_entry *dst;
+ int err;
+
++ if (skb->dev && !dev_net(skb->dev)->xfrm.policy_count[XFRM_POLICY_OUT])
++ return 0;
++
+ err = xfrm_decode_session(skb, &fl, family);
+ if (err < 0)
+ return err;
+--
+2.11.0
+
-This patch allows the user to specify desired packet types (outgoing,
-broadcast, unicast, etc.) on packet sockets via setsockopt.
-This can reduce the load in situations where only a limited number
-of packet types are necessary
+From: Felix Fietkau <nbd@nbd.name>
+Subject: net: add an optimization for dealing with raw sockets
+lede-commit: 4898039703d7315f0f3431c860123338ec3be0f6
Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/uapi/linux/if_packet.h | 3 +++
+ net/packet/af_packet.c | 34 +++++++++++++++++++++++++++-------
+ net/packet/internal.h | 1 +
+ 3 files changed, 31 insertions(+), 7 deletions(-)
+diff --git a/include/uapi/linux/if_packet.h b/include/uapi/linux/if_packet.h
+index 9e7edfd8141e..40fdf8907900 100644
--- a/include/uapi/linux/if_packet.h
+++ b/include/uapi/linux/if_packet.h
@@ -31,6 +31,8 @@ struct sockaddr_ll {
#define PACKET_FANOUT_HASH 0
#define PACKET_FANOUT_LB 1
+diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
+index 6a563e6e24de..e412c5a4f6d4 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
-@@ -1772,6 +1772,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1772,6 +1772,7 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev,
{
struct sock *sk;
struct sockaddr_pkt *spkt;
/*
* When we registered the protocol we saved the socket in the data
-@@ -1779,6 +1780,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1779,6 +1780,7 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev,
*/
sk = pt->af_packet_priv;
/*
* Yank back the headers [hope the device set this
-@@ -1791,7 +1793,7 @@ static int packet_rcv_spkt(struct sk_buf
+@@ -1791,7 +1793,7 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev,
* so that this procedure is noop.
*/
goto out;
if (!net_eq(dev_net(dev), sock_net(sk)))
-@@ -2029,12 +2031,12 @@ static int packet_rcv(struct sk_buff *sk
+@@ -2029,12 +2031,12 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev,
unsigned int snaplen, res;
bool is_drop_n_account = false;
if (!net_eq(dev_net(dev), sock_net(sk)))
goto drop;
-@@ -2159,12 +2161,12 @@ static int tpacket_rcv(struct sk_buff *s
+@@ -2159,12 +2161,12 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev,
BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h2)) != 32);
BUILD_BUG_ON(TPACKET_ALIGN(sizeof(*h.h3)) != 48);
if (!net_eq(dev_net(dev), sock_net(sk)))
goto drop;
-@@ -3234,6 +3236,7 @@ static int packet_create(struct net *net
+@@ -3234,6 +3236,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol,
mutex_init(&po->pg_vec_lock);
po->rollover = NULL;
po->prot_hook.func = packet_rcv;
if (sock->type == SOCK_PACKET)
po->prot_hook.func = packet_rcv_spkt;
-@@ -3815,6 +3818,16 @@ packet_setsockopt(struct socket *sock, i
+@@ -3815,6 +3818,16 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
po->xmit = val ? packet_direct_xmit : dev_queue_xmit;
return 0;
}
default:
return -ENOPROTOOPT;
}
-@@ -3867,6 +3880,13 @@ static int packet_getsockopt(struct sock
+@@ -3867,6 +3880,13 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
case PACKET_VNET_HDR:
val = po->has_vnet_hdr;
break;
case PACKET_VERSION:
val = po->tp_version;
break;
+diff --git a/net/packet/internal.h b/net/packet/internal.h
+index 9ee46314b7d7..76c895fcf22f 100644
--- a/net/packet/internal.h
+++ b/net/packet/internal.h
@@ -129,6 +129,7 @@ struct packet_sock {
};
static struct packet_sock *pkt_sk(struct sock *sk)
+--
+2.11.0
+
--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Subject: pppoe: add extra padding for the header (useful for drivers that need headroom)
+
+lede-commit 6517a757ec711fc3354b857e273e2621042f3c7a
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/net/ppp/pppoe.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c
+index 4ddae8118c85..49ef11f92fc9 100644
+--- a/drivers/net/ppp/pppoe.c
++++ b/drivers/net/ppp/pppoe.c
+@@ -861,7 +861,7 @@ static int pppoe_sendmsg(struct socket *sock, struct msghdr *m,
+ goto end;
+
+
+- skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32,
++ skb = sock_wmalloc(sk, total_len + dev->hard_header_len + 32 + NET_SKB_PAD,
+ 0, GFP_KERNEL);
+ if (!skb) {
+ error = -ENOMEM;
+@@ -869,7 +869,7 @@ static int pppoe_sendmsg(struct socket *sock, struct msghdr *m,
+ }
+
+ /* Reserve space for headers. */
+- skb_reserve(skb, dev->hard_header_len);
++ skb_reserve(skb, dev->hard_header_len + NET_SKB_PAD);
+ skb_reset_network_header(skb);
+
+ skb->dev = dev;
+--
+2.11.0
+
--- /dev/null
+From: Felix Fietkau <nbd@nbd.name>
+Subject: kernel: add a few patches for avoiding unnecessary skb reallocations - significantly improves ethernet<->wireless performance
+
+lede-commit: 6f89cffc9add6939d44a6b54cf9a5e77849aa7fd
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/skbuff.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
+index 32810f279f8e..5f3343ae25ef 100644
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -2298,7 +2298,7 @@ static inline int pskb_network_may_pull(struct sk_buff *skb, unsigned int len)
+ * NET_IP_ALIGN(2) + ethernet_header(14) + IP_header(20/40) + ports(8)
+ */
+ #ifndef NET_SKB_PAD
+-#define NET_SKB_PAD max(32, L1_CACHE_BYTES)
++#define NET_SKB_PAD max(64, L1_CACHE_BYTES)
+ #endif
+
+ int ___pskb_trim(struct sk_buff *skb, unsigned int len);
+--
+2.11.0
+
-From 775d6fe74d1eaec2ba387535b068dde2dc89de9e Mon Sep 17 00:00:00 2001
From: Steven Barth <steven@midlink.org>
-Date: Thu, 22 May 2014 09:49:05 +0200
-Subject: [PATCH] Add support for MAP-E FMRs (mesh mode)
+Subject: Add support for MAP-E FMRs (mesh mode)
MAP-E FMRs (draft-ietf-softwire-map-10) are rules for IPv4-communication
between MAP CEs (mesh mode) without the need to forward such data to a
/**
* ip6_tnl_addr_conflict - compare packet addresses to tunnel's own
* @t: the outgoing tunnel device
-@@ -1285,6 +1425,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
+@@ -1283,6 +1423,7 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
{
struct ip6_tnl *t = netdev_priv(dev);
struct ipv6hdr *ipv6h = ipv6_hdr(skb);
int encap_limit = -1;
__u16 offset;
struct flowi6 fl6;
-@@ -1343,6 +1484,18 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
+@@ -1338,6 +1479,18 @@ ip6ip6_tnl_xmit(struct sk_buff *skb, str
fl6.flowi6_mark = skb->mark;
}
if (iptunnel_handle_offloads(skb, SKB_GSO_IPXIP6))
return -1;
-@@ -1470,6 +1623,14 @@ ip6_tnl_change(struct ip6_tnl *t, const
+@@ -1463,6 +1616,14 @@ ip6_tnl_change(struct ip6_tnl *t, const
t->parms.flowinfo = p->flowinfo;
t->parms.link = p->link;
t->parms.proto = p->proto;
dst_cache_reset(&t->dst_cache);
ip6_tnl_link_config(t);
return 0;
-@@ -1508,6 +1669,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_
+@@ -1501,6 +1662,7 @@ ip6_tnl_parm_from_user(struct __ip6_tnl_
p->flowinfo = u->flowinfo;
p->link = u->link;
p->proto = u->proto;
memcpy(p->name, u->name, sizeof(u->name));
}
-@@ -1885,6 +2047,15 @@ static int ip6_tnl_validate(struct nlatt
+@@ -1878,6 +2040,15 @@ static int ip6_tnl_validate(struct nlatt
return 0;
}
static void ip6_tnl_netlink_parms(struct nlattr *data[],
struct __ip6_tnl_parm *parms)
{
-@@ -1919,6 +2090,46 @@ static void ip6_tnl_netlink_parms(struct
+@@ -1912,6 +2083,46 @@ static void ip6_tnl_netlink_parms(struct
if (data[IFLA_IPTUN_COLLECT_METADATA])
parms->collect_md = true;
}
static bool ip6_tnl_netlink_encap_parms(struct nlattr *data[],
-@@ -2028,6 +2239,12 @@ static void ip6_tnl_dellink(struct net_d
+@@ -2021,6 +2232,12 @@ static void ip6_tnl_dellink(struct net_d
static size_t ip6_tnl_get_size(const struct net_device *dev)
{
return
/* IFLA_IPTUN_LINK */
nla_total_size(4) +
-@@ -2055,6 +2272,24 @@ static size_t ip6_tnl_get_size(const str
+@@ -2048,6 +2265,24 @@ static size_t ip6_tnl_get_size(const str
nla_total_size(2) +
/* IFLA_IPTUN_COLLECT_METADATA */
nla_total_size(0) +
0;
}
-@@ -2062,6 +2297,9 @@ static int ip6_tnl_fill_info(struct sk_b
+@@ -2055,6 +2290,9 @@ static int ip6_tnl_fill_info(struct sk_b
{
struct ip6_tnl *tunnel = netdev_priv(dev);
struct __ip6_tnl_parm *parm = &tunnel->parms;
if (nla_put_u32(skb, IFLA_IPTUN_LINK, parm->link) ||
nla_put_in6_addr(skb, IFLA_IPTUN_LOCAL, &parm->laddr) ||
-@@ -2070,9 +2308,27 @@ static int ip6_tnl_fill_info(struct sk_b
+@@ -2063,9 +2301,27 @@ static int ip6_tnl_fill_info(struct sk_b
nla_put_u8(skb, IFLA_IPTUN_ENCAP_LIMIT, parm->encap_limit) ||
nla_put_be32(skb, IFLA_IPTUN_FLOWINFO, parm->flowinfo) ||
nla_put_u32(skb, IFLA_IPTUN_FLAGS, parm->flags) ||
if (nla_put_u16(skb, IFLA_IPTUN_ENCAP_TYPE, tunnel->encap.type) ||
nla_put_be16(skb, IFLA_IPTUN_ENCAP_SPORT, tunnel->encap.sport) ||
nla_put_be16(skb, IFLA_IPTUN_ENCAP_DPORT, tunnel->encap.dport) ||
-@@ -2110,6 +2366,7 @@ static const struct nla_policy ip6_tnl_p
+@@ -2103,6 +2359,7 @@ static const struct nla_policy ip6_tnl_p
[IFLA_IPTUN_ENCAP_SPORT] = { .type = NLA_U16 },
[IFLA_IPTUN_ENCAP_DPORT] = { .type = NLA_U16 },
[IFLA_IPTUN_COLLECT_METADATA] = { .type = NLA_FLAG },
-From 1b5aaa4b16f6e6471ab1c07b38068197a1b4c395 Mon Sep 17 00:00:00 2001
From: Jonas Gorski <jogo@openwrt.org>
-Date: Fri, 24 May 2013 14:40:54 +0200
-Subject: [PATCH 1/2] ipv6: allow rejecting with "source address failed policy"
+Subject: ipv6: allow rejecting with "source address failed policy"
RFC6204 L-14 requires rejecting traffic from invalid addresses with
ICMPv6 Destination Unreachable, Code 5 (Source address failed ingress/
default:
--- a/net/ipv6/fib6_rules.c
+++ b/net/ipv6/fib6_rules.c
-@@ -77,6 +77,10 @@ static int fib6_rule_action(struct fib_r
+@@ -88,6 +88,10 @@ static int fib6_rule_action(struct fib_r
err = -EACCES;
rt = net->ipv6.ip6_prohibit_entry;
goto discard_pkt;
cfg->fc_flags |= RTF_REJECT;
if (rtm->rtm_type == RTN_LOCAL)
-@@ -3207,6 +3241,9 @@ static int rt6_fill_node(struct net *net
+@@ -3213,6 +3247,9 @@ static int rt6_fill_node(struct net *net
case -EACCES:
rtm->rtm_type = RTN_PROHIBIT;
break;
case -EAGAIN:
rtm->rtm_type = RTN_THROW;
break;
-@@ -3483,6 +3520,8 @@ static int ip6_route_dev_notify(struct n
+@@ -3489,6 +3526,8 @@ static int ip6_route_dev_notify(struct n
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
net->ipv6.ip6_prohibit_entry->dst.dev = dev;
net->ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(dev);
net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
#endif
-@@ -3705,6 +3744,17 @@ static int __net_init ip6_route_net_init
+@@ -3711,6 +3750,17 @@ static int __net_init ip6_route_net_init
net->ipv6.ip6_blk_hole_entry->dst.ops = &net->ipv6.ip6_dst_ops;
dst_init_metrics(&net->ipv6.ip6_blk_hole_entry->dst,
ip6_template_metrics, true);
#endif
net->ipv6.sysctl.flush_delay = 0;
-@@ -3723,6 +3773,8 @@ out:
+@@ -3729,6 +3779,8 @@ out:
return ret;
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
out_ip6_prohibit_entry:
kfree(net->ipv6.ip6_prohibit_entry);
out_ip6_null_entry:
-@@ -3740,6 +3792,7 @@ static void __net_exit ip6_route_net_exi
+@@ -3746,6 +3798,7 @@ static void __net_exit ip6_route_net_exi
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
kfree(net->ipv6.ip6_prohibit_entry);
kfree(net->ipv6.ip6_blk_hole_entry);
#endif
dst_entries_destroy(&net->ipv6.ip6_dst_ops);
}
-@@ -3813,6 +3866,9 @@ void __init ip6_route_init_special_entri
+@@ -3819,6 +3872,9 @@ void __init ip6_route_init_special_entri
init_net.ipv6.ip6_prohibit_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
init_net.ipv6.ip6_blk_hole_entry->dst.dev = init_net.loopback_dev;
init_net.ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(init_net.loopback_dev);
-From 7749b481ce5d7e232b1f7da5e6b2c44816f51681 Mon Sep 17 00:00:00 2001
From: Jonas Gorski <jogo@openwrt.org>
-Date: Sun, 19 Jan 2014 20:45:51 +0100
-Subject: [PATCH 2/2] net: provide defines for _POLICY_FAILED until all code is
- updated
+Subject: net: provide defines for _POLICY_FAILED until all code is updated
Upstream introduced ICMPV6_POLICY_FAIL for code 5 of destination
unreachable, conflicting with our name.
-Subject: NET: skip GRO for foreign MAC addresses
-
-For network drivers using napi_gro_receive, packets are run through GRO,
-even when the destination MAC address does not match, and they're supposed
-to be delivered to another host behind a different bridge port.
-
-This can be very expensive, because for drivers without TSO or scatter-
-gather, this can only be undone by copying the skb and checksumming it
-again.
-
-To be able to track foreign MAC addresses in an inexpensive way, create
-a mask of changed bits in MAC addresses of upper devices. This allows
-handling VLANs and bridge devices with different addresses (as long as
-they are not too different).
+From: Felix Fietkau <nbd@nbd.name>
+Subject: net: replace GRO optimization patch with a new one that supports VLANs/bridges with different MAC addresses
Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/netdevice.h | 2 ++
+ include/linux/skbuff.h | 3 ++-
+ net/core/dev.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++
+ net/ethernet/eth.c | 18 +++++++++++++++++-
+ 4 files changed, 69 insertions(+), 2 deletions(-)
+diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
+index 780e7171f548..6b738c662bc1 100644
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -1749,6 +1749,8 @@ struct net_device {
+ struct netdev_hw_addr_list mc;
+ struct netdev_hw_addr_list dev_addrs;
+
++ unsigned char local_addr_mask[MAX_ADDR_LEN];
++
+ #ifdef CONFIG_SYSFS
+ struct kset *queues_kset;
+ #endif
+diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
+index 5f3343ae25ef..3a04baab9b28 100644
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -742,7 +742,8 @@ struct sk_buff {
+ #ifdef CONFIG_NET_SWITCHDEV
+ __u8 offload_fwd_mark:1;
+ #endif
+- /* 2, 4 or 5 bit hole */
++ __u8 gro_skip:1;
++ /* 1, 3 or 4 bit hole */
+
+ #ifdef CONFIG_NET_SCHED
+ __u16 tc_index; /* traffic control index */
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 2e04fd188081..c7c96308bc84 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
-@@ -4513,6 +4513,9 @@ static enum gro_result dev_gro_receive(s
+@@ -4512,6 +4512,9 @@ static enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff
enum gro_result ret;
int grow;
if (!(skb->dev->features & NETIF_F_GRO))
goto normal;
-@@ -5800,6 +5803,48 @@ static void __netdev_adjacent_dev_unlink
+@@ -5789,6 +5792,48 @@ static void __netdev_adjacent_dev_unlink_neighbour(struct net_device *dev,
&upper_dev->adj_list.lower);
}
static int __netdev_upper_dev_link(struct net_device *dev,
struct net_device *upper_dev, bool master,
void *upper_priv, void *upper_info)
-@@ -5998,6 +6043,8 @@ void netdev_upper_dev_unlink(struct net_
+@@ -5987,6 +6032,8 @@ void netdev_upper_dev_unlink(struct net_device *dev,
list_for_each_entry(i, &upper_dev->all_adj_list.upper, list)
__netdev_adjacent_dev_unlink(dev, i->dev, i->ref_nr);
call_netdevice_notifiers_info(NETDEV_CHANGEUPPER, dev,
&changeupper_info.info);
}
-@@ -6598,6 +6645,7 @@ int dev_set_mac_address(struct net_devic
+@@ -6587,6 +6634,7 @@ int dev_set_mac_address(struct net_device *dev, struct sockaddr *sa)
if (err)
return err;
dev->addr_assign_type = NET_ADDR_SET;
call_netdevice_notifiers(NETDEV_CHANGEADDR, dev);
add_device_randomness(dev->dev_addr, dev->addr_len);
return 0;
---- a/include/linux/netdevice.h
-+++ b/include/linux/netdevice.h
-@@ -1749,6 +1749,8 @@ struct net_device {
- struct netdev_hw_addr_list mc;
- struct netdev_hw_addr_list dev_addrs;
-
-+ unsigned char local_addr_mask[MAX_ADDR_LEN];
-+
- #ifdef CONFIG_SYSFS
- struct kset *queues_kset;
- #endif
---- a/include/linux/skbuff.h
-+++ b/include/linux/skbuff.h
-@@ -742,7 +742,8 @@ struct sk_buff {
- #ifdef CONFIG_NET_SWITCHDEV
- __u8 offload_fwd_mark:1;
- #endif
-- /* 2, 4 or 5 bit hole */
-+ __u8 gro_skip:1;
-+ /* 1, 3 or 4 bit hole */
-
- #ifdef CONFIG_NET_SCHED
- __u16 tc_index; /* traffic control index */
+diff --git a/net/ethernet/eth.c b/net/ethernet/eth.c
+index fbf1de965a9a..6a6d90b9a880 100644
--- a/net/ethernet/eth.c
+++ b/net/ethernet/eth.c
-@@ -143,6 +143,18 @@ u32 eth_get_headlen(void *data, unsigned
+@@ -143,6 +143,18 @@ u32 eth_get_headlen(void *data, unsigned int len)
}
EXPORT_SYMBOL(eth_get_headlen);
/**
* eth_type_trans - determine the packet's protocol ID.
* @skb: received socket data
-@@ -171,8 +183,12 @@ __be16 eth_type_trans(struct sk_buff *sk
+@@ -171,8 +183,12 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev)
skb->pkt_type = PACKET_MULTICAST;
}
else if (unlikely(!ether_addr_equal_64bits(eth->h_dest,
/*
* Some variants of DSA tagging don't have an ethertype field
+--
+2.11.0
+
From: John Crispin <blogic@openwrt.org>
-Date: Sun, 27 Jul 2014 09:40:01 +0100
Subject: NET: add mtd-mac-address support to of_get_mac_address()
Many embedded devices have information such as mac addresses stored inside mtd
+From: John Crispin <john@phrozen.org>
+Subject: net: phy: add phy_ethtool_ioctl()
+
+Signed-off-by: John Crispin <john@phrozen.org>
+---
+ drivers/net/phy/phy.c | 44 ++++++++++++++++++++++++++++++++++++++++++++
+ include/linux/phy.h | 1 +
+ 2 files changed, 45 insertions(+)
+
+diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
+index a9be26f1f677..d0a5ac1d6445 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
-@@ -466,6 +466,50 @@ int phy_ethtool_ksettings_get(struct phy
+@@ -466,6 +466,50 @@ int phy_ethtool_ksettings_get(struct phy_device *phydev,
}
EXPORT_SYMBOL(phy_ethtool_ksettings_get);
/**
* phy_mii_ioctl - generic PHY MII ioctl interface
* @phydev: the phy_device struct
+diff --git a/include/linux/phy.h b/include/linux/phy.h
+index bd22670e2182..93c1e74afc44 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
-@@ -816,6 +816,7 @@ int phy_ethtool_ksettings_get(struct phy
+@@ -813,6 +813,7 @@ int phy_ethtool_ksettings_get(struct phy_device *phydev,
struct ethtool_link_ksettings *cmd);
int phy_ethtool_ksettings_set(struct phy_device *phydev,
const struct ethtool_link_ksettings *cmd);
int phy_mii_ioctl(struct phy_device *phydev, struct ifreq *ifr, int cmd);
int phy_start_interrupts(struct phy_device *phydev);
void phy_print_status(struct phy_device *phydev);
+--
+2.11.0
+
--- /dev/null
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: generic: add detach callback to struct phy_driver
+
+lede-commit: fe61fc2d7d0b3fb348b502f68f98243b3ddf5867
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/net/phy/phy_device.c | 3 +++
+ include/linux/phy.h | 6 ++++++
+ 2 files changed, 9 insertions(+)
+
+diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
+index 14d57d0d1c04..c37d3a27e372 100644
+--- a/drivers/net/phy/phy_device.c
++++ b/drivers/net/phy/phy_device.c
+@@ -1001,6 +1001,9 @@ void phy_detach(struct phy_device *phydev)
+ struct mii_bus *bus;
+ int i;
+
++ if (phydev->drv && phydev->drv->detach)
++ phydev->drv->detach(phydev);
++
+ phydev->attached_dev->phydev = NULL;
+ phydev->attached_dev = NULL;
+ phy_suspend(phydev);
+diff --git a/include/linux/phy.h b/include/linux/phy.h
+index 93c1e74afc44..d97a418f2cf7 100644
+--- a/include/linux/phy.h
++++ b/include/linux/phy.h
+@@ -508,6 +508,12 @@ struct phy_driver {
+ */
+ int (*did_interrupt)(struct phy_device *phydev);
+
++ /*
++ * Called before an ethernet device is detached
++ * from the PHY.
++ */
++ void (*detach)(struct phy_device *phydev);
++
+ /* Clears up any memory if needed */
+ void (*remove)(struct phy_device *phydev);
+
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: net: phy: disable soft-reset for generic PHY devices to avoid accidentally clearing preinitialized state
+
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/net/phy/phy_device.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
+index c37d3a27e372..069f7ee3e65c 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
-@@ -1527,7 +1527,7 @@ int genphy_config_init(struct phy_device
+@@ -1482,7 +1482,7 @@ int genphy_config_init(struct phy_device *phydev)
return 0;
}
{
/* Do nothing for now */
return 0;
-@@ -1798,7 +1798,7 @@ static struct phy_driver genphy_driver[]
+@@ -1721,7 +1721,7 @@ static struct phy_driver genphy_driver[] = {
.phy_id = 0xffffffff,
.phy_id_mask = 0xffffffff,
.name = "Generic PHY",
.config_init = genphy_config_init,
.features = PHY_GBIT_FEATURES | SUPPORTED_MII |
SUPPORTED_AUI | SUPPORTED_FIBRE |
-@@ -1812,7 +1812,7 @@ static struct phy_driver genphy_driver[]
+@@ -1735,7 +1735,7 @@ static struct phy_driver genphy_driver[] = {
.phy_id = 0xffffffff,
.phy_id_mask = 0xffffffff,
.name = "Generic 10G PHY",
.config_init = gen10g_config_init,
.features = 0,
.config_aneg = gen10g_config_aneg,
+--
+2.11.0
+
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: net: phy: allow to configure AR803x PHYs via platform data
+
+Add a patch for the at803x phy driver, in order to be able
+to configure some register settings via platform data.
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/net/phy/at803x.c | 56 ++++++++++++++++++++++++++++++++
+ include/linux/platform_data/phy-at803x.h | 11 +++++++
+ 2 files changed, 67 insertions(+)
+ create mode 100644 include/linux/platform_data/phy-at803x.h
+
+diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c
+index c0f45dde60aa..4a55130dcb1c 100644
--- a/drivers/net/phy/at803x.c
+++ b/drivers/net/phy/at803x.c
@@ -12,12 +12,14 @@
};
struct at803x_context {
-@@ -276,8 +284,16 @@ does_not_require_reset_workaround:
+@@ -276,8 +284,16 @@ static int at803x_probe(struct phy_device *phydev)
return 0;
}
int ret;
ret = genphy_config_init(phydev);
-@@ -298,6 +314,26 @@ static int at803x_config_init(struct phy
+@@ -298,6 +314,26 @@ static int at803x_config_init(struct phy_device *phydev)
return ret;
}
return 0;
}
-@@ -335,6 +371,8 @@ static int at803x_config_intr(struct phy
+@@ -335,6 +371,8 @@ static int at803x_config_intr(struct phy_device *phydev)
static void at803x_link_change_notify(struct phy_device *phydev)
{
struct at803x_priv *priv = phydev->priv;
/*
* Conduct a hardware reset for AT8030/2 every time a link loss is
-@@ -363,6 +401,24 @@ static void at803x_link_change_notify(st
+@@ -363,6 +401,24 @@ static void at803x_link_change_notify(struct phy_device *phydev)
} else {
priv->phy_reset = false;
}
}
static int at803x_aneg_done(struct phy_device *phydev)
+diff --git a/include/linux/platform_data/phy-at803x.h b/include/linux/platform_data/phy-at803x.h
+new file mode 100644
+index 000000000000..a5df74b4f38d
--- /dev/null
+++ b/include/linux/platform_data/phy-at803x.h
@@ -0,0 +1,11 @@
+};
+
+#endif /* _PHY_AT803X_PDATA_H */
+--
+2.11.0
+
+From: Roman Yeryomin <roman@advem.lv>
+Subject: kernel: add at803x fix for sgmii mode
+
+Some (possibly broken) bootloaders incorreclty initialize at8033
+phy. This patch enables sgmii autonegotiation mode.
+
+[john@phrozen.org: felix added this to his upstream queue]
+
+Signed-off-by: Roman Yeryomin <roman@advem.lv>
+---
+ drivers/net/phy/at803x.c | 25 +++++++++++++++++++++++++
+ 1 file changed, 25 insertions(+)
+
+diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c
+index 4a55130dcb1c..434efb68bc5d 100644
--- a/drivers/net/phy/at803x.c
+++ b/drivers/net/phy/at803x.c
@@ -55,6 +55,10 @@
#define AT803X_MODE_CFG_MASK 0x0F
#define AT803X_MODE_CFG_SGMII 0x01
-@@ -295,6 +299,27 @@ static int at803x_config_init(struct phy
+@@ -295,6 +299,27 @@ static int at803x_config_init(struct phy_device *phydev)
{
struct at803x_platform_data *pdata;
int ret;
ret = genphy_config_init(phydev);
if (ret < 0)
+--
+2.11.0
+
+From: Gabor Juhos <juhosg@openwrt.org>
+Subject: debloat: add kernel config option to disabling common PCI quirks
+
+Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
+---
+ drivers/pci/Kconfig | 6 ++++++
+ drivers/pci/quirks.c | 6 ++++++
+ 2 files changed, 12 insertions(+)
+
+diff --git a/drivers/pci/Kconfig b/drivers/pci/Kconfig
+index 6555eb78d91c..120fe3921820 100644
--- a/drivers/pci/Kconfig
+++ b/drivers/pci/Kconfig
@@ -71,6 +71,12 @@ config XEN_PCIDEV_FRONTEND
config HT_IRQ
bool "Interrupts on hypertransport devices"
default y
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 5d8151b43fbb..cb356e78e743 100644
--- a/drivers/pci/quirks.c
+++ b/drivers/pci/quirks.c
-@@ -41,6 +41,7 @@ static void quirk_mmio_always_on(struct
+@@ -41,6 +41,7 @@ static void quirk_mmio_always_on(struct pci_dev *dev)
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_ANY_ID, PCI_ANY_ID,
PCI_CLASS_BRIDGE_HOST, 8, quirk_mmio_always_on);
/* The Mellanox Tavor device gives false positive parity errors
* Mark this device with a broken_parity_status, to allow
* PCI scanning code to "skip" this now blacklisted device.
-@@ -3038,6 +3039,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_I
+@@ -3038,6 +3039,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f8, quirk_intel_mc_errata);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65f9, quirk_intel_mc_errata);
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x65fa, quirk_intel_mc_errata);
/*
* Ivytown NTB BAR sizes are misreported by the hardware due to an erratum. To
-@@ -3094,6 +3096,8 @@ static void fixup_debug_report(struct pc
+@@ -3094,6 +3096,8 @@ static void fixup_debug_report(struct pci_dev *dev, ktime_t calltime,
}
}
/*
* Some BIOS implementations leave the Intel GPU interrupts enabled,
* even though no one is handling them (f.e. i915 driver is never loaded).
-@@ -3128,6 +3132,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_IN
+@@ -3128,6 +3132,8 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0102, disable_igfx_irq);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x010a, disable_igfx_irq);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x0152, disable_igfx_irq);
/*
* PCI devices which are on Intel chips can skip the 10ms delay
* before entering D3 mode.
+--
+2.11.0
+
+From: Felix Fietkau <nbd@nbd.name>
+Subject: debloat: disable common USB quirks
---- a/drivers/usb/host/pci-quirks.c
-+++ b/drivers/usb/host/pci-quirks.c
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ drivers/usb/host/pci-quirks.c | 16 ++++++++++++++++
+ drivers/usb/host/pci-quirks.h | 18 +++++++++++++++++-
+ include/linux/usb/hcd.h | 7 +++++++
+ 3 files changed, 40 insertions(+), 1 deletion(-)
+
+Index: linux-4.9.40/drivers/usb/host/pci-quirks.c
+===================================================================
+--- linux-4.9.40.orig/drivers/usb/host/pci-quirks.c
++++ linux-4.9.40/drivers/usb/host/pci-quirks.c
@@ -106,6 +106,8 @@ struct amd_chipset_type {
u8 rev;
};
DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,
PCI_CLASS_SERIAL_USB, 8, quirk_usb_early_handoff);
+#endif
---- a/drivers/usb/host/pci-quirks.h
-+++ b/drivers/usb/host/pci-quirks.h
+Index: linux-4.9.40/drivers/usb/host/pci-quirks.h
+===================================================================
+--- linux-4.9.40.orig/drivers/usb/host/pci-quirks.h
++++ linux-4.9.40/drivers/usb/host/pci-quirks.h
@@ -4,6 +4,9 @@
#ifdef CONFIG_PCI
void uhci_reset_hc(struct pci_dev *pdev, unsigned long base);
static inline void usb_amd_dev_put(void) {}
static inline void usb_disable_xhci_ports(struct pci_dev *xhci_pdev) {}
static inline void sb800_prefetch(struct device *dev, int on) {}
--#endif /* CONFIG_PCI */
+static inline void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev) {}
-+#endif
+ #endif /* CONFIG_PCI */
#endif /* __LINUX_USB_PCI_QUIRKS_H */
---- a/include/linux/usb/hcd.h
-+++ b/include/linux/usb/hcd.h
+Index: linux-4.9.40/include/linux/usb/hcd.h
+===================================================================
+--- linux-4.9.40.orig/include/linux/usb/hcd.h
++++ linux-4.9.40/include/linux/usb/hcd.h
@@ -461,7 +461,14 @@ extern int usb_hcd_pci_probe(struct pci_
extern void usb_hcd_pci_remove(struct pci_dev *dev);
extern void usb_hcd_pci_shutdown(struct pci_dev *dev);
-From f13ad28ba4280d2283ca2b49f0bd384bc51e6a68 Mon Sep 17 00:00:00 2001
From: Alexey Brodkin <abrodkin@synopsys.com>
-Date: Tue, 5 Jul 2016 14:28:31 +0300
-Subject: [PATCH] usb: Remove annoying warning about bogus URB
+Subject: usb: Remove annoying warning about bogus URB
When ath9k-htc Wi-Fi dongle is used with generic OHCI controller
infinite stream of warnings appears in debug console like this:
--- /dev/null
+From: Alexey Brodkin <abrodkin@synopsys.com>
+Subject: usb: Remove annoying warning about bogus URB
+
+When ath9k-htc Wi-Fi dongle is used with generic OHCI controller
+infinite stream of warnings appears in debug console like this:
+-------------------------->8----------------------
+usb 1-1: new full-speed USB device number 2 using ohci-platform
+usb 1-1: ath9k_htc: Firmware ath9k_htc/htc_9271-1.4.0.fw requested
+usb 1-1: ath9k_htc: Transferred FW: ath9k_htc/htc_9271-1.4.0.fw, size:
+51008
+------------[ cut here ]------------
+WARNING: CPU: 0 PID: 19 at drivers/usb/core/urb.c:449
+usb_submit_urb+0x1b4/0x498()
+usb 1-1: BOGUS urb xfer, pipe 1 != type 3
+Modules linked in:
+CPU: 0 PID: 19 Comm: kworker/0:1 Not tainted
+4.4.0-rc4-00017-g00e2d79-dirty #3
+Workqueue: events request_firmware_work_func
+
+Stack Trace:
+arc_unwind_core.constprop.1+0xa4/0x110
+---[ end trace 649ef8c342817fc2 ]---
+------------[ cut here ]------------
+WARNING: CPU: 0 PID: 19 at drivers/usb/core/urb.c:449
+usb_submit_urb+0x1b4/0x498()
+usb 1-1: BOGUS urb xfer, pipe 1 != type 3
+Modules linked in:
+CPU: 0 PID: 19 Comm: kworker/0:1 Tainted: G W
+4.4.0-rc4-00017-g00e2d79-dirty #3
+Workqueue: events request_firmware_work_func
+
+Stack Trace:
+arc_unwind_core.constprop.1+0xa4/0x110
+---[ end trace 649ef8c342817fc3 ]---
+------------[ cut here ]------------
+-------------------------->8----------------------
+
+There're some discussions in mailing lists proposing to disable
+that particular check alltogether and magically all seem to work
+fine with muted warning.
+
+Anyways new thread on that regard could be found here:
+http://lists.infradead.org/pipermail/linux-snps-arc/2016-July/001310.html
+
+Let's see what comes out of that new discussion, hopefully patching
+of generic USB stuff won't be required then.
+
+Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
+---
+ drivers/leds/Makefile | 1 +
+ drivers/leds/trigger/Kconfig | 7 +++++++
+ 2 files changed, 8 insertions(+)
+
+diff --git a/drivers/leds/Makefile b/drivers/leds/Makefile
+index 3965070190f5..6273d7e29eab 100644
+--- a/drivers/leds/Makefile
++++ b/drivers/leds/Makefile
+@@ -77,3 +77,4 @@ obj-$(CONFIG_LEDS_DAC124S085) += leds-dac124s085.o
+
+ # LED Triggers
+ obj-$(CONFIG_LEDS_TRIGGERS) += trigger/
++obj-$(CONFIG_LEDS_TRIGGER_NETDEV) += ledtrig-netdev.o
+diff --git a/drivers/leds/trigger/Kconfig b/drivers/leds/trigger/Kconfig
+index 3f9ddb9fafa7..4ec185389324 100644
+--- a/drivers/leds/trigger/Kconfig
++++ b/drivers/leds/trigger/Kconfig
+@@ -126,4 +126,11 @@ config LEDS_TRIGGER_PANIC
+ a different trigger.
+ If unsure, say Y.
+
++config LEDS_TRIGGER_NETDEV
++ tristate "LED Netdev Trigger"
++ depends on NET && LEDS_TRIGGERS
++ help
++ This allows LEDs to be controlled by network device activity.
++ If unsure, say Y.
++
+ endif # LEDS_TRIGGERS
+--
+2.11.0
+
-From 52cfd51cdf6a6e14d4fb270c6343abac3bac00f4 Mon Sep 17 00:00:00 2001
From: Daniel Golle <daniel@makrotopia.org>
-Date: Fri, 12 Dec 2014 13:38:33 +0100
-Subject: [PATCH] libata: add ledtrig support
-To: linux-ide@vger.kernel.org,
- Tejun Heo <tj@kernel.org>
+Subject: libata: add ledtrig support
This adds a LED trigger for each ATA port indicating disk activity.
--- /dev/null
+From: John Crispin <john@phrozen.org>
+Subject: serial: do not accept sysrq characters via serial port
+
+many embedded boards have a disconnected TTL level serial which can
+generate some garbage that can lead to spurious false sysrq detects.
+
+[john@phrozen.org: sent upstream 22.12.2016]
+
+Signed-off-by: John Crispin <john@phrozen.org>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+---
+ include/linux/serial_core.h | 2 +-
+ lib/Kconfig.debug | 5 +++++
+ 2 files changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
+index 344201437017..7e6165bc1cef 100644
+--- a/include/linux/serial_core.h
++++ b/include/linux/serial_core.h
+@@ -448,7 +448,7 @@ extern void uart_handle_cts_change(struct uart_port *uport,
+ extern void uart_insert_char(struct uart_port *port, unsigned int status,
+ unsigned int overrun, unsigned int ch, unsigned int flag);
+
+-#ifdef SUPPORT_SYSRQ
++#if defined(SUPPORT_SYSRQ) && defined(CONFIG_MAGIC_SYSRQ_SERIAL)
+ static inline int
+ uart_handle_sysrq_char(struct uart_port *port, unsigned int ch)
+ {
+diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
+index a6c8db1d62f6..062c580cdd68 100644
+--- a/lib/Kconfig.debug
++++ b/lib/Kconfig.debug
+@@ -397,6 +397,11 @@ config MAGIC_SYSRQ_DEFAULT_ENABLE
+ This may be set to 1 or 0 to enable or disable them all, or
+ to a bitmask as described in Documentation/sysrq.txt.
+
++config MAGIC_SYSRQ_SERIAL
++ bool "Enable magic SysRq key over serial"
++ depends on MAGIC_SYSRQ
++ default y
++
+ config DEBUG_KERNEL
+ bool "Kernel debugging"
+ help
+--
+2.11.0
+
+From: Imre Kaloz <kaloz@openwrt.org>
+Subject: init: add CONFIG_MANGLE_BOOTARGS and disable it by default
+
+Enabling this option renames the bootloader supplied root=
+and rootfstype= variables, which might have to be know but
+would break the automatisms OpenWrt uses.
+
+Signed-off-by: Imre Kaloz <kaloz@openwrt.org>
+---
+ init/Kconfig | 9 +++++++++
+ init/main.c | 24 ++++++++++++++++++++++++
+ 2 files changed, 33 insertions(+)
+
+diff --git a/init/Kconfig b/init/Kconfig
+index 9063c81b9665..fb66d3ef78e0 100644
+--- a/init/Kconfig
++++ b/init/Kconfig
+@@ -1687,6 +1687,15 @@ config EMBEDDED
+ an embedded system so certain expert options are available
+ for configuration.
+
++config MANGLE_BOOTARGS
++ bool "Rename offending bootargs"
++ depends on EXPERT
++ help
++ Sometimes the bootloader passed bogus root= and rootfstype=
++ parameters to the kernel, and while you want to ignore them,
++ you need to know the values f.e. to support dual firmware
++ layouts on the flash.
++
+ config HAVE_PERF_EVENTS
+ bool
+ help
+diff --git a/init/main.c b/init/main.c
+index ae3996ae9bac..3855fa4ffb95 100644
--- a/init/main.c
+++ b/init/main.c
-@@ -352,6 +352,29 @@ static inline void setup_nr_cpu_ids(void
+@@ -352,6 +352,29 @@ static inline void setup_nr_cpu_ids(void) { }
static inline void smp_prepare_cpus(unsigned int maxcpus) { }
#endif
/*
* We need to store the untouched command line for future reference.
* We also need to store the touched command line since the parameter
-@@ -504,6 +527,7 @@ asmlinkage __visible void __init start_k
+@@ -504,6 +527,7 @@ asmlinkage __visible void __init start_kernel(void)
pr_notice("%s", linux_banner);
setup_arch(&command_line);
mm_init_cpumask(&init_mm);
setup_command_line(command_line);
setup_nr_cpu_ids();
setup_per_cpu_areas();
---- a/init/Kconfig
-+++ b/init/Kconfig
-@@ -1697,6 +1697,15 @@ config EMBEDDED
- an embedded system so certain expert options are available
- for configuration.
-
-+config MANGLE_BOOTARGS
-+ bool "Rename offending bootargs"
-+ depends on EXPERT
-+ help
-+ Sometimes the bootloader passed bogus root= and rootfstype=
-+ parameters to the kernel, and while you want to ignore them,
-+ you need to know the values f.e. to support dual firmware
-+ layouts on the flash.
-+
- config HAVE_PERF_EVENTS
- bool
- help
+--
+2.11.0
+