kernel: make the kernel 3.18 patches apply and boot on arm.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>

SVN-Revision: 43095
v19.07.3_mercusys_ac12_duma
Hauke Mehrtens 10 years ago
parent cea2b5299b
commit a76ee3b1d5

@ -51,14 +51,15 @@ Signed-off-by: Florian Fainelli <florian@openwrt.org>
/*
--- a/drivers/usb/host/ehci-platform.c
+++ b/drivers/usb/host/ehci-platform.c
@@ -57,6 +57,7 @@ static int ehci_platform_reset(struct us
@@ -226,6 +226,8 @@ static int ehci_platform_probe(struct pl
ehci->big_endian_desc = 1;
if (pdata->big_endian_mmio)
ehci->big_endian_mmio = 1;
+ if (pdata->ignore_oc)
+ ehci->ignore_oc = 1;
hcd->has_tt = pdata->has_tt;
ehci->has_synopsys_hc_bug = pdata->has_synopsys_hc_bug;
+ ehci->ignore_oc = pdata->ignore_oc;
if (pdata->pre_setup) {
retval = pdata->pre_setup(hcd);
#ifndef CONFIG_USB_EHCI_BIG_ENDIAN_MMIO
if (ehci->big_endian_mmio) {
--- a/drivers/usb/host/ehci.h
+++ b/drivers/usb/host/ehci.h
@@ -226,6 +226,7 @@ struct ehci_hcd { /* one per controlle

@ -1,13 +1,13 @@
--- a/scripts/kallsyms.c
+++ b/scripts/kallsyms.c
@@ -59,6 +59,7 @@ static struct sym_entry *table;
@@ -58,6 +58,7 @@ static struct addr_range percpu_range =
static struct sym_entry *table;
static unsigned int table_size, table_cnt;
static int all_symbols = 0;
static int absolute_percpu = 0;
+static int uncompressed = 0;
static int absolute_percpu = 0;
static char symbol_prefix_char = '\0';
static unsigned long long kernel_start_addr = 0;
@@ -392,6 +393,9 @@ static void write_src(void)
free(markers);

@ -50,7 +50,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -87,7 +87,7 @@
@@ -89,7 +89,7 @@
#ifdef CONFIG_FTRACE_MCOUNT_RECORD
#define MCOUNT_REC() . = ALIGN(8); \
VMLINUX_SYMBOL(__start_mcount_loc) = .; \
@ -59,7 +59,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__stop_mcount_loc) = .;
#else
#define MCOUNT_REC()
@@ -95,7 +95,7 @@
@@ -97,7 +97,7 @@
#ifdef CONFIG_TRACE_BRANCH_PROFILING
#define LIKELY_PROFILE() VMLINUX_SYMBOL(__start_annotated_branch_profile) = .; \
@ -68,7 +68,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__stop_annotated_branch_profile) = .;
#else
#define LIKELY_PROFILE()
@@ -103,7 +103,7 @@
@@ -105,7 +105,7 @@
#ifdef CONFIG_PROFILE_ALL_BRANCHES
#define BRANCH_PROFILE() VMLINUX_SYMBOL(__start_branch_profile) = .; \
@ -77,7 +77,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__stop_branch_profile) = .;
#else
#define BRANCH_PROFILE()
@@ -112,7 +112,7 @@
@@ -123,7 +123,7 @@
#ifdef CONFIG_EVENT_TRACING
#define FTRACE_EVENTS() . = ALIGN(8); \
VMLINUX_SYMBOL(__start_ftrace_events) = .; \
@ -86,7 +86,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__stop_ftrace_events) = .;
#else
#define FTRACE_EVENTS()
@@ -120,7 +120,7 @@
@@ -131,7 +131,7 @@
#ifdef CONFIG_TRACING
#define TRACE_PRINTKS() VMLINUX_SYMBOL(__start___trace_bprintk_fmt) = .; \
@ -95,7 +95,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__stop___trace_bprintk_fmt) = .;
#define TRACEPOINT_STR() VMLINUX_SYMBOL(__start___tracepoint_str) = .; \
*(__tracepoint_str) /* Trace_printk fmt' pointer */ \
@@ -133,7 +133,7 @@
@@ -144,7 +144,7 @@
#ifdef CONFIG_FTRACE_SYSCALLS
#define TRACE_SYSCALLS() . = ALIGN(8); \
VMLINUX_SYMBOL(__start_syscalls_metadata) = .; \
@ -104,40 +104,18 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__stop_syscalls_metadata) = .;
#else
#define TRACE_SYSCALLS()
@@ -142,8 +142,8 @@
#ifdef CONFIG_CLKSRC_OF
#define CLKSRC_OF_TABLES() . = ALIGN(8); \
VMLINUX_SYMBOL(__clksrc_of_table) = .; \
- *(__clksrc_of_table) \
- *(__clksrc_of_table_end)
+ KEEP(*(__clksrc_of_table)) \
+ KEEP(*(__clksrc_of_table_end))
#else
#define CLKSRC_OF_TABLES()
#endif
@@ -152,8 +152,8 @@
#define IRQCHIP_OF_MATCH_TABLE() \
@@ -158,8 +158,8 @@
#define _OF_TABLE_1(name) \
. = ALIGN(8); \
VMLINUX_SYMBOL(__irqchip_begin) = .; \
- *(__irqchip_of_table) \
- *(__irqchip_of_end)
+ KEEP(*(__irqchip_of_table)) \
+ KEEP(*(__irqchip_of_end))
#else
#define IRQCHIP_OF_MATCH_TABLE()
#endif
@@ -161,8 +161,8 @@
#ifdef CONFIG_COMMON_CLK
#define CLK_OF_TABLES() . = ALIGN(8); \
VMLINUX_SYMBOL(__clk_of_table) = .; \
- *(__clk_of_table) \
- *(__clk_of_table_end)
+ KEEP(*(__clk_of_table)) \
+ KEEP(*(__clk_of_table_end))
#else
#define CLK_OF_TABLES()
#endif
@@ -170,7 +170,7 @@
VMLINUX_SYMBOL(__##name##_of_table) = .; \
- *(__##name##_of_table) \
- *(__##name##_of_table_end)
+ KEEP(*(__##name##_of_table)) \
+ KEEP(*(__##name##_of_table_end))
#define CLKSRC_OF_TABLES() OF_TABLE(CONFIG_CLKSRC_OF, clksrc)
#define IRQCHIP_OF_MATCH_TABLE() OF_TABLE(CONFIG_IRQCHIP, irqchip)
@@ -171,7 +171,7 @@
#define KERNEL_DTB() \
STRUCT_ALIGN(); \
VMLINUX_SYMBOL(__dtb_start) = .; \
@ -146,7 +124,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__dtb_end) = .;
/* .data section */
@@ -186,16 +186,17 @@
@@ -187,16 +187,17 @@
/* implement dynamic printk debug */ \
. = ALIGN(8); \
VMLINUX_SYMBOL(__start___jump_table) = .; \
@ -167,7 +145,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
/*
* Data section helpers
@@ -249,32 +250,32 @@
@@ -250,35 +251,35 @@
/* PCI quirks */ \
.pci_fixup : AT(ADDR(.pci_fixup) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start_pci_fixups_early) = .; \
@ -198,6 +176,10 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
- *(.pci_fixup_suspend) \
+ KEEP(*(.pci_fixup_suspend)) \
VMLINUX_SYMBOL(__end_pci_fixups_suspend) = .; \
VMLINUX_SYMBOL(__start_pci_fixups_suspend_late) = .; \
- *(.pci_fixup_suspend_late) \
+ KEEP(*(.pci_fixup_suspend_late)) \
VMLINUX_SYMBOL(__end_pci_fixups_suspend_late) = .; \
} \
\
/* Built-in firmware blobs */ \
@ -208,7 +190,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__end_builtin_fw) = .; \
} \
\
@@ -283,49 +284,49 @@
@@ -287,49 +288,49 @@
/* Kernel symbol table: Normal symbols */ \
__ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start___ksymtab) = .; \
@ -265,7 +247,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__stop___kcrctab_gpl) = .; \
} \
\
@@ -339,14 +340,14 @@
@@ -343,14 +344,14 @@
/* Kernel symbol table: GPL-only unused symbols */ \
__kcrctab_unused_gpl : AT(ADDR(__kcrctab_unused_gpl) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start___kcrctab_unused_gpl) = .; \
@ -282,7 +264,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__stop___kcrctab_gpl_future) = .; \
} \
\
@@ -365,14 +366,14 @@
@@ -369,14 +370,14 @@
/* Built-in module parameters. */ \
__param : AT(ADDR(__param) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start___param) = .; \
@ -299,7 +281,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__stop___modver) = .; \
. = ALIGN((align)); \
VMLINUX_SYMBOL(__end_rodata) = .; \
@@ -428,7 +429,7 @@
@@ -432,7 +433,7 @@
#define ENTRY_TEXT \
ALIGN_FUNCTION(); \
VMLINUX_SYMBOL(__entry_text_start) = .; \
@ -308,7 +290,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__entry_text_end) = .;
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
@@ -456,7 +457,7 @@
@@ -460,7 +461,7 @@
. = ALIGN(align); \
__ex_table : AT(ADDR(__ex_table) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start___ex_table) = .; \
@ -317,7 +299,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__stop___ex_table) = .; \
}
@@ -472,8 +473,8 @@
@@ -476,8 +477,8 @@
#ifdef CONFIG_CONSTRUCTORS
#define KERNEL_CTORS() . = ALIGN(8); \
VMLINUX_SYMBOL(__ctors_start) = .; \
@ -328,7 +310,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__ctors_end) = .;
#else
#define KERNEL_CTORS()
@@ -517,7 +518,7 @@
@@ -525,7 +526,7 @@
#define SBSS(sbss_align) \
. = ALIGN(sbss_align); \
.sbss : AT(ADDR(.sbss) - LOAD_OFFSET) { \
@ -337,7 +319,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
*(.scommon) \
}
@@ -535,7 +536,7 @@
@@ -543,7 +544,7 @@
BSS_FIRST_SECTIONS \
*(.bss..page_aligned) \
*(.dynbss) \
@ -346,7 +328,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
*(COMMON) \
}
@@ -596,7 +597,7 @@
@@ -604,7 +605,7 @@
. = ALIGN(4); \
.tracedata : AT(ADDR(.tracedata) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__tracedata_start) = .; \
@ -355,7 +337,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
VMLINUX_SYMBOL(__tracedata_end) = .; \
}
#else
@@ -613,17 +614,17 @@
@@ -621,17 +622,17 @@
#define INIT_SETUP(initsetup_align) \
. = ALIGN(initsetup_align); \
VMLINUX_SYMBOL(__setup_start) = .; \
@ -377,7 +359,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
INIT_CALLS_LEVEL(0) \
INIT_CALLS_LEVEL(1) \
INIT_CALLS_LEVEL(2) \
@@ -637,21 +638,21 @@
@@ -645,21 +646,21 @@
#define CON_INITCALL \
VMLINUX_SYMBOL(__con_initcall_start) = .; \
@ -521,7 +503,7 @@ Signed-off-by: Gabor Juhos <juhosg@openwrt.org>
.init.data : {
--- a/arch/arm/boot/compressed/Makefile
+++ b/arch/arm/boot/compressed/Makefile
@@ -120,6 +120,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
@@ -122,6 +122,7 @@ ifeq ($(CONFIG_FUNCTION_TRACER),y)
ORIG_CFLAGS := $(KBUILD_CFLAGS)
KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
endif

@ -1,6 +1,6 @@
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -52,6 +52,16 @@
@@ -54,6 +54,16 @@
#define LOAD_OFFSET 0
#endif
@ -17,7 +17,7 @@
#include <linux/export.h>
/* Align . to a 8 byte boundary equals to maximum function alignment. */
@@ -284,14 +294,14 @@
@@ -288,14 +298,14 @@
/* Kernel symbol table: Normal symbols */ \
__ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \
VMLINUX_SYMBOL(__start___ksymtab) = .; \
@ -34,7 +34,7 @@
VMLINUX_SYMBOL(__stop___ksymtab_gpl) = .; \
} \
\
@@ -353,7 +363,7 @@
@@ -357,7 +367,7 @@
\
/* Kernel symbol table: strings */ \
__ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \
@ -43,7 +43,7 @@
} \
\
/* __*init sections */ \
@@ -671,6 +681,8 @@
@@ -679,6 +689,8 @@
EXIT_TEXT \
EXIT_DATA \
EXIT_CALL \
@ -54,7 +54,7 @@
}
--- a/scripts/Makefile.build
+++ b/scripts/Makefile.build
@@ -349,7 +349,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $(
@@ -298,7 +298,7 @@ targets += $(extra-y) $(MAKECMDGOALS) $(
# Linker scripts preprocessor (.lds.S -> .lds)
# ---------------------------------------------------------------------------
quiet_cmd_cpp_lds_S = LDS $@

@ -1,6 +1,6 @@
--- a/drivers/base/regmap/Kconfig
+++ b/drivers/base/regmap/Kconfig
@@ -3,23 +3,28 @@
@@ -3,26 +3,31 @@
# subsystems should select the appropriate symbols.
config REGMAP
@ -13,18 +13,21 @@
config REGMAP_I2C
- tristate
+ select REGMAP
+ tristate "Regmap I2C
+ select REGMAP
depends on I2C
config REGMAP_SPI
- tristate
+ tristate "Regmap SPI"
+ select REGMAP
+ depends on SPI_MASTER
+ tristate "Regmap SPI"
depends on SPI
config REGMAP_SPMI
+ select REGMAP
tristate
depends on SPMI
config REGMAP_MMIO
+ select REGMAP
@ -67,8 +70,8 @@
+#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/err.h>
#include <linux/rbtree.h>
@@ -2247,3 +2248,5 @@ static int __init regmap_initcall(void)
#include <linux/of.h>
@@ -2635,3 +2636,5 @@ static int __init regmap_initcall(void)
return 0;
}
postcore_initcall(regmap_initcall);

@ -7,5 +7,5 @@
-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
LDFLAGS_vmlinux += -G 0 -static -n -nostdlib --gc-sections --sort-section=name
KBUILD_AFLAGS_MODULE += -mlong-calls

@ -1,160 +1,105 @@
MIPS: allow disabling the kernel FPU emulator
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 patch allows turning off the in-kernel Algorithmics
FPU emulator support, which allows one to save a couple of
precious blocks on an embedded system.
This small patch makes the MIPS FPU emulator optional. The kernel
kills float-users on systems without a hardware FPU by sending a SIGILL.
Disabling the emulator shrinks vmlinux by about 54kBytes (32bit,
optimizing for size).
Signed-off-by: Manuel Lauss <manuel.lauss@gmail.com>
---
v4: rediffed because of patch 1/2, should now work with micromips as well
v3: updated patch description with size savings.
v2: incorporated changes suggested by Jonas Gorski
force the fpu emulator on for micromips: relocating the parts
of the mmips code in the emulator to other areas would be a
much larger change; I went the cheap route instead with this.
arch/mips/Kbuild | 2 +-
arch/mips/Kconfig | 14 ++++++++++++++
arch/mips/include/asm/fpu.h | 5 +++--
arch/mips/include/asm/fpu_emulator.h | 15 +++++++++++++++
4 files changed, 33 insertions(+), 3 deletions(-)
Signed-off-by: Florian Fainelli <florian@openwrt.org>
--
--- a/arch/mips/Kconfig
+++ b/arch/mips/Kconfig
@@ -934,6 +934,17 @@ config I8259
config MIPS_BONITO64
bool
@@ -2484,6 +2484,20 @@ config MIPS_O32_FP64_SUPPORT
If unsure, say N.
+config MIPS_FPU_EMU
+ bool "Enable FPU emulation"
+config MIPS_FPU_EMULATOR
+ bool "MIPS FPU Emulator"
+ default y
+ help
+ This option allows building a kernel with or without the Algorithmics
+ FPU emulator enabled. Turning off this option results in a kernel which
+ does not catch floating operations exceptions. Make sure that your toolchain
+ is configured to enable software floating point emulation in that case.
+ This option lets you disable the built-in MIPS FPU (Coprocessor 1)
+ emulator, which handles floating-point instructions on processors
+ without a hardware FPU. It is generally a good idea to keep the
+ emulator built-in, unless you are perfectly sure you have a
+ complete soft-float environment. With the emulator disabled, all
+ users of float operations will be killed with an illegal instr-
+ uction exception.
+
+ If unsure say Y here.
+ Say Y, please.
+
config MIPS_MSC
config USE_OF
bool
select OF
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -266,7 +266,7 @@ OBJCOPYFLAGS += --remove-section=.regin
head-y := arch/mips/kernel/head.o
--- a/arch/mips/math-emu/Makefile
+++ b/arch/mips/math-emu/Makefile
@@ -2,10 +2,12 @@
# Makefile for the Linux/MIPS kernel FPU emulation.
#
libs-y += arch/mips/lib/
-libs-y += arch/mips/math-emu/
+libs-$(CONFIG_MIPS_FPU_EMULATOR) += arch/mips/math-emu/
-obj-y := cp1emu.o ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
+obj-y := kernel_linkage.o
+
+obj-$(CONFIG_MIPS_FPU_EMU) += ieee754m.o ieee754d.o ieee754dp.o ieee754sp.o ieee754.o \
ieee754xcpt.o dp_frexp.o dp_modf.o dp_div.o dp_mul.o dp_sub.o \
dp_add.o dp_fsp.o dp_cmp.o dp_logb.o dp_scalb.o dp_simple.o \
dp_tint.o dp_fint.o dp_tlong.o dp_flong.o sp_frexp.o sp_modf.o \
sp_div.o sp_mul.o sp_sub.o sp_add.o sp_fdp.o sp_cmp.o sp_logb.o \
sp_scalb.o sp_simple.o sp_tint.o sp_fint.o sp_tlong.o sp_flong.o \
- dp_sqrt.o sp_sqrt.o kernel_linkage.o dsemul.o
+ dp_sqrt.o sp_sqrt.o dsemul.o cp1emu.o
--- a/arch/mips/math-emu/kernel_linkage.c
+++ b/arch/mips/math-emu/kernel_linkage.c
@@ -29,6 +29,7 @@
# See arch/mips/Kbuild for content of core part of the kernel
core-y += arch/mips/
--- a/arch/mips/include/asm/fpu.h
+++ b/arch/mips/include/asm/fpu.h
@@ -168,8 +168,10 @@ static inline int init_fpu(void)
ret = __own_fpu();
if (!ret)
_init_fpu();
- } else
+ } else if (IS_ENABLED(CONFIG_MIPS_FPU_EMULATOR))
fpu_emulator_init_fpu();
+ else
+ ret = SIGILL;
#define SIGNALLING_NAN 0x7ff800007ff80000LL
+#ifdef CONFIG_MIPS_FPU_EMU
void fpu_emulator_init_fpu(void)
{
static int first = 1;
@@ -115,3 +116,36 @@ int fpu_emulator_restore_context32(struc
return err;
return ret;
}
#endif
+
+#else
+
+void fpu_emulator_init_fpu(void)
+{
+ printk(KERN_INFO "FPU emulator disabled, make sure your toolchain"
+ "was compiled with software floating point support (soft-float)\n");
+ return;
+}
+
+int fpu_emulator_save_context(struct sigcontext __user *sc)
+{
+ return 0;
+}
+
+int fpu_emulator_restore_context(struct sigcontext __user *sc)
+{
+ return 0;
+}
+
+#ifdef CONFIG_64BIT
+int fpu_emulator_save_context32(struct sigcontext32 __user *sc)
+{
+ return 0;
+}
+
+int fpu_emulator_restore_context32(struct sigcontext32 __user *sc)
+{
+ return 0;
+}
+#endif /* CONFIG_64BIT */
+
+#endif /* CONFIG_MIPS_FPU_EMU */
--- a/arch/mips/include/asm/fpu_emulator.h
+++ b/arch/mips/include/asm/fpu_emulator.h
@@ -27,6 +27,8 @@
#include <asm/inst.h>
@@ -30,6 +30,7 @@
#include <asm/local.h>
#include <asm/processor.h>
+#ifdef CONFIG_MIPS_FPU_EMU
+
+#ifdef CONFIG_MIPS_FPU_EMULATOR
#ifdef CONFIG_DEBUG_FS
struct mips_fpu_emulator_stats {
@@ -60,6 +62,38 @@ extern int fpu_emulator_cop1Handler(stru
int process_fpemu_return(int sig, void __user *fault_addr);
int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
unsigned long *contpc);
+#else
+static inline int mips_dsemul(struct pt_regs *regs, mips_instruction ir,
+ unsigned long cpc)
+{
+ return 0;
+}
+
@@ -65,6 +66,20 @@ extern int do_dsemulret(struct pt_regs *
extern int fpu_emulator_cop1Handler(struct pt_regs *xcp,
struct mips_fpu_struct *ctx, int has_fpu,
void *__user *fault_addr);
+#else /* no CONFIG_MIPS_FPU_EMULATOR */
+static inline int do_dsemulret(struct pt_regs *xcp)
+{
+ return 0;
+ return 0; /* 0 means error, should never get here anyway */
+}
+
+static inline int fpu_emulator_cop1Handler(struct pt_regs *xcp,
+ struct mips_fpu_struct *ctx,
+ int has_fpu,
+ void *__user *fault_addr)
+{
+ return 0;
+}
+
+static inline int process_fpemu_return(int sig, void __user *fault_addr)
+ struct mips_fpu_struct *ctx, int has_fpu,
+ void *__user *fault_addr)
+{
+ return -EINVAL;
+ return SIGILL; /* we don't speak MIPS FPU */
+}
+#endif /* CONFIG_MIPS_FPU_EMULATOR */
+
+static inline int mm_isBranchInstr(struct pt_regs *regs,
+ struct mm_decoded_insn dec_insn,
+ unsigned long *contpc)
+{
+ return 0;
+}
+#endif /* CONFIG_MIPS_FPU_EMU */
/*
* Instruction inserted following the badinst to further tag the sequence
--- a/arch/mips/kernel/traps.c
+++ b/arch/mips/kernel/traps.c
@@ -701,6 +701,7 @@ asmlinkage void do_ov(struct pt_regs *re
exception_exit(prev_state);
}
+#ifdef CONFIG_MIPS_FPU_EMU
int process_fpemu_return(int sig, void __user *fault_addr)
{
if (sig == SIGSEGV || sig == SIGBUS) {
@@ -724,6 +725,7 @@ int process_fpemu_return(int sig, void _
return 0;
}
}
+#endif /* CONFIG_MIPS_FPU_EMU */
/*
* XXX Delayed fp exceptions when doing a lazy ctx switch XXX
int process_fpemu_return(int sig, void __user *fault_addr);
int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
unsigned long *contpc);

@ -3,7 +3,7 @@
@@ -90,8 +90,13 @@ all-$(CONFIG_SYS_SUPPORTS_ZBOOT)+= vmlin
cflags-y += -G 0 -mno-abicalls -fno-pic -pipe -mno-branch-likely
cflags-y += -msoft-float
LDFLAGS_vmlinux += -G 0 -static -n -nostdlib
LDFLAGS_vmlinux += -G 0 -static -n -nostdlib --gc-sections --sort-section=name
+ifdef CONFIG_64BIT
KBUILD_AFLAGS_MODULE += -mlong-calls
KBUILD_CFLAGS_MODULE += -mlong-calls
@ -12,8 +12,8 @@
+KBUILD_CFLAGS_MODULE += -mno-long-calls
+endif
cflags-y += -ffreestanding
ifndef CONFIG_FUNCTION_TRACER
KBUILD_CFLAGS_KERNEL += -ffunction-sections -fdata-sections
--- a/arch/mips/include/asm/module.h
+++ b/arch/mips/include/asm/module.h
@@ -11,6 +11,11 @@ struct mod_arch_specific {

@ -8,10 +8,10 @@
#include <linux/mutex.h>
#include <linux/mount.h>
#include <linux/slab.h>
@@ -210,11 +211,12 @@ static void block2mtd_free_device(struct
@@ -209,11 +210,12 @@ static void block2mtd_free_device(struct
}
/* FIXME: ensure that mtd->size % erase_size == 0 */
-static struct block2mtd_dev *add_device(char *devname, int erase_size)
+static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
{
@ -22,7 +22,7 @@
char *name;
if (!devname)
@@ -253,13 +255,16 @@ static struct block2mtd_dev *add_device(
@@ -257,13 +259,16 @@ static struct block2mtd_dev *add_device(
/* Setup the MTD structure */
/* make the name contain the block device in */
@ -31,7 +31,7 @@
+ mtdname = devname;
+ name = kmalloc(strlen(mtdname) + 1, GFP_KERNEL);
if (!name)
goto devinit_err;
goto err_destroy_mutex;
+ strcpy(name, mtdname);
dev->mtd.name = name;
@ -41,7 +41,7 @@
dev->mtd.erasesize = erase_size;
dev->mtd.writesize = 1;
dev->mtd.writebufsize = PAGE_SIZE;
@@ -272,15 +277,18 @@ static struct block2mtd_dev *add_device(
@@ -276,15 +281,18 @@ static struct block2mtd_dev *add_device(
dev->mtd.priv = dev;
dev->mtd.owner = THIS_MODULE;
@ -52,7 +52,7 @@
+ part->size = dev->mtd.size;
+ if (mtd_device_register(&dev->mtd, part, 1)) {
/* Device didn't get added, so free the entry */
goto devinit_err;
goto err_destroy_mutex;
}
list_add(&dev->list, &blkmtd_device_list);
pr_info("mtd%d: [%s] erase_size = %dKiB [%d]\n",
@ -62,8 +62,8 @@
+ mtdname, dev->mtd.erasesize >> 10, dev->mtd.erasesize);
return dev;
devinit_err:
@@ -347,9 +355,9 @@ static char block2mtd_paramline[80 + 12]
err_destroy_mutex:
@@ -353,9 +361,9 @@ static char block2mtd_paramline[80 + 12]
static int block2mtd_setup2(const char *val)
{
@ -75,7 +75,7 @@
char *name;
size_t erase_size = PAGE_SIZE;
int i, ret;
@@ -362,7 +370,7 @@ static int block2mtd_setup2(const char *
@@ -368,7 +376,7 @@ static int block2mtd_setup2(const char *
strcpy(str, val);
kill_final_newline(str);
@ -84,7 +84,7 @@
token[i] = strsep(&str, ",");
if (str) {
@@ -388,8 +396,10 @@ static int block2mtd_setup2(const char *
@@ -394,8 +402,10 @@ static int block2mtd_setup2(const char *
return 0;
}
}
@ -96,7 +96,7 @@
return 0;
}
@@ -423,7 +433,7 @@ static int block2mtd_setup(const char *v
@@ -429,7 +439,7 @@ static int block2mtd_setup(const char *v
module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);

@ -8,10 +8,10 @@
#include <linux/fs.h>
#include <linux/blkdev.h>
#include <linux/bio.h>
@@ -211,13 +212,14 @@ static void block2mtd_free_device(struct
@@ -210,13 +211,16 @@ static void block2mtd_free_device(struct
}
/* FIXME: ensure that mtd->size % erase_size == 0 */
-static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname)
+static struct block2mtd_dev *add_device(char *devname, int erase_size, const char *mtdname, int timeout)
{
@ -21,11 +21,13 @@
struct block2mtd_dev *dev;
struct mtd_partition *part;
char *name;
+#ifndef MODULE
+ int i;
+#endif
if (!devname)
return NULL;
@@ -228,15 +230,20 @@ static struct block2mtd_dev *add_device(
@@ -227,15 +231,20 @@ static struct block2mtd_dev *add_device(
/* Get a handle on the device */
bdev = blkdev_get_by_path(devname, mode, dev);
@ -52,7 +54,7 @@
}
#endif
@@ -355,11 +362,12 @@ static char block2mtd_paramline[80 + 12]
@@ -361,11 +370,12 @@ static char block2mtd_paramline[80 + 12]
static int block2mtd_setup2(const char *val)
{
@ -67,7 +69,7 @@
int i, ret;
if (strnlen(val, sizeof(buf)) >= sizeof(buf)) {
@@ -370,7 +378,7 @@ static int block2mtd_setup2(const char *
@@ -376,7 +386,7 @@ static int block2mtd_setup2(const char *
strcpy(str, val);
kill_final_newline(str);
@ -76,7 +78,7 @@
token[i] = strsep(&str, ",");
if (str) {
@@ -399,7 +407,10 @@ static int block2mtd_setup2(const char *
@@ -405,7 +415,10 @@ static int block2mtd_setup2(const char *
if (token[2] && (strlen(token[2]) + 1 > 80))
pr_err("mtd device name too long\n");
@ -88,7 +90,7 @@
return 0;
}
@@ -433,7 +444,7 @@ static int block2mtd_setup(const char *v
@@ -439,7 +452,7 @@ static int block2mtd_setup(const char *v
module_param_call(block2mtd, block2mtd_setup, NULL, NULL, 0200);
@ -97,7 +99,7 @@
static int __init block2mtd_init(void)
{
@@ -467,7 +478,7 @@ static void block2mtd_exit(void)
@@ -474,7 +487,7 @@ static void block2mtd_exit(void)
}

@ -1,6 +1,6 @@
--- a/fs/ubifs/file.c
+++ b/fs/ubifs/file.c
@@ -1576,6 +1576,10 @@ const struct inode_operations ubifs_syml
@@ -1573,6 +1573,10 @@ const struct inode_operations ubifs_syml
.follow_link = ubifs_follow_link,
.setattr = ubifs_setattr,
.getattr = ubifs_getattr,
@ -13,37 +13,27 @@
const struct file_operations ubifs_file_operations = {
--- a/fs/ubifs/journal.c
+++ b/fs/ubifs/journal.c
@@ -553,7 +553,8 @@ int ubifs_jnl_update(struct ubifs_info *
dbg_jnl("ino %lu, dent '%.*s', data len %d in dir ino %lu",
inode->i_ino, nm->len, nm->name, ui->data_len, dir->i_ino);
- ubifs_assert(dir_ui->data_len == 0);
+ if (!xent)
+ ubifs_assert(dir_ui->data_len == 0);
ubifs_assert(mutex_is_locked(&dir_ui->ui_mutex));
dlen = UBIFS_DENT_NODE_SZ + nm->len + 1;
@@ -573,6 +574,13 @@ int ubifs_jnl_update(struct ubifs_info *
@@ -572,6 +572,13 @@ int ubifs_jnl_update(struct ubifs_info *
aligned_dlen = ALIGN(dlen, 8);
aligned_ilen = ALIGN(ilen, 8);
len = aligned_dlen + aligned_ilen + UBIFS_INO_NODE_SZ;
+ if (xent) {
+ /*
+ * Make sure to account for dir_ui->data_len in
+ * Make sure to account for host_ui->data_len in
+ * length calculation in case there is extended attribute.
+ */
+ len += dir_ui->data_len;
+ len += host_ui->data_len;
+ }
dent = kmalloc(len, GFP_NOFS);
if (!dent)
return -ENOMEM;
@@ -649,7 +657,8 @@ int ubifs_jnl_update(struct ubifs_info *
@@ -648,7 +655,8 @@ int ubifs_jnl_update(struct ubifs_info *
ino_key_init(c, &ino_key, dir->i_ino);
ino_offs += aligned_ilen;
- err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs, UBIFS_INO_NODE_SZ);
+ err = ubifs_tnc_add(c, &ino_key, lnum, ino_offs,
+ UBIFS_INO_NODE_SZ + dir_ui->data_len);
+ UBIFS_INO_NODE_SZ + host_ui->data_len);
if (err)
goto out_ro;

@ -1,122 +0,0 @@
From 90bea5a3f0bf680b87b90516f3c231997f4b8f3b Mon Sep 17 00:00:00 2001
From: Daniel Golle <daniel@makrotopia.org>
Date: Mon, 2 Jun 2014 15:51:10 +0200
X-Git-Url: http://git.infradead.org/linux-ubifs.git/commitdiff_plain/90bea5a3f0bf680b87b90516f3c231997f4b8f3b
X-Git-Url: https://git.kernel.org/cgit/linux/kernel/git/next/linux-next.git/commit/?id=90bea5a3f0bf680b87b90516f3c231997f4b8f3b
Subject: UBIFS: respect MS_SILENT mount flag
When attempting to mount a non-ubifs formatted volume, lots of error
messages (including a stack dump) are thrown to the kernel log even if
the MS_SILENT mount flag is set.
Fix this by introducing adding an additional state-variable in
struct ubifs_info and suppress error messages in ubifs_read_node if
MS_SILENT is set.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
---
fs/ubifs/io.c | 18 ++++++++++--------
fs/ubifs/super.c | 5 +++++
fs/ubifs/ubifs.h | 11 +++++++++++
3 files changed, 26 insertions(+), 8 deletions(-)
---
--- a/fs/ubifs/io.c
+++ b/fs/ubifs/io.c
@@ -988,30 +988,32 @@ int ubifs_read_node(const struct ubifs_i
return err;
if (type != ch->node_type) {
- ubifs_err("bad node type (%d but expected %d)",
- ch->node_type, type);
+ ubifs_errc(c, "bad node type (%d but expected %d)",
+ ch->node_type, type);
goto out;
}
err = ubifs_check_node(c, buf, lnum, offs, 0, 0);
if (err) {
- ubifs_err("expected node type %d", type);
+ ubifs_errc(c, "expected node type %d", type);
return err;
}
l = le32_to_cpu(ch->len);
if (l != len) {
- ubifs_err("bad node length %d, expected %d", l, len);
+ ubifs_errc(c, "bad node length %d, expected %d", l, len);
goto out;
}
return 0;
out:
- ubifs_err("bad node at LEB %d:%d, LEB mapping status %d", lnum, offs,
- ubi_is_mapped(c->ubi, lnum));
- ubifs_dump_node(c, buf);
- dump_stack();
+ ubifs_errc(c, "bad node at LEB %d:%d, LEB mapping status %d", lnum,
+ offs, ubi_is_mapped(c->ubi, lnum));
+ if (!c->probing) {
+ ubifs_dump_node(c, buf);
+ dump_stack();
+ }
return -EINVAL;
}
--- a/fs/ubifs/super.c
+++ b/fs/ubifs/super.c
@@ -1149,6 +1149,9 @@ static int mount_ubifs(struct ubifs_info
size_t sz;
c->ro_mount = !!(c->vfs_sb->s_flags & MS_RDONLY);
+ /* Suppress error messages while probing if MS_SILENT is set */
+ c->probing = !!(c->vfs_sb->s_flags & MS_SILENT);
+
err = init_constants_early(c);
if (err)
return err;
@@ -1214,6 +1217,8 @@ static int mount_ubifs(struct ubifs_info
if (err)
goto out_free;
+ c->probing = 0;
+
/*
* Make sure the compressor which is set as default in the superblock
* or overridden by mount options is actually compiled in.
--- a/fs/ubifs/ubifs.h
+++ b/fs/ubifs/ubifs.h
@@ -51,6 +51,15 @@
#define ubifs_warn(fmt, ...) \
pr_warn("UBIFS warning (pid %d): %s: " fmt "\n", \
current->pid, __func__, ##__VA_ARGS__)
+/*
+ * A variant of 'ubifs_err()' which takes the UBIFS file-sytem description
+ * object as an argument.
+ */
+#define ubifs_errc(c, fmt, ...) \
+ do { \
+ if (!(c)->probing) \
+ ubifs_err(fmt, ##__VA_ARGS__); \
+ } while (0)
/* UBIFS file system VFS magic number */
#define UBIFS_SUPER_MAGIC 0x24051905
@@ -1209,6 +1218,7 @@ struct ubifs_debug_info;
* @need_recovery: %1 if the file-system needs recovery
* @replaying: %1 during journal replay
* @mounting: %1 while mounting
+ * @probing: %1 while attempting to mount if MS_SILENT mount flag is set
* @remounting_rw: %1 while re-mounting from R/O mode to R/W mode
* @replay_list: temporary list used during journal replay
* @replay_buds: list of buds to replay
@@ -1441,6 +1451,7 @@ struct ubifs_info {
unsigned int replaying:1;
unsigned int mounting:1;
unsigned int remounting_rw:1;
+ unsigned int probing:1;
struct list_head replay_list;
struct list_head replay_buds;
unsigned long long cs_sqnum;

@ -1,6 +1,6 @@
--- /dev/null
+++ b/net/sched/act_connmark.c
@@ -0,0 +1,144 @@
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2011 Felix Fietkau <nbd@openwrt.org>
+ *
@ -37,8 +37,6 @@
+
+#define CONNMARK_TAB_MASK 3
+
+static struct tcf_hashinfo connmark_hash_info;
+
+static int tcf_connmark(struct sk_buff *skb, const struct tc_action *a,
+ struct tcf_result *res)
+{
@ -78,20 +76,18 @@
+ struct nlattr *est, struct tc_action *a,
+ int ovr, int bind)
+{
+ struct tcf_common *pc;
+ int ret = 0;
+
+ pc = tcf_hash_check(0, a, bind);
+ if (!pc) {
+ pc = tcf_hash_create(0, est, a, sizeof(*pc), bind);
+ if (IS_ERR(pc))
+ return PTR_ERR(pc);
+ if (!tcf_hash_check(0, a, bind)) {
+ ret = tcf_hash_create(0, est, a, sizeof(struct tcf_common), bind);
+ if (ret)
+ return ret;
+
+ tcf_hash_insert(pc, &connmark_hash_info);
+ tcf_hash_insert(a);
+ ret = ACT_P_CREATED;
+ } else {
+ if (!ovr) {
+ tcf_hash_release(pc, bind, &connmark_hash_info);
+ tcf_hash_release(a, bind);
+ return -EEXIST;
+ }
+ }
@ -99,13 +95,6 @@
+ return ret;
+}
+
+static inline int tcf_connmark_cleanup(struct tc_action *a, int bind)
+{
+ if (a->priv)
+ return tcf_hash_release(a->priv, bind, &connmark_hash_info);
+ return 0;
+}
+
+static inline int tcf_connmark_dump(struct sk_buff *skb, struct tc_action *a,
+ int bind, int ref)
+{
@ -114,12 +103,10 @@
+
+static struct tc_action_ops act_connmark_ops = {
+ .kind = "connmark",
+ .hinfo = &connmark_hash_info,
+ .type = TCA_ACT_CONNMARK,
+ .owner = THIS_MODULE,
+ .act = tcf_connmark,
+ .dump = tcf_connmark_dump,
+ .cleanup = tcf_connmark_cleanup,
+ .init = tcf_connmark_init,
+};
+
@ -129,13 +116,8 @@
+
+static int __init connmark_init_module(void)
+{
+ int ret;
+
+ ret = tcf_hashinfo_init(&connmark_hash_info, CONNMARK_TAB_MASK);
+ if (ret)
+ return ret;
+
+ return tcf_register_action(&act_connmark_ops);
+ return tcf_register_action(&act_connmark_ops, CONNMARK_TAB_MASK);
+}
+
+static void __exit connmark_cleanup_module(void)

@ -1,16 +1,16 @@
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -174,6 +174,7 @@ struct net_bridge_port
#define BR_ADMIN_COST 0x00000010
#define BR_LEARNING 0x00000020
@@ -172,6 +172,7 @@ struct net_bridge_port
#define BR_FLOOD 0x00000040
+#define BR_ISOLATE_MODE 0x00000080
#define BR_AUTO_MASK (BR_FLOOD | BR_LEARNING)
#define BR_PROMISC 0x00000080
+#define BR_ISOLATE_MODE 0x00000100
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
struct bridge_mcast_query ip4_query;
struct bridge_mcast_own_query ip4_own_query;
--- a/net/bridge/br_sysfs_if.c
+++ b/net/bridge/br_sysfs_if.c
@@ -161,6 +161,22 @@ BRPORT_ATTR_FLAG(root_block, BR_ROOT_BLO
@@ -171,6 +171,22 @@ BRPORT_ATTR_FLAG(root_block, BR_ROOT_BLO
BRPORT_ATTR_FLAG(learning, BR_LEARNING);
BRPORT_ATTR_FLAG(unicast_flood, BR_FLOOD);
@ -33,7 +33,7 @@
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
static ssize_t show_multicast_router(struct net_bridge_port *p, char *buf)
{
@@ -203,6 +219,7 @@ static const struct brport_attribute *br
@@ -213,6 +229,7 @@ static const struct brport_attribute *br
&brport_attr_multicast_router,
&brport_attr_multicast_fast_leave,
#endif
@ -56,7 +56,7 @@
skb = NULL;
--- a/net/bridge/br_forward.c
+++ b/net/bridge/br_forward.c
@@ -119,7 +119,7 @@ void br_deliver(const struct net_bridge_
@@ -116,7 +116,7 @@ void br_deliver(const struct net_bridge_
/* called with rcu_read_lock */
void br_forward(const struct net_bridge_port *to, struct sk_buff *skb, struct sk_buff *skb0)
{
@ -65,7 +65,7 @@
if (skb0)
deliver_clone(to, skb, __br_forward);
else
@@ -175,7 +175,7 @@ static void br_flood(struct net_bridge *
@@ -172,7 +172,7 @@ static void br_flood(struct net_bridge *
struct sk_buff *skb0,
void (*__packet_hook)(const struct net_bridge_port *p,
struct sk_buff *skb),
@ -74,7 +74,7 @@
{
struct net_bridge_port *p;
struct net_bridge_port *prev;
@@ -183,6 +183,8 @@ static void br_flood(struct net_bridge *
@@ -180,6 +180,8 @@ static void br_flood(struct net_bridge *
prev = NULL;
list_for_each_entry_rcu(p, &br->port_list, list) {
@ -83,7 +83,7 @@
/* Do not flood unicast traffic to ports that turn it off */
if (unicast && !(p->flags & BR_FLOOD))
continue;
@@ -209,14 +211,14 @@ out:
@@ -206,14 +208,14 @@ out:
/* called with rcu_read_lock */
void br_flood_deliver(struct net_bridge *br, struct sk_buff *skb, bool unicast)
{

@ -1,6 +1,6 @@
--- a/net/bridge/br_forward.c
+++ b/net/bridge/br_forward.c
@@ -57,7 +57,7 @@ int br_dev_queue_push_xmit(struct sk_buf
@@ -53,7 +53,7 @@ EXPORT_SYMBOL_GPL(br_dev_queue_push_xmit
int br_forward_finish(struct sk_buff *skb)
{
@ -9,7 +9,7 @@
br_dev_queue_push_xmit);
}
@@ -80,7 +80,7 @@ static void __br_deliver(const struct ne
@@ -77,7 +77,7 @@ static void __br_deliver(const struct ne
return;
}
@ -18,7 +18,7 @@
br_forward_finish);
}
@@ -101,7 +101,7 @@ static void __br_forward(const struct ne
@@ -98,7 +98,7 @@ static void __br_forward(const struct ne
skb->dev = to->dev;
skb_forward_csum(skb);
@ -38,7 +38,7 @@
netif_receive_skb);
}
@@ -214,7 +214,7 @@ rx_handler_result_t br_handle_frame(stru
@@ -219,7 +219,7 @@ rx_handler_result_t br_handle_frame(stru
}
/* Deliver packet to local host only */
@ -47,7 +47,7 @@
NULL, br_handle_local_finish)) {
return RX_HANDLER_CONSUMED; /* consumed by filter */
} else {
@@ -229,7 +229,7 @@ forward:
@@ -234,7 +234,7 @@ forward:
if (ether_addr_equal(p->br->dev->dev_addr, dest))
skb->pkt_type = PACKET_HOST;
@ -56,7 +56,7 @@
br_handle_local_finish))
break;
@@ -251,7 +251,7 @@ forward:
@@ -256,7 +256,7 @@ forward:
if (ether_addr_equal(p->br->dev->dev_addr, dest))
skb->pkt_type = PACKET_HOST;
@ -67,15 +67,15 @@
default:
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -802,7 +802,7 @@ static void __br_multicast_send_query(st
@@ -815,7 +815,7 @@ static void __br_multicast_send_query(st
if (port) {
__skb_push(skb, sizeof(struct ethhdr));
skb->dev = port->dev;
- NF_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev,
+ BR_HOOK(NFPROTO_BRIDGE, NF_BR_LOCAL_OUT, skb, NULL, skb->dev,
dev_queue_xmit);
} else
netif_rx(skb);
} else {
br_multicast_select_own_querier(br, ip, skb);
--- a/net/bridge/br_netfilter.c
+++ b/net/bridge/br_netfilter.c
@@ -73,6 +73,15 @@ static int brnf_pass_vlan_indev __read_m
@ -96,18 +96,18 @@
if (vlan_tx_tag_present(skb))
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -724,15 +724,29 @@ static inline u16 br_get_pvid(const stru
@@ -769,15 +769,29 @@ static inline int br_vlan_enabled(struct
/* br_netfilter.c */
#ifdef CONFIG_BRIDGE_NETFILTER
#if IS_ENABLED(CONFIG_BRIDGE_NETFILTER)
+extern int brnf_call_ebtables;
int br_netfilter_init(void);
void br_netfilter_fini(void);
int br_nf_core_init(void);
void br_nf_core_fini(void);
void br_netfilter_rtable_init(struct net_bridge *);
+bool br_netfilter_run_hooks(void);
#else
#define br_netfilter_init() (0)
#define br_netfilter_fini() do { } while (0)
static inline int br_nf_core_init(void) { return 0; }
static inline void br_nf_core_fini(void) {}
#define br_netfilter_rtable_init(x)
+#define br_netfilter_run_hooks() false
#endif
@ -125,7 +125,7 @@
+
/* br_stp.c */
void br_log_state(const struct net_bridge_port *p);
struct net_bridge_port *br_get_port(struct net_bridge *br, u16 port_no);
void br_set_state(struct net_bridge_port *p, unsigned int state);
--- a/net/bridge/br_stp_bpdu.c
+++ b/net/bridge/br_stp_bpdu.c
@@ -54,7 +54,7 @@ static void br_send_bpdu(struct net_brid
@ -139,7 +139,7 @@
--- a/net/bridge/netfilter/ebtables.c
+++ b/net/bridge/netfilter/ebtables.c
@@ -2405,11 +2405,13 @@ static int __init ebtables_init(void)
@@ -2414,11 +2414,13 @@ static int __init ebtables_init(void)
}
printk(KERN_INFO "Ebtables v2.0 registered\n");

@ -1,6 +1,6 @@
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -634,7 +634,8 @@ struct net_bridge_port_group *br_multica
@@ -635,7 +635,8 @@ struct net_bridge_port_group *br_multica
struct net_bridge_port *port,
struct br_ip *group,
struct net_bridge_port_group __rcu *next,
@ -10,7 +10,7 @@
{
struct net_bridge_port_group *p;
@@ -649,12 +650,33 @@ struct net_bridge_port_group *br_multica
@@ -650,12 +651,33 @@ struct net_bridge_port_group *br_multica
hlist_add_head(&p->mglist, &port->mglist);
setup_timer(&p->timer, br_multicast_port_group_expired,
(unsigned long)p);
@ -45,7 +45,7 @@
{
struct net_bridge_mdb_entry *mp;
struct net_bridge_port_group *p;
@@ -681,13 +703,13 @@ static int br_multicast_add_group(struct
@@ -682,13 +704,13 @@ static int br_multicast_add_group(struct
for (pp = &mp->ports;
(p = mlock_dereference(*pp, br)) != NULL;
pp = &p->next) {
@ -61,7 +61,7 @@
if (unlikely(!p))
goto err;
rcu_assign_pointer(*pp, p);
@@ -706,7 +728,7 @@ err:
@@ -707,7 +729,7 @@ err:
static int br_ip4_multicast_add_group(struct net_bridge *br,
struct net_bridge_port *port,
__be32 group,
@ -70,7 +70,7 @@
{
struct br_ip br_group;
@@ -717,14 +739,14 @@ static int br_ip4_multicast_add_group(st
@@ -718,14 +740,14 @@ static int br_ip4_multicast_add_group(st
br_group.proto = htons(ETH_P_IP);
br_group.vid = vid;
@ -87,7 +87,7 @@
{
struct br_ip br_group;
@@ -735,7 +757,7 @@ static int br_ip6_multicast_add_group(st
@@ -736,7 +758,7 @@ static int br_ip6_multicast_add_group(st
br_group.proto = htons(ETH_P_IPV6);
br_group.vid = vid;
@ -96,7 +96,7 @@
}
#endif
@@ -950,6 +972,7 @@ static int br_ip4_multicast_igmp3_report
@@ -966,6 +988,7 @@ static int br_ip4_multicast_igmp3_report
struct sk_buff *skb,
u16 vid)
{
@ -104,7 +104,7 @@
struct igmpv3_report *ih;
struct igmpv3_grec *grec;
int i;
@@ -993,7 +1016,7 @@ static int br_ip4_multicast_igmp3_report
@@ -1009,7 +1032,7 @@ static int br_ip4_multicast_igmp3_report
continue;
}
@ -113,7 +113,7 @@
if (err)
break;
}
@@ -1007,6 +1030,7 @@ static int br_ip6_multicast_mld2_report(
@@ -1023,6 +1046,7 @@ static int br_ip6_multicast_mld2_report(
struct sk_buff *skb,
u16 vid)
{
@ -121,7 +121,7 @@
struct icmp6hdr *icmp6h;
struct mld2_grec *grec;
int i;
@@ -1055,7 +1079,7 @@ static int br_ip6_multicast_mld2_report(
@@ -1071,7 +1095,7 @@ static int br_ip6_multicast_mld2_report(
}
err = br_ip6_multicast_add_group(br, port, &grec->grec_mca,
@ -130,17 +130,17 @@
if (!err)
break;
}
@@ -1319,7 +1343,8 @@ static void br_multicast_leave_group(str
struct net_bridge_port *port,
struct br_ip *group,
struct bridge_mcast_querier *querier,
- struct bridge_mcast_query *query)
+ struct bridge_mcast_query *query,
+ const unsigned char *src)
@@ -1408,7 +1432,8 @@ br_multicast_leave_group(struct net_brid
struct net_bridge_port *port,
struct br_ip *group,
struct bridge_mcast_other_query *other_query,
- struct bridge_mcast_own_query *own_query)
+ struct bridge_mcast_own_query *own_query,
+ const unsigned char *src)
{
struct net_bridge_mdb_htable *mdb;
struct net_bridge_mdb_entry *mp;
@@ -1369,7 +1394,7 @@ static void br_multicast_leave_group(str
@@ -1458,7 +1483,7 @@ br_multicast_leave_group(struct net_brid
for (pp = &mp->ports;
(p = mlock_dereference(*pp, br)) != NULL;
pp = &p->next) {
@ -149,7 +149,7 @@
continue;
rcu_assign_pointer(*pp, p->next);
@@ -1403,7 +1428,7 @@ static void br_multicast_leave_group(str
@@ -1492,7 +1517,7 @@ br_multicast_leave_group(struct net_brid
for (p = mlock_dereference(mp->ports, br);
p != NULL;
p = mlock_dereference(p->next, br)) {
@ -158,7 +158,7 @@
continue;
if (!hlist_unhashed(&p->mglist) &&
@@ -1421,8 +1446,8 @@ out:
@@ -1510,8 +1535,8 @@ out:
static void br_ip4_multicast_leave_group(struct net_bridge *br,
struct net_bridge_port *port,
@ -168,14 +168,13 @@
+ const unsigned char *src)
{
struct br_ip br_group;
struct bridge_mcast_query *query = port ? &port->ip4_query :
@@ -1435,14 +1460,15 @@ static void br_ip4_multicast_leave_group
br_group.proto = htons(ETH_P_IP);
struct bridge_mcast_own_query *own_query;
@@ -1526,14 +1551,14 @@ static void br_ip4_multicast_leave_group
br_group.vid = vid;
- br_multicast_leave_group(br, port, &br_group, &br->ip4_querier, query);
+ br_multicast_leave_group(br, port, &br_group, &br->ip4_querier, query,
+ src);
br_multicast_leave_group(br, port, &br_group, &br->ip4_other_query,
- own_query);
+ own_query, src);
}
#if IS_ENABLED(CONFIG_IPV6)
@ -186,18 +185,17 @@
+ __u16 vid, const unsigned char *src)
{
struct br_ip br_group;
struct bridge_mcast_query *query = port ? &port->ip6_query :
@@ -1456,7 +1482,8 @@ static void br_ip6_multicast_leave_group
br_group.proto = htons(ETH_P_IPV6);
struct bridge_mcast_own_query *own_query;
@@ -1548,7 +1573,7 @@ static void br_ip6_multicast_leave_group
br_group.vid = vid;
- br_multicast_leave_group(br, port, &br_group, &br->ip6_querier, query);
+ br_multicast_leave_group(br, port, &br_group, &br->ip6_querier, query,
+ src);
br_multicast_leave_group(br, port, &br_group, &br->ip6_other_query,
- own_query);
+ own_query, src);
}
#endif
@@ -1465,6 +1492,7 @@ static int br_multicast_ipv4_rcv(struct
@@ -1557,6 +1582,7 @@ static int br_multicast_ipv4_rcv(struct
struct sk_buff *skb,
u16 vid)
{
@ -205,7 +203,7 @@
struct sk_buff *skb2 = skb;
const struct iphdr *iph;
struct igmphdr *ih;
@@ -1538,7 +1566,7 @@ static int br_multicast_ipv4_rcv(struct
@@ -1630,7 +1656,7 @@ static int br_multicast_ipv4_rcv(struct
case IGMP_HOST_MEMBERSHIP_REPORT:
case IGMPV2_HOST_MEMBERSHIP_REPORT:
BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
@ -214,7 +212,7 @@
break;
case IGMPV3_HOST_MEMBERSHIP_REPORT:
err = br_ip4_multicast_igmp3_report(br, port, skb2, vid);
@@ -1547,7 +1575,7 @@ static int br_multicast_ipv4_rcv(struct
@@ -1639,7 +1665,7 @@ static int br_multicast_ipv4_rcv(struct
err = br_ip4_multicast_query(br, port, skb2, vid);
break;
case IGMP_HOST_LEAVE_MESSAGE:
@ -223,7 +221,7 @@
break;
}
@@ -1565,6 +1593,7 @@ static int br_multicast_ipv6_rcv(struct
@@ -1657,6 +1683,7 @@ static int br_multicast_ipv6_rcv(struct
struct sk_buff *skb,
u16 vid)
{
@ -231,7 +229,7 @@
struct sk_buff *skb2;
const struct ipv6hdr *ip6h;
u8 icmp6_type;
@@ -1674,7 +1703,8 @@ static int br_multicast_ipv6_rcv(struct
@@ -1766,7 +1793,8 @@ static int br_multicast_ipv6_rcv(struct
}
mld = (struct mld_msg *)skb_transport_header(skb2);
BR_INPUT_SKB_CB(skb)->mrouters_only = 1;
@ -241,7 +239,7 @@
break;
}
case ICMPV6_MLD2_REPORT:
@@ -1691,7 +1721,7 @@ static int br_multicast_ipv6_rcv(struct
@@ -1783,7 +1811,7 @@ static int br_multicast_ipv6_rcv(struct
goto out;
}
mld = (struct mld_msg *)skb_transport_header(skb2);
@ -252,7 +250,7 @@
--- a/net/bridge/br_private.h
+++ b/net/bridge/br_private.h
@@ -116,6 +116,9 @@ struct net_bridge_port_group {
@@ -112,6 +112,9 @@ struct net_bridge_port_group {
struct timer_list timer;
struct br_ip addr;
unsigned char state;
@ -262,15 +260,15 @@
};
struct net_bridge_mdb_entry
@@ -175,6 +178,7 @@ struct net_bridge_port
#define BR_LEARNING 0x00000020
#define BR_FLOOD 0x00000040
#define BR_ISOLATE_MODE 0x00000080
+#define BR_MULTICAST_TO_UCAST 0x00000100
@@ -173,6 +176,7 @@ struct net_bridge_port
#define BR_AUTO_MASK (BR_FLOOD | BR_LEARNING)
#define BR_PROMISC 0x00000080
#define BR_ISOLATE_MODE 0x00000100
+#define BR_MULTICAST_TO_UCAST 0x00000200
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
struct bridge_mcast_query ip4_query;
@@ -468,7 +472,8 @@ void br_multicast_free_pg(struct rcu_hea
struct bridge_mcast_own_query ip4_own_query;
@@ -485,7 +489,8 @@ void br_multicast_free_pg(struct rcu_hea
struct net_bridge_port_group *
br_multicast_new_port_group(struct net_bridge_port *port, struct br_ip *group,
struct net_bridge_port_group __rcu *next,
@ -293,7 +291,7 @@
rcu_assign_pointer(*pp, p);
--- a/net/bridge/br_forward.c
+++ b/net/bridge/br_forward.c
@@ -170,6 +170,29 @@ out:
@@ -167,6 +167,29 @@ out:
return p;
}
@ -323,7 +321,7 @@
/* called under bridge lock */
static void br_flood(struct net_bridge *br, struct sk_buff *skb,
struct sk_buff *skb0,
@@ -234,6 +257,7 @@ static void br_multicast_flood(struct ne
@@ -231,6 +254,7 @@ static void br_multicast_flood(struct ne
struct net_bridge_port *prev = NULL;
struct net_bridge_port_group *p;
struct hlist_node *rp;
@ -331,7 +329,7 @@
rp = rcu_dereference(hlist_first_rcu(&br->router_list));
p = mdst ? rcu_dereference(mdst->ports) : NULL;
@@ -244,10 +268,19 @@ static void br_multicast_flood(struct ne
@@ -241,10 +265,19 @@ static void br_multicast_flood(struct ne
rport = rp ? hlist_entry(rp, struct net_bridge_port, rlist) :
NULL;
@ -357,7 +355,7 @@
--- a/net/bridge/br_sysfs_if.c
+++ b/net/bridge/br_sysfs_if.c
@@ -192,6 +192,7 @@ static BRPORT_ATTR(multicast_router, S_I
@@ -202,6 +202,7 @@ static BRPORT_ATTR(multicast_router, S_I
store_multicast_router);
BRPORT_ATTR_FLAG(multicast_fast_leave, BR_MULTICAST_FAST_LEAVE);
@ -365,7 +363,7 @@
#endif
static const struct brport_attribute *brport_attrs[] = {
@@ -218,6 +219,7 @@ static const struct brport_attribute *br
@@ -228,6 +229,7 @@ static const struct brport_attribute *br
#ifdef CONFIG_BRIDGE_IGMP_SNOOPING
&brport_attr_multicast_router,
&brport_attr_multicast_fast_leave,

@ -43,6 +43,32 @@ Signed-off-by: Steven Barth <cyrus@openwrt.org>
__be16 i_flags;
__be16 o_flags;
--- a/include/uapi/linux/if_tunnel.h
+++ b/include/uapi/linux/if_tunnel.h
@@ -57,10 +57,23 @@ enum {
IFLA_IPTUN_ENCAP_FLAGS,
IFLA_IPTUN_ENCAP_SPORT,
IFLA_IPTUN_ENCAP_DPORT,
+ IFLA_IPTUN_FMRS,
__IFLA_IPTUN_MAX,
};
#define IFLA_IPTUN_MAX (__IFLA_IPTUN_MAX - 1)
+enum {
+ IFLA_IPTUN_FMR_UNSPEC,
+ IFLA_IPTUN_FMR_IP6_PREFIX,
+ IFLA_IPTUN_FMR_IP4_PREFIX,
+ IFLA_IPTUN_FMR_IP6_PREFIX_LEN,
+ IFLA_IPTUN_FMR_IP4_PREFIX_LEN,
+ IFLA_IPTUN_FMR_EA_LEN,
+ IFLA_IPTUN_FMR_OFFSET,
+ __IFLA_IPTUN_FMR_MAX,
+};
+#define IFLA_IPTUN_FMR_MAX (__IFLA_IPTUN_FMR_MAX - 1)
+
enum tunnel_encap_types {
TUNNEL_ENCAP_NONE,
TUNNEL_ENCAP_FOU,
--- a/net/ipv6/ip6_tunnel.c
+++ b/net/ipv6/ip6_tunnel.c
@@ -16,6 +16,8 @@

@ -112,7 +112,16 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
return -EINVAL;
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -283,6 +283,21 @@ static const struct rt6_info ip6_prohibi
@@ -87,6 +87,8 @@ static int ip6_pkt_discard(struct sk_bu
static int ip6_pkt_discard_out(struct sock *sk, struct sk_buff *skb);
static int ip6_pkt_prohibit(struct sk_buff *skb);
static int ip6_pkt_prohibit_out(struct sock *sk, struct sk_buff *skb);
+static int ip6_pkt_policy_failed(struct sk_buff *skb);
+static int ip6_pkt_policy_failed_out(struct sock *sk, struct sk_buff *skb);
static void ip6_link_failure(struct sk_buff *skb);
static void ip6_rt_update_pmtu(struct dst_entry *dst, struct sock *sk,
struct sk_buff *skb, u32 mtu);
@@ -283,6 +285,21 @@ static const struct rt6_info ip6_prohibi
.rt6i_ref = ATOMIC_INIT(1),
};
@ -134,7 +143,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
static const struct rt6_info ip6_blk_hole_entry_template = {
.dst = {
.__refcnt = ATOMIC_INIT(1),
@@ -1581,6 +1596,11 @@ int ip6_route_add(struct fib6_config *cf
@@ -1581,6 +1598,11 @@ int ip6_route_add(struct fib6_config *cf
rt->dst.output = ip6_pkt_prohibit_out;
rt->dst.input = ip6_pkt_prohibit;
break;
@ -146,7 +155,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
case RTN_THROW:
default:
rt->dst.error = (cfg->fc_type == RTN_THROW) ? -EAGAIN
@@ -2142,6 +2162,17 @@ static int ip6_pkt_prohibit_out(struct s
@@ -2142,6 +2164,17 @@ static int ip6_pkt_prohibit_out(struct s
return ip6_pkt_drop(skb, ICMPV6_ADM_PROHIBITED, IPSTATS_MIB_OUTNOROUTES);
}
@ -155,7 +164,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_INNOROUTES);
+}
+
+static int ip6_pkt_policy_failed_out(struct sk_buff *skb)
+static int ip6_pkt_policy_failed_out(struct sock *sk, struct sk_buff *skb)
+{
+ skb->dev = skb_dst(skb)->dev;
+ return ip6_pkt_drop(skb, ICMPV6_POLICY_FAIL, IPSTATS_MIB_OUTNOROUTES);
@ -164,7 +173,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
/*
* Allocate a dst for local (unicast / anycast) address.
*/
@@ -2365,7 +2396,8 @@ static int rtm_to_fib6_config(struct sk_
@@ -2365,7 +2398,8 @@ static int rtm_to_fib6_config(struct sk_
if (rtm->rtm_type == RTN_UNREACHABLE ||
rtm->rtm_type == RTN_BLACKHOLE ||
rtm->rtm_type == RTN_PROHIBIT ||
@ -174,7 +183,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
cfg->fc_flags |= RTF_REJECT;
if (rtm->rtm_type == RTN_LOCAL)
@@ -2567,6 +2599,9 @@ static int rt6_fill_node(struct net *net
@@ -2567,6 +2601,9 @@ static int rt6_fill_node(struct net *net
case -EACCES:
rtm->rtm_type = RTN_PROHIBIT;
break;
@ -184,7 +193,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
case -EAGAIN:
rtm->rtm_type = RTN_THROW;
break;
@@ -2820,6 +2855,8 @@ static int ip6_route_dev_notify(struct n
@@ -2820,6 +2857,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);
@ -193,7 +202,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
net->ipv6.ip6_blk_hole_entry->dst.dev = dev;
net->ipv6.ip6_blk_hole_entry->rt6i_idev = in6_dev_get(dev);
#endif
@@ -3036,6 +3073,17 @@ static int __net_init ip6_route_net_init
@@ -3036,6 +3075,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);
@ -211,7 +220,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
#endif
net->ipv6.sysctl.flush_delay = 0;
@@ -3054,6 +3102,8 @@ out:
@@ -3054,6 +3104,8 @@ out:
return ret;
#ifdef CONFIG_IPV6_MULTIPLE_TABLES
@ -220,7 +229,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
out_ip6_prohibit_entry:
kfree(net->ipv6.ip6_prohibit_entry);
out_ip6_null_entry:
@@ -3071,6 +3121,7 @@ static void __net_exit ip6_route_net_exi
@@ -3071,6 +3123,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);
@ -228,7 +237,7 @@ Signed-off-by: Jonas Gorski <jogo@openwrt.org>
#endif
dst_entries_destroy(&net->ipv6.ip6_dst_ops);
}
@@ -3167,6 +3218,9 @@ int __init ip6_route_init(void)
@@ -3167,6 +3220,9 @@ int __init ip6_route_init(void)
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);

@ -1,12 +1,6 @@
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -417,9 +417,18 @@ struct phy_driver {
*/
int (*config_aneg)(struct phy_device *phydev);
+ /* Determine if autonegotiation is done */
+ int (*aneg_done)(struct phy_device *phydev);
+
@@ -484,6 +484,12 @@ struct phy_driver {
/* Determines the negotiated speed and duplex */
int (*read_status)(struct phy_device *phydev);
@ -21,7 +15,7 @@
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -881,6 +881,9 @@ int genphy_update_link(struct phy_device
@@ -914,6 +914,9 @@ int genphy_update_link(struct phy_device
{
int status;
@ -31,19 +25,3 @@
/* Do a fake read */
status = phy_read(phydev, MII_BMSR);
if (status < 0)
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -99,7 +99,12 @@ static int phy_config_interrupt(struct p
*/
static inline int phy_aneg_done(struct phy_device *phydev)
{
- int retval = phy_read(phydev, MII_BMSR);
+ int retval;
+
+ if (phydev->drv->aneg_done)
+ return phydev->drv->aneg_done(phydev);
+
+ retval = phy_read(phydev, MII_BMSR);
return (retval < 0) ? retval : (retval & BMSR_ANEGCOMPLETE);
}

@ -1,18 +1,18 @@
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -662,6 +662,9 @@ EXPORT_SYMBOL(phy_attach);
void phy_detach(struct phy_device *phydev)
@@ -674,6 +674,9 @@ void phy_detach(struct phy_device *phyde
{
int i;
+ if (phydev->drv && phydev->drv->detach)
+ phydev->drv->detach(phydev);
+
phydev->attached_dev->phydev = NULL;
phydev->attached_dev = NULL;
phy_suspend(phydev);
if (phydev->bus->dev.driver)
module_put(phydev->bus->dev.driver->owner);
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -441,6 +441,12 @@ struct phy_driver {
@@ -502,6 +502,12 @@ struct phy_driver {
*/
int (*did_interrupt)(struct phy_device *phydev);

@ -9,7 +9,7 @@
/**
* mdiobus_alloc_size - allocate a mii_bus structure
* @size: extra amount of memory to allocate for private storage.
@@ -224,15 +226,33 @@ void mdiobus_free(struct mii_bus *bus)
@@ -335,9 +337,21 @@ void mdiobus_free(struct mii_bus *bus)
}
EXPORT_SYMBOL(mdiobus_free);
@ -31,8 +31,9 @@
int err;
phydev = get_phy_device(bus, addr, false);
if (IS_ERR(phydev) || phydev == NULL)
return phydev;
@@ -350,6 +364,12 @@ struct phy_device *mdiobus_scan(struct m
*/
of_mdiobus_link_phydev(bus, phydev);
+ mutex_lock(&__mdio_board_lock);
+ list_for_each_entry(be, &__mdio_board_list, list)
@ -45,7 +46,7 @@
phy_device_free(phydev);
--- a/include/linux/phy.h
+++ b/include/linux/phy.h
@@ -667,4 +667,22 @@ int __init mdio_bus_init(void);
@@ -785,4 +785,22 @@ int __init mdio_bus_init(void);
void mdio_bus_exit(void);
extern struct bus_type mdio_bus_type;

@ -1,6 +1,6 @@
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -128,6 +128,13 @@ config MICREL_PHY
@@ -132,6 +132,13 @@ config MICREL_PHY
---help---
Supports the KSZ9021, VSC8201, KS8001 PHYs.
@ -16,7 +16,7 @@
depends on PHYLIB=y
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -16,6 +16,7 @@ obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o
@@ -18,6 +18,7 @@ obj-$(CONFIG_BCM63XX_PHY) += bcm63xx.o
obj-$(CONFIG_BCM7XXX_PHY) += bcm7xxx.o
obj-$(CONFIG_BCM87XX_PHY) += bcm87xx.o
obj-$(CONFIG_ICPLUS_PHY) += icplus.o

@ -1,40 +1,16 @@
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1245,6 +1245,11 @@ struct net_device {
const struct ethtool_ops *ethtool_ops;
const struct forwarding_accel_ops *fwd_ops;
@@ -1216,6 +1216,7 @@ enum netdev_priv_flags {
IFF_LIVE_ADDR_CHANGE = 1<<20,
IFF_MACVLAN = 1<<21,
IFF_XMIT_DST_RELEASE_PERM = 1<<22,
+ IFF_NO_IP_ALIGN = 1<<23,
};
+#ifdef CONFIG_ETHERNET_PACKET_MANGLE
+ void (*eth_mangle_rx)(struct net_device *dev, struct sk_buff *skb);
+ struct sk_buff *(*eth_mangle_tx)(struct net_device *dev, struct sk_buff *skb);
+#endif
+
/* Hardware header description */
const struct header_ops *header_ops;
@@ -1313,6 +1318,9 @@ struct net_device {
void *ax25_ptr; /* AX.25 specific data */
struct wireless_dev *ieee80211_ptr; /* IEEE 802.11 specific data,
assign before registering */
+#ifdef CONFIG_ETHERNET_PACKET_MANGLE
+ void *phy_ptr; /* PHY device specific data */
+#endif
/*
* Cache lines mostly used on receive path (including eth_type_trans())
--- a/include/uapi/linux/if.h
+++ b/include/uapi/linux/if.h
@@ -84,6 +84,7 @@
#define IFF_LIVE_ADDR_CHANGE 0x100000 /* device supports hardware address
* change when it's running */
#define IFF_MACVLAN 0x200000 /* Macvlan device */
+#define IFF_NO_IP_ALIGN 0x400000 /* do not ip-align allocated rx pkts */
#define IF_GET_IFACE 0x0001 /* for querying only */
#define IFF_802_1Q_VLAN IFF_802_1Q_VLAN
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1858,6 +1858,10 @@ static inline int pskb_trim(struct sk_bu
@@ -2044,6 +2044,10 @@ static inline int pskb_trim(struct sk_bu
return (len < skb->len) ? __pskb_trim(skb, len) : 0;
}
@ -45,7 +21,7 @@
/**
* pskb_trim_unique - remove end from a paged unique (not cloned) buffer
* @skb: buffer to alter
@@ -1984,16 +1988,6 @@ static inline struct sk_buff *dev_alloc_
@@ -2170,16 +2174,6 @@ static inline struct sk_buff *dev_alloc_
}
@ -64,7 +40,7 @@
{
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -24,6 +24,12 @@ menuconfig NET
@@ -25,6 +25,12 @@ menuconfig NET
if NET
@ -79,42 +55,42 @@
help
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -2614,10 +2614,20 @@ int dev_hard_start_xmit(struct sk_buff *
if (!list_empty(&ptype_all))
dev_queue_xmit_nit(skb, dev);
@@ -2607,10 +2607,20 @@ static int xmit_one(struct sk_buff *skb,
if (!list_empty(&ptype_all))
dev_queue_xmit_nit(skb, dev);
- skb_len = skb->len;
- trace_net_dev_start_xmit(skb, dev);
- rc = ops->ndo_start_xmit(skb, dev);
- trace_net_dev_xmit(skb, rc, dev, skb_len);
- len = skb->len;
- trace_net_dev_start_xmit(skb, dev);
- rc = netdev_start_xmit(skb, dev, txq, more);
- trace_net_dev_xmit(skb, rc, dev, len);
+#ifdef CONFIG_ETHERNET_PACKET_MANGLE
+ if (!dev->eth_mangle_tx ||
+ (skb = dev->eth_mangle_tx(dev, skb)) != NULL)
+ if (!dev->eth_mangle_tx ||
+ (skb = dev->eth_mangle_tx(dev, skb)) != NULL)
+#else
+ if (1)
+ if (1)
+#endif
+ {
+ skb_len = skb->len;
+ trace_net_dev_start_xmit(skb, dev);
+ rc = ops->ndo_start_xmit(skb, dev);
+ trace_net_dev_xmit(skb, rc, dev, skb_len);
+ } else {
+ rc = NETDEV_TX_OK;
+ }
if (rc == NETDEV_TX_OK)
txq_trans_update(txq);
return rc;
+ {
+ len = skb->len;
+ trace_net_dev_start_xmit(skb, dev);
+ rc = netdev_start_xmit(skb, dev, txq, more);
+ trace_net_dev_xmit(skb, rc, dev, len);
+ } else {
+ rc = NETDEV_TX_OK;
+ }
return rc;
}
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -62,6 +62,7 @@
#include <linux/scatterlist.h>
@@ -63,6 +63,7 @@
#include <linux/errqueue.h>
#include <linux/prefetch.h>
#include <linux/if_vlan.h>
+#include <linux/if.h>
#include <net/protocol.h>
#include <net/dst.h>
@@ -439,6 +440,22 @@ struct sk_buff *__netdev_alloc_skb(struc
@@ -451,6 +452,22 @@ struct sk_buff *__netdev_alloc_skb(struc
}
EXPORT_SYMBOL(__netdev_alloc_skb);
@ -139,7 +115,7 @@
{
--- a/net/ethernet/eth.c
+++ b/net/ethernet/eth.c
@@ -161,6 +161,12 @@ __be16 eth_type_trans(struct sk_buff *sk
@@ -188,6 +188,12 @@ __be16 eth_type_trans(struct sk_buff *sk
const struct ethhdr *eth;
skb->dev = dev;

@ -1,6 +1,6 @@
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -135,6 +135,10 @@ config ADM6996_PHY
@@ -139,6 +139,10 @@ config ADM6996_PHY
Currently supports the ADM6996FC and ADM6996M switches.
Support for FC is very limited.
@ -13,7 +13,7 @@
depends on PHYLIB=y
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -17,6 +17,7 @@ obj-$(CONFIG_BCM7XXX_PHY) += bcm7xxx.o
@@ -19,6 +19,7 @@ obj-$(CONFIG_BCM7XXX_PHY) += bcm7xxx.o
obj-$(CONFIG_BCM87XX_PHY) += bcm87xx.o
obj-$(CONFIG_ICPLUS_PHY) += icplus.o
obj-$(CONFIG_ADM6996_PHY) += adm6996.o

@ -1,6 +1,6 @@
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -139,6 +139,10 @@ config MVSWITCH_PHY
@@ -143,6 +143,10 @@ config MVSWITCH_PHY
tristate "Driver for Marvell 88E6060 switches"
select ETHERNET_PACKET_MANGLE
@ -13,7 +13,7 @@
depends on PHYLIB=y
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -18,6 +18,7 @@ obj-$(CONFIG_BCM87XX_PHY) += bcm87xx.o
@@ -20,6 +20,7 @@ obj-$(CONFIG_BCM87XX_PHY) += bcm87xx.o
obj-$(CONFIG_ICPLUS_PHY) += icplus.o
obj-$(CONFIG_ADM6996_PHY) += adm6996.o
obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o

@ -1,6 +1,6 @@
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -143,6 +143,11 @@ config IP17XX_PHY
@@ -147,6 +147,11 @@ config IP17XX_PHY
tristate "Driver for IC+ IP17xx switches"
select SWCONFIG
@ -14,7 +14,7 @@
depends on PHYLIB=y
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -20,6 +20,7 @@ obj-$(CONFIG_ADM6996_PHY) += adm6996.o
@@ -22,6 +22,7 @@ obj-$(CONFIG_ADM6996_PHY) += adm6996.o
obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
obj-$(CONFIG_IP17XX_PHY) += ip17xx.o
obj-$(CONFIG_REALTEK_PHY) += realtek.o

@ -1,6 +1,6 @@
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -148,6 +148,10 @@ config AR8216_PHY
@@ -152,6 +152,10 @@ config AR8216_PHY
select ETHERNET_PACKET_MANGLE
select SWCONFIG
@ -13,7 +13,7 @@
depends on PHYLIB=y
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -21,6 +21,7 @@ obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
@@ -23,6 +23,7 @@ obj-$(CONFIG_MVSWITCH_PHY) += mvswitch.o
obj-$(CONFIG_IP17XX_PHY) += ip17xx.o
obj-$(CONFIG_REALTEK_PHY) += realtek.o
obj-$(CONFIG_AR8216_PHY) += ar8216.o

@ -1,6 +1,6 @@
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -246,6 +246,30 @@ config MDIO_BCM_UNIMAC
@@ -250,6 +250,30 @@ config MDIO_BCM_UNIMAC
controllers as well as some Broadcom Ethernet switches such as the
Starfighter 2 switches.
@ -33,7 +33,7 @@
config MICREL_KS8995MA
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -22,6 +22,9 @@ obj-$(CONFIG_IP17XX_PHY) += ip17xx.o
@@ -24,6 +24,9 @@ obj-$(CONFIG_IP17XX_PHY) += ip17xx.o
obj-$(CONFIG_REALTEK_PHY) += realtek.o
obj-$(CONFIG_AR8216_PHY) += ar8216.o
obj-$(CONFIG_RTL8306_PHY) += rtl8306.o

@ -1,6 +1,6 @@
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -268,6 +268,10 @@ config RTL8366RB_PHY
@@ -272,6 +272,10 @@ config RTL8366RB_PHY
tristate "Driver for the Realtek RTL8366RB switch"
select SWCONFIG
@ -13,7 +13,7 @@
endif # PHYLIB
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -25,6 +25,7 @@ obj-$(CONFIG_RTL8306_PHY) += rtl8306.o
@@ -27,6 +27,7 @@ obj-$(CONFIG_RTL8306_PHY) += rtl8306.o
obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi.o
obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o
obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o

@ -1,6 +1,6 @@
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -152,6 +152,11 @@ config RTL8306_PHY
@@ -156,6 +156,11 @@ config RTL8306_PHY
tristate "Driver for Realtek RTL8306S switches"
select SWCONFIG
@ -14,7 +14,7 @@
depends on PHYLIB=y
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -27,6 +27,7 @@ obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o
@@ -29,6 +29,7 @@ obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o
obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o
obj-$(CONFIG_RTL8367_PHY) += rtl8367.o
obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o

@ -1,6 +1,6 @@
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -277,6 +277,10 @@ config RTL8367_PHY
@@ -281,6 +281,10 @@ config RTL8367_PHY
tristate "Driver for the Realtek RTL8367R/M switches"
select SWCONFIG
@ -13,7 +13,7 @@
endif # PHYLIB
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -26,6 +26,7 @@ obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi
@@ -28,6 +28,7 @@ obj-$(CONFIG_RTL8366_SMI) += rtl8366_smi
obj-$(CONFIG_RTL8366S_PHY) += rtl8366s.o
obj-$(CONFIG_RTL8366RB_PHY) += rtl8366rb.o
obj-$(CONFIG_RTL8367_PHY) += rtl8367.o

@ -1,6 +1,6 @@
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -288,3 +288,8 @@ endif # PHYLIB
@@ -292,3 +292,8 @@ endif # PHYLIB
config MICREL_KS8995MA
tristate "Micrel KS8995MA 5-ports 10/100 managed Ethernet switch"
depends on SPI
@ -11,7 +11,7 @@
+ select ETHERNET_PACKET_MANGLE
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -29,6 +29,7 @@ obj-$(CONFIG_RTL8367_PHY) += rtl8367.o
@@ -31,6 +31,7 @@ obj-$(CONFIG_RTL8367_PHY) += rtl8367.o
obj-$(CONFIG_RTL8367B_PHY) += rtl8367b.o
obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
obj-$(CONFIG_MICREL_PHY) += micrel.o

@ -1,6 +1,6 @@
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -283,6 +283,8 @@ config RTL8367B_PHY
@@ -287,6 +287,8 @@ config RTL8367B_PHY
endif # RTL8366_SMI
@ -11,7 +11,7 @@
config MICREL_KS8995MA
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -30,6 +30,7 @@ obj-$(CONFIG_RTL8367B_PHY) += rtl8367b.o
@@ -32,6 +32,7 @@ obj-$(CONFIG_RTL8367B_PHY) += rtl8367b.o
obj-$(CONFIG_LSI_ET1011C_PHY) += et1011c.o
obj-$(CONFIG_MICREL_PHY) += micrel.o
obj-$(CONFIG_PSB6970_PHY) += psb6970.o

@ -11,7 +11,7 @@
--- a/drivers/tty/serial/8250/Kconfig
+++ b/drivers/tty/serial/8250/Kconfig
@@ -90,6 +90,10 @@ config SERIAL_8250_CONSOLE
@@ -91,6 +91,10 @@ config SERIAL_8250_CONSOLE
If unsure, say N.
@ -19,6 +19,6 @@
+ bool "Magic sysrq support on 8250/16550 devices"
+ depends on SERIAL_8250_CONSOLE
+
config FIX_EARLYCON_MEM
bool
depends on X86
config SERIAL_8250_GSC
tristate
depends on SERIAL_8250 && GSC

@ -1,6 +1,6 @@
--- a/net/Kconfig
+++ b/net/Kconfig
@@ -83,6 +83,9 @@ source "net/netlabel/Kconfig"
@@ -89,6 +89,9 @@ source "net/netlabel/Kconfig"
endif # if INET

@ -42,8 +42,8 @@
+{
+}
+static inline ssize_t __blockdev_direct_IO(int rw, struct kiocb *iocb, struct inode *inode,
+ struct block_device *bdev, const struct iovec *iov, loff_t offset,
+ unsigned long nr_segs, get_block_t get_block, dio_iodone_t end_io,
+ struct block_device *bdev, struct iov_iter *iter, loff_t offset,
+ get_block_t get_block, dio_iodone_t end_io,
+ dio_submit_t submit_io, int flags)
+{
+ return -EOPNOTSUPP;

@ -40,7 +40,7 @@
+ */
+void random_input_words(__u32 *buf, size_t wordcount, int ent_count)
+{
+ mix_pool_bytes(&input_pool, buf, wordcount*4, NULL);
+ mix_pool_bytes(&input_pool, buf, wordcount*4);
+
+ credit_entropy_bits(&input_pool, ent_count);
+
@ -50,7 +50,7 @@
+ * Wake up waiting processes if we have enough
+ * entropy.
+ */
+ if (input_pool.entropy_count >= random_read_wakeup_thresh)
+ if (input_pool.entropy_count >= random_read_wakeup_bits)
+ wake_up_interruptible(&random_read_wait);
+}
+EXPORT_SYMBOL(random_input_words);
@ -67,16 +67,16 @@
+ int count;
+
+ wait_event_interruptible(random_write_wait,
+ input_pool.entropy_count < random_write_wakeup_thresh);
+ input_pool.entropy_count < random_write_wakeup_bits);
+
+ count = random_write_wakeup_thresh - input_pool.entropy_count;
+ count = random_write_wakeup_bits - input_pool.entropy_count;
+
+ /* likely we got woken up due to a signal */
+ if (count <= 0) count = random_read_wakeup_thresh;
+ if (count <= 0) count = random_read_wakeup_bits;
+
+ pr_notice("requesting %d bits from input_wait()er %d<%d\n",
+ count,
+ input_pool.entropy_count, random_write_wakeup_thresh);
+ input_pool.entropy_count, random_write_wakeup_bits);
+
+ return count;
+}

@ -72,15 +72,7 @@
* zap_page_range_single - remove user pages in a given range
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -1231,6 +1231,7 @@ int map_kernel_range_noflush(unsigned lo
{
return vmap_page_range_noflush(addr, addr + size, prot, pages);
}
+EXPORT_SYMBOL_GPL(unmap_kernel_range);
/**
* unmap_kernel_range_noflush - unmap kernel VM area
@@ -1372,6 +1373,7 @@ struct vm_struct *get_vm_area(unsigned l
@@ -1372,6 +1372,7 @@ struct vm_struct *get_vm_area(unsigned l
NUMA_NO_NODE, GFP_KERNEL,
__builtin_return_address(0));
}

Loading…
Cancel
Save