summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '4.1.5/1004_linux-4.1.5.patch')
-rw-r--r--4.1.5/1004_linux-4.1.5.patch5750
1 files changed, 0 insertions, 5750 deletions
diff --git a/4.1.5/1004_linux-4.1.5.patch b/4.1.5/1004_linux-4.1.5.patch
deleted file mode 100644
index cb5d5d6..0000000
--- a/4.1.5/1004_linux-4.1.5.patch
+++ /dev/null
@@ -1,5750 +0,0 @@
-diff --git a/Documentation/hwmon/nct7904 b/Documentation/hwmon/nct7904
-index 014f112..57fffe3 100644
---- a/Documentation/hwmon/nct7904
-+++ b/Documentation/hwmon/nct7904
-@@ -35,11 +35,11 @@ temp1_input Local temperature (1/1000 degree,
- temp[2-9]_input CPU temperatures (1/1000 degree,
- 0.125 degree resolution)
-
--fan[1-4]_mode R/W, 0/1 for manual or SmartFan mode
-+pwm[1-4]_enable R/W, 1/2 for manual or SmartFan mode
- Setting SmartFan mode is supported only if it has been
- previously configured by BIOS (or configuration EEPROM)
-
--fan[1-4]_pwm R/O in SmartFan mode, R/W in manual control mode
-+pwm[1-4] R/O in SmartFan mode, R/W in manual control mode
-
- The driver checks sensor control registers and does not export the sensors
- that are not enabled. Anyway, a sensor that is enabled may actually be not
-diff --git a/Documentation/kbuild/makefiles.txt b/Documentation/kbuild/makefiles.txt
-index 74b6c6d..d2b1c40 100644
---- a/Documentation/kbuild/makefiles.txt
-+++ b/Documentation/kbuild/makefiles.txt
-@@ -952,6 +952,14 @@ When kbuild executes, the following steps are followed (roughly):
- $(KBUILD_ARFLAGS) set by the top level Makefile to "D" (deterministic
- mode) if this option is supported by $(AR).
-
-+ ARCH_CPPFLAGS, ARCH_AFLAGS, ARCH_CFLAGS Overrides the kbuild defaults
-+
-+ These variables are appended to the KBUILD_CPPFLAGS,
-+ KBUILD_AFLAGS, and KBUILD_CFLAGS, respectively, after the
-+ top-level Makefile has set any other flags. This provides a
-+ means for an architecture to override the defaults.
-+
-+
- --- 6.2 Add prerequisites to archheaders:
-
- The archheaders: rule is used to generate header files that
-diff --git a/Makefile b/Makefile
-index 36f3225..068dd69 100644
---- a/Makefile
-+++ b/Makefile
-@@ -1,6 +1,6 @@
- VERSION = 4
- PATCHLEVEL = 1
--SUBLEVEL = 4
-+SUBLEVEL = 5
- EXTRAVERSION =
- NAME = Series 4800
-
-@@ -783,10 +783,11 @@ endif
- include scripts/Makefile.kasan
- include scripts/Makefile.extrawarn
-
--# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
--KBUILD_CPPFLAGS += $(KCPPFLAGS)
--KBUILD_AFLAGS += $(KAFLAGS)
--KBUILD_CFLAGS += $(KCFLAGS)
-+# Add any arch overrides and user supplied CPPFLAGS, AFLAGS and CFLAGS as the
-+# last assignments
-+KBUILD_CPPFLAGS += $(ARCH_CPPFLAGS) $(KCPPFLAGS)
-+KBUILD_AFLAGS += $(ARCH_AFLAGS) $(KAFLAGS)
-+KBUILD_CFLAGS += $(ARCH_CFLAGS) $(KCFLAGS)
-
- # Use --build-id when available.
- LDFLAGS_BUILD_ID = $(patsubst -Wl$(comma)%,%,\
-diff --git a/arch/arc/Makefile b/arch/arc/Makefile
-index db72fec..2f21e1e 100644
---- a/arch/arc/Makefile
-+++ b/arch/arc/Makefile
-@@ -43,7 +43,8 @@ endif
-
- ifndef CONFIG_CC_OPTIMIZE_FOR_SIZE
- # Generic build system uses -O2, we want -O3
--cflags-y += -O3
-+# Note: No need to add to cflags-y as that happens anyways
-+ARCH_CFLAGS += -O3
- endif
-
- # small data is default for elf32 tool-chain. If not usable, disable it
-diff --git a/arch/arc/include/asm/bitops.h b/arch/arc/include/asm/bitops.h
-index 624a9d0..dae03e6 100644
---- a/arch/arc/include/asm/bitops.h
-+++ b/arch/arc/include/asm/bitops.h
-@@ -18,83 +18,49 @@
- #include <linux/types.h>
- #include <linux/compiler.h>
- #include <asm/barrier.h>
-+#ifndef CONFIG_ARC_HAS_LLSC
-+#include <asm/smp.h>
-+#endif
-
--/*
-- * Hardware assisted read-modify-write using ARC700 LLOCK/SCOND insns.
-- * The Kconfig glue ensures that in SMP, this is only set if the container
-- * SoC/platform has cross-core coherent LLOCK/SCOND
-- */
- #if defined(CONFIG_ARC_HAS_LLSC)
-
--static inline void set_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned int temp;
--
-- m += nr >> 5;
--
-- /*
-- * ARC ISA micro-optimization:
-- *
-- * Instructions dealing with bitpos only consider lower 5 bits (0-31)
-- * e.g (x << 33) is handled like (x << 1) by ASL instruction
-- * (mem pointer still needs adjustment to point to next word)
-- *
-- * Hence the masking to clamp @nr arg can be elided in general.
-- *
-- * However if @nr is a constant (above assumed it in a register),
-- * and greater than 31, gcc can optimize away (x << 33) to 0,
-- * as overflow, given the 32-bit ISA. Thus masking needs to be done
-- * for constant @nr, but no code is generated due to const prop.
-- */
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- __asm__ __volatile__(
-- "1: llock %0, [%1] \n"
-- " bset %0, %0, %2 \n"
-- " scond %0, [%1] \n"
-- " bnz 1b \n"
-- : "=&r"(temp)
-- : "r"(m), "ir"(nr)
-- : "cc");
--}
--
--static inline void clear_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned int temp;
--
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- __asm__ __volatile__(
-- "1: llock %0, [%1] \n"
-- " bclr %0, %0, %2 \n"
-- " scond %0, [%1] \n"
-- " bnz 1b \n"
-- : "=&r"(temp)
-- : "r"(m), "ir"(nr)
-- : "cc");
--}
--
--static inline void change_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned int temp;
--
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
-+/*
-+ * Hardware assisted Atomic-R-M-W
-+ */
-
-- __asm__ __volatile__(
-- "1: llock %0, [%1] \n"
-- " bxor %0, %0, %2 \n"
-- " scond %0, [%1] \n"
-- " bnz 1b \n"
-- : "=&r"(temp)
-- : "r"(m), "ir"(nr)
-- : "cc");
-+#define BIT_OP(op, c_op, asm_op) \
-+static inline void op##_bit(unsigned long nr, volatile unsigned long *m)\
-+{ \
-+ unsigned int temp; \
-+ \
-+ m += nr >> 5; \
-+ \
-+ /* \
-+ * ARC ISA micro-optimization: \
-+ * \
-+ * Instructions dealing with bitpos only consider lower 5 bits \
-+ * e.g (x << 33) is handled like (x << 1) by ASL instruction \
-+ * (mem pointer still needs adjustment to point to next word) \
-+ * \
-+ * Hence the masking to clamp @nr arg can be elided in general. \
-+ * \
-+ * However if @nr is a constant (above assumed in a register), \
-+ * and greater than 31, gcc can optimize away (x << 33) to 0, \
-+ * as overflow, given the 32-bit ISA. Thus masking needs to be \
-+ * done for const @nr, but no code is generated due to gcc \
-+ * const prop. \
-+ */ \
-+ nr &= 0x1f; \
-+ \
-+ __asm__ __volatile__( \
-+ "1: llock %0, [%1] \n" \
-+ " " #asm_op " %0, %0, %2 \n" \
-+ " scond %0, [%1] \n" \
-+ " bnz 1b \n" \
-+ : "=&r"(temp) /* Early clobber, to prevent reg reuse */ \
-+ : "r"(m), /* Not "m": llock only supports reg direct addr mode */ \
-+ "ir"(nr) \
-+ : "cc"); \
- }
-
- /*
-@@ -108,91 +74,37 @@ static inline void change_bit(unsigned long nr, volatile unsigned long *m)
- * Since ARC lacks a equivalent h/w primitive, the bit is set unconditionally
- * and the old value of bit is returned
- */
--static inline int test_and_set_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long old, temp;
--
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- /*
-- * Explicit full memory barrier needed before/after as
-- * LLOCK/SCOND themselves don't provide any such semantics
-- */
-- smp_mb();
--
-- __asm__ __volatile__(
-- "1: llock %0, [%2] \n"
-- " bset %1, %0, %3 \n"
-- " scond %1, [%2] \n"
-- " bnz 1b \n"
-- : "=&r"(old), "=&r"(temp)
-- : "r"(m), "ir"(nr)
-- : "cc");
--
-- smp_mb();
--
-- return (old & (1 << nr)) != 0;
--}
--
--static inline int
--test_and_clear_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned int old, temp;
--
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- smp_mb();
--
-- __asm__ __volatile__(
-- "1: llock %0, [%2] \n"
-- " bclr %1, %0, %3 \n"
-- " scond %1, [%2] \n"
-- " bnz 1b \n"
-- : "=&r"(old), "=&r"(temp)
-- : "r"(m), "ir"(nr)
-- : "cc");
--
-- smp_mb();
--
-- return (old & (1 << nr)) != 0;
--}
--
--static inline int
--test_and_change_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned int old, temp;
--
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- smp_mb();
--
-- __asm__ __volatile__(
-- "1: llock %0, [%2] \n"
-- " bxor %1, %0, %3 \n"
-- " scond %1, [%2] \n"
-- " bnz 1b \n"
-- : "=&r"(old), "=&r"(temp)
-- : "r"(m), "ir"(nr)
-- : "cc");
--
-- smp_mb();
--
-- return (old & (1 << nr)) != 0;
-+#define TEST_N_BIT_OP(op, c_op, asm_op) \
-+static inline int test_and_##op##_bit(unsigned long nr, volatile unsigned long *m)\
-+{ \
-+ unsigned long old, temp; \
-+ \
-+ m += nr >> 5; \
-+ \
-+ nr &= 0x1f; \
-+ \
-+ /* \
-+ * Explicit full memory barrier needed before/after as \
-+ * LLOCK/SCOND themselves don't provide any such smenatic \
-+ */ \
-+ smp_mb(); \
-+ \
-+ __asm__ __volatile__( \
-+ "1: llock %0, [%2] \n" \
-+ " " #asm_op " %1, %0, %3 \n" \
-+ " scond %1, [%2] \n" \
-+ " bnz 1b \n" \
-+ : "=&r"(old), "=&r"(temp) \
-+ : "r"(m), "ir"(nr) \
-+ : "cc"); \
-+ \
-+ smp_mb(); \
-+ \
-+ return (old & (1 << nr)) != 0; \
- }
-
- #else /* !CONFIG_ARC_HAS_LLSC */
-
--#include <asm/smp.h>
--
- /*
- * Non hardware assisted Atomic-R-M-W
- * Locking would change to irq-disabling only (UP) and spinlocks (SMP)
-@@ -209,111 +121,37 @@ test_and_change_bit(unsigned long nr, volatile unsigned long *m)
- * at compile time)
- */
-
--static inline void set_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long temp, flags;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- bitops_lock(flags);
--
-- temp = *m;
-- *m = temp | (1UL << nr);
--
-- bitops_unlock(flags);
-+#define BIT_OP(op, c_op, asm_op) \
-+static inline void op##_bit(unsigned long nr, volatile unsigned long *m)\
-+{ \
-+ unsigned long temp, flags; \
-+ m += nr >> 5; \
-+ \
-+ /* \
-+ * spin lock/unlock provide the needed smp_mb() before/after \
-+ */ \
-+ bitops_lock(flags); \
-+ \
-+ temp = *m; \
-+ *m = temp c_op (1UL << (nr & 0x1f)); \
-+ \
-+ bitops_unlock(flags); \
- }
-
--static inline void clear_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long temp, flags;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- bitops_lock(flags);
--
-- temp = *m;
-- *m = temp & ~(1UL << nr);
--
-- bitops_unlock(flags);
--}
--
--static inline void change_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long temp, flags;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- bitops_lock(flags);
--
-- temp = *m;
-- *m = temp ^ (1UL << nr);
--
-- bitops_unlock(flags);
--}
--
--static inline int test_and_set_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long old, flags;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- /*
-- * spin lock/unlock provide the needed smp_mb() before/after
-- */
-- bitops_lock(flags);
--
-- old = *m;
-- *m = old | (1 << nr);
--
-- bitops_unlock(flags);
--
-- return (old & (1 << nr)) != 0;
--}
--
--static inline int
--test_and_clear_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long old, flags;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- bitops_lock(flags);
--
-- old = *m;
-- *m = old & ~(1 << nr);
--
-- bitops_unlock(flags);
--
-- return (old & (1 << nr)) != 0;
--}
--
--static inline int
--test_and_change_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long old, flags;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- bitops_lock(flags);
--
-- old = *m;
-- *m = old ^ (1 << nr);
--
-- bitops_unlock(flags);
--
-- return (old & (1 << nr)) != 0;
-+#define TEST_N_BIT_OP(op, c_op, asm_op) \
-+static inline int test_and_##op##_bit(unsigned long nr, volatile unsigned long *m)\
-+{ \
-+ unsigned long old, flags; \
-+ m += nr >> 5; \
-+ \
-+ bitops_lock(flags); \
-+ \
-+ old = *m; \
-+ *m = old c_op (1UL << (nr & 0x1f)); \
-+ \
-+ bitops_unlock(flags); \
-+ \
-+ return (old & (1UL << (nr & 0x1f))) != 0; \
- }
-
- #endif /* CONFIG_ARC_HAS_LLSC */
-@@ -322,86 +160,45 @@ test_and_change_bit(unsigned long nr, volatile unsigned long *m)
- * Non atomic variants
- **************************************/
-
--static inline void __set_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long temp;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- temp = *m;
-- *m = temp | (1UL << nr);
-+#define __BIT_OP(op, c_op, asm_op) \
-+static inline void __##op##_bit(unsigned long nr, volatile unsigned long *m) \
-+{ \
-+ unsigned long temp; \
-+ m += nr >> 5; \
-+ \
-+ temp = *m; \
-+ *m = temp c_op (1UL << (nr & 0x1f)); \
- }
-
--static inline void __clear_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long temp;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- temp = *m;
-- *m = temp & ~(1UL << nr);
-+#define __TEST_N_BIT_OP(op, c_op, asm_op) \
-+static inline int __test_and_##op##_bit(unsigned long nr, volatile unsigned long *m)\
-+{ \
-+ unsigned long old; \
-+ m += nr >> 5; \
-+ \
-+ old = *m; \
-+ *m = old c_op (1UL << (nr & 0x1f)); \
-+ \
-+ return (old & (1UL << (nr & 0x1f))) != 0; \
- }
-
--static inline void __change_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long temp;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- temp = *m;
-- *m = temp ^ (1UL << nr);
--}
--
--static inline int
--__test_and_set_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long old;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- old = *m;
-- *m = old | (1 << nr);
--
-- return (old & (1 << nr)) != 0;
--}
--
--static inline int
--__test_and_clear_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long old;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- old = *m;
-- *m = old & ~(1 << nr);
--
-- return (old & (1 << nr)) != 0;
--}
--
--static inline int
--__test_and_change_bit(unsigned long nr, volatile unsigned long *m)
--{
-- unsigned long old;
-- m += nr >> 5;
--
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- old = *m;
-- *m = old ^ (1 << nr);
--
-- return (old & (1 << nr)) != 0;
--}
-+#define BIT_OPS(op, c_op, asm_op) \
-+ \
-+ /* set_bit(), clear_bit(), change_bit() */ \
-+ BIT_OP(op, c_op, asm_op) \
-+ \
-+ /* test_and_set_bit(), test_and_clear_bit(), test_and_change_bit() */\
-+ TEST_N_BIT_OP(op, c_op, asm_op) \
-+ \
-+ /* __set_bit(), __clear_bit(), __change_bit() */ \
-+ __BIT_OP(op, c_op, asm_op) \
-+ \
-+ /* __test_and_set_bit(), __test_and_clear_bit(), __test_and_change_bit() */\
-+ __TEST_N_BIT_OP(op, c_op, asm_op)
-+
-+BIT_OPS(set, |, bset)
-+BIT_OPS(clear, & ~, bclr)
-+BIT_OPS(change, ^, bxor)
-
- /*
- * This routine doesn't need to be atomic.
-@@ -413,10 +210,7 @@ test_bit(unsigned int nr, const volatile unsigned long *addr)
-
- addr += nr >> 5;
-
-- if (__builtin_constant_p(nr))
-- nr &= 0x1f;
--
-- mask = 1 << nr;
-+ mask = 1UL << (nr & 0x1f);
-
- return ((mask & *addr) != 0);
- }
-diff --git a/arch/arc/include/asm/ptrace.h b/arch/arc/include/asm/ptrace.h
-index 1bfeec2..2a58af7 100644
---- a/arch/arc/include/asm/ptrace.h
-+++ b/arch/arc/include/asm/ptrace.h
-@@ -63,7 +63,7 @@ struct callee_regs {
- long r25, r24, r23, r22, r21, r20, r19, r18, r17, r16, r15, r14, r13;
- };
-
--#define instruction_pointer(regs) ((regs)->ret)
-+#define instruction_pointer(regs) (unsigned long)((regs)->ret)
- #define profile_pc(regs) instruction_pointer(regs)
-
- /* return 1 if user mode or 0 if kernel mode */
-diff --git a/arch/arm/boot/dts/am57xx-beagle-x15.dts b/arch/arm/boot/dts/am57xx-beagle-x15.dts
-index 7128fad..c9df40e 100644
---- a/arch/arm/boot/dts/am57xx-beagle-x15.dts
-+++ b/arch/arm/boot/dts/am57xx-beagle-x15.dts
-@@ -544,6 +544,10 @@
- phy-supply = <&ldousb_reg>;
- };
-
-+&usb2_phy2 {
-+ phy-supply = <&ldousb_reg>;
-+};
-+
- &usb1 {
- dr_mode = "host";
- pinctrl-names = "default";
-diff --git a/arch/arm/boot/dts/dra7-evm.dts b/arch/arm/boot/dts/dra7-evm.dts
-index aa46590..096f68b 100644
---- a/arch/arm/boot/dts/dra7-evm.dts
-+++ b/arch/arm/boot/dts/dra7-evm.dts
-@@ -686,7 +686,8 @@
-
- &dcan1 {
- status = "ok";
-- pinctrl-names = "default", "sleep";
-- pinctrl-0 = <&dcan1_pins_default>;
-+ pinctrl-names = "default", "sleep", "active";
-+ pinctrl-0 = <&dcan1_pins_sleep>;
- pinctrl-1 = <&dcan1_pins_sleep>;
-+ pinctrl-2 = <&dcan1_pins_default>;
- };
-diff --git a/arch/arm/boot/dts/dra72-evm.dts b/arch/arm/boot/dts/dra72-evm.dts
-index ce0390f..6b05f6a 100644
---- a/arch/arm/boot/dts/dra72-evm.dts
-+++ b/arch/arm/boot/dts/dra72-evm.dts
-@@ -497,9 +497,10 @@
-
- &dcan1 {
- status = "ok";
-- pinctrl-names = "default", "sleep";
-- pinctrl-0 = <&dcan1_pins_default>;
-+ pinctrl-names = "default", "sleep", "active";
-+ pinctrl-0 = <&dcan1_pins_sleep>;
- pinctrl-1 = <&dcan1_pins_sleep>;
-+ pinctrl-2 = <&dcan1_pins_default>;
- };
-
- &qspi {
-diff --git a/arch/arm/mach-imx/gpc.c b/arch/arm/mach-imx/gpc.c
-index 6d0893a..78b6fd0 100644
---- a/arch/arm/mach-imx/gpc.c
-+++ b/arch/arm/mach-imx/gpc.c
-@@ -291,8 +291,6 @@ void __init imx_gpc_check_dt(void)
- }
- }
-
--#ifdef CONFIG_PM_GENERIC_DOMAINS
--
- static void _imx6q_pm_pu_power_off(struct generic_pm_domain *genpd)
- {
- int iso, iso2sw;
-@@ -399,7 +397,6 @@ static struct genpd_onecell_data imx_gpc_onecell_data = {
- static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg)
- {
- struct clk *clk;
-- bool is_off;
- int i;
-
- imx6q_pu_domain.reg = pu_reg;
-@@ -416,18 +413,13 @@ static int imx_gpc_genpd_init(struct device *dev, struct regulator *pu_reg)
- }
- imx6q_pu_domain.num_clks = i;
-
-- is_off = IS_ENABLED(CONFIG_PM);
-- if (is_off) {
-- _imx6q_pm_pu_power_off(&imx6q_pu_domain.base);
-- } else {
-- /*
-- * Enable power if compiled without CONFIG_PM in case the
-- * bootloader disabled it.
-- */
-- imx6q_pm_pu_power_on(&imx6q_pu_domain.base);
-- }
-+ /* Enable power always in case bootloader disabled it. */
-+ imx6q_pm_pu_power_on(&imx6q_pu_domain.base);
-+
-+ if (!IS_ENABLED(CONFIG_PM_GENERIC_DOMAINS))
-+ return 0;
-
-- pm_genpd_init(&imx6q_pu_domain.base, NULL, is_off);
-+ pm_genpd_init(&imx6q_pu_domain.base, NULL, false);
- return of_genpd_add_provider_onecell(dev->of_node,
- &imx_gpc_onecell_data);
-
-@@ -437,13 +429,6 @@ clk_err:
- return -EINVAL;
- }
-
--#else
--static inline int imx_gpc_genpd_init(struct device *dev, struct regulator *reg)
--{
-- return 0;
--}
--#endif /* CONFIG_PM_GENERIC_DOMAINS */
--
- static int imx_gpc_probe(struct platform_device *pdev)
- {
- struct regulator *pu_reg;
-diff --git a/arch/arm/mach-pxa/capc7117.c b/arch/arm/mach-pxa/capc7117.c
-index c092730..bf366b3 100644
---- a/arch/arm/mach-pxa/capc7117.c
-+++ b/arch/arm/mach-pxa/capc7117.c
-@@ -24,6 +24,7 @@
- #include <linux/ata_platform.h>
- #include <linux/serial_8250.h>
- #include <linux/gpio.h>
-+#include <linux/regulator/machine.h>
-
- #include <asm/mach-types.h>
- #include <asm/mach/arch.h>
-@@ -144,6 +145,8 @@ static void __init capc7117_init(void)
-
- capc7117_uarts_init();
- capc7117_ide_init();
-+
-+ regulator_has_full_constraints();
- }
-
- MACHINE_START(CAPC7117,
-diff --git a/arch/arm/mach-pxa/cm-x2xx.c b/arch/arm/mach-pxa/cm-x2xx.c
-index bb99f59..a17a91e 100644
---- a/arch/arm/mach-pxa/cm-x2xx.c
-+++ b/arch/arm/mach-pxa/cm-x2xx.c
-@@ -13,6 +13,7 @@
- #include <linux/syscore_ops.h>
- #include <linux/irq.h>
- #include <linux/gpio.h>
-+#include <linux/regulator/machine.h>
-
- #include <linux/dm9000.h>
- #include <linux/leds.h>
-@@ -466,6 +467,8 @@ static void __init cmx2xx_init(void)
- cmx2xx_init_ac97();
- cmx2xx_init_touchscreen();
- cmx2xx_init_leds();
-+
-+ regulator_has_full_constraints();
- }
-
- static void __init cmx2xx_init_irq(void)
-diff --git a/arch/arm/mach-pxa/cm-x300.c b/arch/arm/mach-pxa/cm-x300.c
-index 4d3588d..5851f4c 100644
---- a/arch/arm/mach-pxa/cm-x300.c
-+++ b/arch/arm/mach-pxa/cm-x300.c
-@@ -835,6 +835,8 @@ static void __init cm_x300_init(void)
- cm_x300_init_ac97();
- cm_x300_init_wi2wi();
- cm_x300_init_bl();
-+
-+ regulator_has_full_constraints();
- }
-
- static void __init cm_x300_fixup(struct tag *tags, char **cmdline)
-diff --git a/arch/arm/mach-pxa/colibri-pxa270.c b/arch/arm/mach-pxa/colibri-pxa270.c
-index 5f9d930..3503826 100644
---- a/arch/arm/mach-pxa/colibri-pxa270.c
-+++ b/arch/arm/mach-pxa/colibri-pxa270.c
-@@ -18,6 +18,7 @@
- #include <linux/mtd/partitions.h>
- #include <linux/mtd/physmap.h>
- #include <linux/platform_device.h>
-+#include <linux/regulator/machine.h>
- #include <linux/ucb1400.h>
-
- #include <asm/mach/arch.h>
-@@ -294,6 +295,8 @@ static void __init colibri_pxa270_init(void)
- printk(KERN_ERR "Illegal colibri_pxa270_baseboard type %d\n",
- colibri_pxa270_baseboard);
- }
-+
-+ regulator_has_full_constraints();
- }
-
- /* The "Income s.r.o. SH-Dmaster PXA270 SBC" board can be booted either
-diff --git a/arch/arm/mach-pxa/em-x270.c b/arch/arm/mach-pxa/em-x270.c
-index 51531ec..9d7072b 100644
---- a/arch/arm/mach-pxa/em-x270.c
-+++ b/arch/arm/mach-pxa/em-x270.c
-@@ -1306,6 +1306,8 @@ static void __init em_x270_init(void)
- em_x270_init_i2c();
- em_x270_init_camera();
- em_x270_userspace_consumers_init();
-+
-+ regulator_has_full_constraints();
- }
-
- MACHINE_START(EM_X270, "Compulab EM-X270")
-diff --git a/arch/arm/mach-pxa/icontrol.c b/arch/arm/mach-pxa/icontrol.c
-index c98511c..9b0eb02 100644
---- a/arch/arm/mach-pxa/icontrol.c
-+++ b/arch/arm/mach-pxa/icontrol.c
-@@ -26,6 +26,7 @@
- #include <linux/spi/spi.h>
- #include <linux/spi/pxa2xx_spi.h>
- #include <linux/can/platform/mcp251x.h>
-+#include <linux/regulator/machine.h>
-
- #include "generic.h"
-
-@@ -185,6 +186,8 @@ static void __init icontrol_init(void)
- mxm_8x10_mmc_init();
-
- icontrol_can_init();
-+
-+ regulator_has_full_constraints();
- }
-
- MACHINE_START(ICONTROL, "iControl/SafeTcam boards using Embedian MXM-8x10 CoM")
-diff --git a/arch/arm/mach-pxa/trizeps4.c b/arch/arm/mach-pxa/trizeps4.c
-index 872dcb2..066e3a2 100644
---- a/arch/arm/mach-pxa/trizeps4.c
-+++ b/arch/arm/mach-pxa/trizeps4.c
-@@ -26,6 +26,7 @@
- #include <linux/dm9000.h>
- #include <linux/mtd/physmap.h>
- #include <linux/mtd/partitions.h>
-+#include <linux/regulator/machine.h>
- #include <linux/i2c/pxa-i2c.h>
-
- #include <asm/types.h>
-@@ -534,6 +535,8 @@ static void __init trizeps4_init(void)
-
- BCR_writew(trizeps_conxs_bcr);
- board_backlight_power(1);
-+
-+ regulator_has_full_constraints();
- }
-
- static void __init trizeps4_map_io(void)
-diff --git a/arch/arm/mach-pxa/vpac270.c b/arch/arm/mach-pxa/vpac270.c
-index aa89488..54122a9 100644
---- a/arch/arm/mach-pxa/vpac270.c
-+++ b/arch/arm/mach-pxa/vpac270.c
-@@ -24,6 +24,7 @@
- #include <linux/dm9000.h>
- #include <linux/ucb1400.h>
- #include <linux/ata_platform.h>
-+#include <linux/regulator/machine.h>
- #include <linux/regulator/max1586.h>
- #include <linux/i2c/pxa-i2c.h>
-
-@@ -711,6 +712,8 @@ static void __init vpac270_init(void)
- vpac270_ts_init();
- vpac270_rtc_init();
- vpac270_ide_init();
-+
-+ regulator_has_full_constraints();
- }
-
- MACHINE_START(VPAC270, "Voipac PXA270")
-diff --git a/arch/arm/mach-pxa/zeus.c b/arch/arm/mach-pxa/zeus.c
-index ac2ae5c..6158566f 100644
---- a/arch/arm/mach-pxa/zeus.c
-+++ b/arch/arm/mach-pxa/zeus.c
-@@ -868,6 +868,8 @@ static void __init zeus_init(void)
- i2c_register_board_info(0, ARRAY_AND_SIZE(zeus_i2c_devices));
- pxa2xx_set_spi_info(3, &pxa2xx_spi_ssp3_master_info);
- spi_register_board_info(zeus_spi_board_info, ARRAY_SIZE(zeus_spi_board_info));
-+
-+ regulator_has_full_constraints();
- }
-
- static struct map_desc zeus_io_desc[] __initdata = {
-diff --git a/arch/arm/mm/dma-mapping.c b/arch/arm/mm/dma-mapping.c
-index 7e7583d..6e4b9ff 100644
---- a/arch/arm/mm/dma-mapping.c
-+++ b/arch/arm/mm/dma-mapping.c
-@@ -1953,7 +1953,7 @@ static int extend_iommu_mapping(struct dma_iommu_mapping *mapping)
- {
- int next_bitmap;
-
-- if (mapping->nr_bitmaps > mapping->extensions)
-+ if (mapping->nr_bitmaps >= mapping->extensions)
- return -EINVAL;
-
- next_bitmap = mapping->nr_bitmaps;
-diff --git a/arch/arm64/kernel/efi.c b/arch/arm64/kernel/efi.c
-index ab21e0d..352962b 100644
---- a/arch/arm64/kernel/efi.c
-+++ b/arch/arm64/kernel/efi.c
-@@ -122,12 +122,12 @@ static int __init uefi_init(void)
-
- /* Show what we know for posterity */
- c16 = early_memremap(efi_to_phys(efi.systab->fw_vendor),
-- sizeof(vendor));
-+ sizeof(vendor) * sizeof(efi_char16_t));
- if (c16) {
- for (i = 0; i < (int) sizeof(vendor) - 1 && *c16; ++i)
- vendor[i] = c16[i];
- vendor[i] = '\0';
-- early_memunmap(c16, sizeof(vendor));
-+ early_memunmap(c16, sizeof(vendor) * sizeof(efi_char16_t));
- }
-
- pr_info("EFI v%u.%.02u by %s\n",
-diff --git a/arch/avr32/mach-at32ap/clock.c b/arch/avr32/mach-at32ap/clock.c
-index 23b1a97..52c179b 100644
---- a/arch/avr32/mach-at32ap/clock.c
-+++ b/arch/avr32/mach-at32ap/clock.c
-@@ -80,6 +80,9 @@ int clk_enable(struct clk *clk)
- {
- unsigned long flags;
-
-+ if (!clk)
-+ return 0;
-+
- spin_lock_irqsave(&clk_lock, flags);
- __clk_enable(clk);
- spin_unlock_irqrestore(&clk_lock, flags);
-@@ -106,6 +109,9 @@ void clk_disable(struct clk *clk)
- {
- unsigned long flags;
-
-+ if (IS_ERR_OR_NULL(clk))
-+ return;
-+
- spin_lock_irqsave(&clk_lock, flags);
- __clk_disable(clk);
- spin_unlock_irqrestore(&clk_lock, flags);
-@@ -117,6 +123,9 @@ unsigned long clk_get_rate(struct clk *clk)
- unsigned long flags;
- unsigned long rate;
-
-+ if (!clk)
-+ return 0;
-+
- spin_lock_irqsave(&clk_lock, flags);
- rate = clk->get_rate(clk);
- spin_unlock_irqrestore(&clk_lock, flags);
-@@ -129,6 +138,9 @@ long clk_round_rate(struct clk *clk, unsigned long rate)
- {
- unsigned long flags, actual_rate;
-
-+ if (!clk)
-+ return 0;
-+
- if (!clk->set_rate)
- return -ENOSYS;
-
-@@ -145,6 +157,9 @@ int clk_set_rate(struct clk *clk, unsigned long rate)
- unsigned long flags;
- long ret;
-
-+ if (!clk)
-+ return 0;
-+
- if (!clk->set_rate)
- return -ENOSYS;
-
-@@ -161,6 +176,9 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
- unsigned long flags;
- int ret;
-
-+ if (!clk)
-+ return 0;
-+
- if (!clk->set_parent)
- return -ENOSYS;
-
-@@ -174,7 +192,7 @@ EXPORT_SYMBOL(clk_set_parent);
-
- struct clk *clk_get_parent(struct clk *clk)
- {
-- return clk->parent;
-+ return !clk ? NULL : clk->parent;
- }
- EXPORT_SYMBOL(clk_get_parent);
-
-diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
-index f501665..a3b1ffe 100644
---- a/arch/mips/Kconfig
-+++ b/arch/mips/Kconfig
-@@ -1417,6 +1417,7 @@ config CPU_MIPS64_R6
- select CPU_SUPPORTS_HIGHMEM
- select CPU_SUPPORTS_MSA
- select GENERIC_CSUM
-+ select MIPS_O32_FP64_SUPPORT if MIPS32_O32
- help
- Choose this option to build a kernel for release 6 or later of the
- MIPS64 architecture. New MIPS processors, starting with the Warrior
-diff --git a/arch/mips/include/asm/fpu.h b/arch/mips/include/asm/fpu.h
-index 084780b..1b06251 100644
---- a/arch/mips/include/asm/fpu.h
-+++ b/arch/mips/include/asm/fpu.h
-@@ -74,7 +74,7 @@ static inline int __enable_fpu(enum fpu_mode mode)
- goto fr_common;
-
- case FPU_64BIT:
--#if !(defined(CONFIG_CPU_MIPS32_R2) || defined(CONFIG_CPU_MIPS32_R6) \
-+#if !(defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6) \
- || defined(CONFIG_64BIT))
- /* we only have a 32-bit FPU */
- return SIGFPE;
-diff --git a/arch/mips/include/asm/smp.h b/arch/mips/include/asm/smp.h
-index 2b25d1b..16f1ea9 100644
---- a/arch/mips/include/asm/smp.h
-+++ b/arch/mips/include/asm/smp.h
-@@ -23,6 +23,7 @@
- extern int smp_num_siblings;
- extern cpumask_t cpu_sibling_map[];
- extern cpumask_t cpu_core_map[];
-+extern cpumask_t cpu_foreign_map;
-
- #define raw_smp_processor_id() (current_thread_info()->cpu)
-
-diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
-index faa46eb..d0744cc 100644
---- a/arch/mips/kernel/smp.c
-+++ b/arch/mips/kernel/smp.c
-@@ -63,6 +63,13 @@ EXPORT_SYMBOL(cpu_sibling_map);
- cpumask_t cpu_core_map[NR_CPUS] __read_mostly;
- EXPORT_SYMBOL(cpu_core_map);
-
-+/*
-+ * A logcal cpu mask containing only one VPE per core to
-+ * reduce the number of IPIs on large MT systems.
-+ */
-+cpumask_t cpu_foreign_map __read_mostly;
-+EXPORT_SYMBOL(cpu_foreign_map);
-+
- /* representing cpus for which sibling maps can be computed */
- static cpumask_t cpu_sibling_setup_map;
-
-@@ -103,6 +110,29 @@ static inline void set_cpu_core_map(int cpu)
- }
- }
-
-+/*
-+ * Calculate a new cpu_foreign_map mask whenever a
-+ * new cpu appears or disappears.
-+ */
-+static inline void calculate_cpu_foreign_map(void)
-+{
-+ int i, k, core_present;
-+ cpumask_t temp_foreign_map;
-+
-+ /* Re-calculate the mask */
-+ for_each_online_cpu(i) {
-+ core_present = 0;
-+ for_each_cpu(k, &temp_foreign_map)
-+ if (cpu_data[i].package == cpu_data[k].package &&
-+ cpu_data[i].core == cpu_data[k].core)
-+ core_present = 1;
-+ if (!core_present)
-+ cpumask_set_cpu(i, &temp_foreign_map);
-+ }
-+
-+ cpumask_copy(&cpu_foreign_map, &temp_foreign_map);
-+}
-+
- struct plat_smp_ops *mp_ops;
- EXPORT_SYMBOL(mp_ops);
-
-@@ -146,6 +176,8 @@ asmlinkage void start_secondary(void)
- set_cpu_sibling_map(cpu);
- set_cpu_core_map(cpu);
-
-+ calculate_cpu_foreign_map();
-+
- cpumask_set_cpu(cpu, &cpu_callin_map);
-
- synchronise_count_slave(cpu);
-@@ -173,9 +205,18 @@ void __irq_entry smp_call_function_interrupt(void)
- static void stop_this_cpu(void *dummy)
- {
- /*
-- * Remove this CPU:
-+ * Remove this CPU. Be a bit slow here and
-+ * set the bits for every online CPU so we don't miss
-+ * any IPI whilst taking this VPE down.
- */
-+
-+ cpumask_copy(&cpu_foreign_map, cpu_online_mask);
-+
-+ /* Make it visible to every other CPU */
-+ smp_mb();
-+
- set_cpu_online(smp_processor_id(), false);
-+ calculate_cpu_foreign_map();
- local_irq_disable();
- while (1);
- }
-@@ -197,6 +238,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
- mp_ops->prepare_cpus(max_cpus);
- set_cpu_sibling_map(0);
- set_cpu_core_map(0);
-+ calculate_cpu_foreign_map();
- #ifndef CONFIG_HOTPLUG_CPU
- init_cpu_present(cpu_possible_mask);
- #endif
-diff --git a/arch/mips/math-emu/cp1emu.c b/arch/mips/math-emu/cp1emu.c
-index 22b9b2c..6983fcd 100644
---- a/arch/mips/math-emu/cp1emu.c
-+++ b/arch/mips/math-emu/cp1emu.c
-@@ -451,7 +451,7 @@ static int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
- /* Fall through */
- case jr_op:
- /* For R6, JR already emulated in jalr_op */
-- if (NO_R6EMU && insn.r_format.opcode == jr_op)
-+ if (NO_R6EMU && insn.r_format.func == jr_op)
- break;
- *contpc = regs->regs[insn.r_format.rs];
- return 1;
-diff --git a/arch/mips/mm/c-r4k.c b/arch/mips/mm/c-r4k.c
-index 2e03ab1..dca0efc 100644
---- a/arch/mips/mm/c-r4k.c
-+++ b/arch/mips/mm/c-r4k.c
-@@ -37,6 +37,7 @@
- #include <asm/cacheflush.h> /* for run_uncached() */
- #include <asm/traps.h>
- #include <asm/dma-coherence.h>
-+#include <asm/mips-cm.h>
-
- /*
- * Special Variant of smp_call_function for use by cache functions:
-@@ -51,9 +52,16 @@ static inline void r4k_on_each_cpu(void (*func) (void *info), void *info)
- {
- preempt_disable();
-
--#ifndef CONFIG_MIPS_MT_SMP
-- smp_call_function(func, info, 1);
--#endif
-+ /*
-+ * The Coherent Manager propagates address-based cache ops to other
-+ * cores but not index-based ops. However, r4k_on_each_cpu is used
-+ * in both cases so there is no easy way to tell what kind of op is
-+ * executed to the other cores. The best we can probably do is
-+ * to restrict that call when a CM is not present because both
-+ * CM-based SMP protocols (CMP & CPS) restrict index-based cache ops.
-+ */
-+ if (!mips_cm_present())
-+ smp_call_function_many(&cpu_foreign_map, func, info, 1);
- func(info);
- preempt_enable();
- }
-diff --git a/arch/parisc/include/asm/pgalloc.h b/arch/parisc/include/asm/pgalloc.h
-index 3a08eae..3edbb9f 100644
---- a/arch/parisc/include/asm/pgalloc.h
-+++ b/arch/parisc/include/asm/pgalloc.h
-@@ -72,7 +72,7 @@ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
-
- static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
- {
-- if(pmd_flag(*pmd) & PxD_FLAG_ATTACHED)
-+ if (pmd_flag(*pmd) & PxD_FLAG_ATTACHED) {
- /*
- * This is the permanent pmd attached to the pgd;
- * cannot free it.
-@@ -81,6 +81,7 @@ static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
- */
- mm_inc_nr_pmds(mm);
- return;
-+ }
- free_pages((unsigned long)pmd, PMD_ORDER);
- }
-
-diff --git a/arch/parisc/include/asm/pgtable.h b/arch/parisc/include/asm/pgtable.h
-index 0a18375..f93c4a4 100644
---- a/arch/parisc/include/asm/pgtable.h
-+++ b/arch/parisc/include/asm/pgtable.h
-@@ -16,7 +16,7 @@
- #include <asm/processor.h>
- #include <asm/cache.h>
-
--extern spinlock_t pa_dbit_lock;
-+extern spinlock_t pa_tlb_lock;
-
- /*
- * kern_addr_valid(ADDR) tests if ADDR is pointing to valid kernel
-@@ -33,6 +33,19 @@ extern spinlock_t pa_dbit_lock;
- */
- #define kern_addr_valid(addr) (1)
-
-+/* Purge data and instruction TLB entries. Must be called holding
-+ * the pa_tlb_lock. The TLB purge instructions are slow on SMP
-+ * machines since the purge must be broadcast to all CPUs.
-+ */
-+
-+static inline void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
-+{
-+ mtsp(mm->context, 1);
-+ pdtlb(addr);
-+ if (unlikely(split_tlb))
-+ pitlb(addr);
-+}
-+
- /* Certain architectures need to do special things when PTEs
- * within a page table are directly modified. Thus, the following
- * hook is made available.
-@@ -42,15 +55,20 @@ extern spinlock_t pa_dbit_lock;
- *(pteptr) = (pteval); \
- } while(0)
-
--extern void purge_tlb_entries(struct mm_struct *, unsigned long);
-+#define pte_inserted(x) \
-+ ((pte_val(x) & (_PAGE_PRESENT|_PAGE_ACCESSED)) \
-+ == (_PAGE_PRESENT|_PAGE_ACCESSED))
-
--#define set_pte_at(mm, addr, ptep, pteval) \
-- do { \
-+#define set_pte_at(mm, addr, ptep, pteval) \
-+ do { \
-+ pte_t old_pte; \
- unsigned long flags; \
-- spin_lock_irqsave(&pa_dbit_lock, flags); \
-- set_pte(ptep, pteval); \
-- purge_tlb_entries(mm, addr); \
-- spin_unlock_irqrestore(&pa_dbit_lock, flags); \
-+ spin_lock_irqsave(&pa_tlb_lock, flags); \
-+ old_pte = *ptep; \
-+ set_pte(ptep, pteval); \
-+ if (pte_inserted(old_pte)) \
-+ purge_tlb_entries(mm, addr); \
-+ spin_unlock_irqrestore(&pa_tlb_lock, flags); \
- } while (0)
-
- #endif /* !__ASSEMBLY__ */
-@@ -268,7 +286,7 @@ extern unsigned long *empty_zero_page;
-
- #define pte_none(x) (pte_val(x) == 0)
- #define pte_present(x) (pte_val(x) & _PAGE_PRESENT)
--#define pte_clear(mm,addr,xp) do { pte_val(*(xp)) = 0; } while (0)
-+#define pte_clear(mm, addr, xp) set_pte_at(mm, addr, xp, __pte(0))
-
- #define pmd_flag(x) (pmd_val(x) & PxD_FLAG_MASK)
- #define pmd_address(x) ((unsigned long)(pmd_val(x) &~ PxD_FLAG_MASK) << PxD_VALUE_SHIFT)
-@@ -435,15 +453,15 @@ static inline int ptep_test_and_clear_young(struct vm_area_struct *vma, unsigned
- if (!pte_young(*ptep))
- return 0;
-
-- spin_lock_irqsave(&pa_dbit_lock, flags);
-+ spin_lock_irqsave(&pa_tlb_lock, flags);
- pte = *ptep;
- if (!pte_young(pte)) {
-- spin_unlock_irqrestore(&pa_dbit_lock, flags);
-+ spin_unlock_irqrestore(&pa_tlb_lock, flags);
- return 0;
- }
- set_pte(ptep, pte_mkold(pte));
- purge_tlb_entries(vma->vm_mm, addr);
-- spin_unlock_irqrestore(&pa_dbit_lock, flags);
-+ spin_unlock_irqrestore(&pa_tlb_lock, flags);
- return 1;
- }
-
-@@ -453,11 +471,12 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
- pte_t old_pte;
- unsigned long flags;
-
-- spin_lock_irqsave(&pa_dbit_lock, flags);
-+ spin_lock_irqsave(&pa_tlb_lock, flags);
- old_pte = *ptep;
-- pte_clear(mm,addr,ptep);
-- purge_tlb_entries(mm, addr);
-- spin_unlock_irqrestore(&pa_dbit_lock, flags);
-+ set_pte(ptep, __pte(0));
-+ if (pte_inserted(old_pte))
-+ purge_tlb_entries(mm, addr);
-+ spin_unlock_irqrestore(&pa_tlb_lock, flags);
-
- return old_pte;
- }
-@@ -465,10 +484,10 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
- static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
- {
- unsigned long flags;
-- spin_lock_irqsave(&pa_dbit_lock, flags);
-+ spin_lock_irqsave(&pa_tlb_lock, flags);
- set_pte(ptep, pte_wrprotect(*ptep));
- purge_tlb_entries(mm, addr);
-- spin_unlock_irqrestore(&pa_dbit_lock, flags);
-+ spin_unlock_irqrestore(&pa_tlb_lock, flags);
- }
-
- #define pte_same(A,B) (pte_val(A) == pte_val(B))
-diff --git a/arch/parisc/include/asm/tlbflush.h b/arch/parisc/include/asm/tlbflush.h
-index 9d086a5..e84b964 100644
---- a/arch/parisc/include/asm/tlbflush.h
-+++ b/arch/parisc/include/asm/tlbflush.h
-@@ -13,6 +13,9 @@
- * active at any one time on the Merced bus. This tlb purge
- * synchronisation is fairly lightweight and harmless so we activate
- * it on all systems not just the N class.
-+
-+ * It is also used to ensure PTE updates are atomic and consistent
-+ * with the TLB.
- */
- extern spinlock_t pa_tlb_lock;
-
-@@ -24,20 +27,24 @@ extern void flush_tlb_all_local(void *);
-
- #define smp_flush_tlb_all() flush_tlb_all()
-
-+int __flush_tlb_range(unsigned long sid,
-+ unsigned long start, unsigned long end);
-+
-+#define flush_tlb_range(vma, start, end) \
-+ __flush_tlb_range((vma)->vm_mm->context, start, end)
-+
-+#define flush_tlb_kernel_range(start, end) \
-+ __flush_tlb_range(0, start, end)
-+
- /*
- * flush_tlb_mm()
- *
-- * XXX This code is NOT valid for HP-UX compatibility processes,
-- * (although it will probably work 99% of the time). HP-UX
-- * processes are free to play with the space id's and save them
-- * over long periods of time, etc. so we have to preserve the
-- * space and just flush the entire tlb. We need to check the
-- * personality in order to do that, but the personality is not
-- * currently being set correctly.
-- *
-- * Of course, Linux processes could do the same thing, but
-- * we don't support that (and the compilers, dynamic linker,
-- * etc. do not do that).
-+ * The code to switch to a new context is NOT valid for processes
-+ * which play with the space id's. Thus, we have to preserve the
-+ * space and just flush the entire tlb. However, the compilers,
-+ * dynamic linker, etc, do not manipulate space id's, so there
-+ * could be a significant performance benefit in switching contexts
-+ * and not flushing the whole tlb.
- */
-
- static inline void flush_tlb_mm(struct mm_struct *mm)
-@@ -45,10 +52,18 @@ static inline void flush_tlb_mm(struct mm_struct *mm)
- BUG_ON(mm == &init_mm); /* Should never happen */
-
- #if 1 || defined(CONFIG_SMP)
-+ /* Except for very small threads, flushing the whole TLB is
-+ * faster than using __flush_tlb_range. The pdtlb and pitlb
-+ * instructions are very slow because of the TLB broadcast.
-+ * It might be faster to do local range flushes on all CPUs
-+ * on PA 2.0 systems.
-+ */
- flush_tlb_all();
- #else
- /* FIXME: currently broken, causing space id and protection ids
-- * to go out of sync, resulting in faults on userspace accesses.
-+ * to go out of sync, resulting in faults on userspace accesses.
-+ * This approach needs further investigation since running many
-+ * small applications (e.g., GCC testsuite) is faster on HP-UX.
- */
- if (mm) {
- if (mm->context != 0)
-@@ -65,22 +80,12 @@ static inline void flush_tlb_page(struct vm_area_struct *vma,
- {
- unsigned long flags, sid;
-
-- /* For one page, it's not worth testing the split_tlb variable */
--
-- mb();
- sid = vma->vm_mm->context;
- purge_tlb_start(flags);
- mtsp(sid, 1);
- pdtlb(addr);
-- pitlb(addr);
-+ if (unlikely(split_tlb))
-+ pitlb(addr);
- purge_tlb_end(flags);
- }
--
--void __flush_tlb_range(unsigned long sid,
-- unsigned long start, unsigned long end);
--
--#define flush_tlb_range(vma,start,end) __flush_tlb_range((vma)->vm_mm->context,start,end)
--
--#define flush_tlb_kernel_range(start, end) __flush_tlb_range(0,start,end)
--
- #endif
-diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c
-index f6448c7..cda6dbb 100644
---- a/arch/parisc/kernel/cache.c
-+++ b/arch/parisc/kernel/cache.c
-@@ -342,12 +342,15 @@ EXPORT_SYMBOL(flush_data_cache_local);
- EXPORT_SYMBOL(flush_kernel_icache_range_asm);
-
- #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */
--int parisc_cache_flush_threshold __read_mostly = FLUSH_THRESHOLD;
-+static unsigned long parisc_cache_flush_threshold __read_mostly = FLUSH_THRESHOLD;
-+
-+#define FLUSH_TLB_THRESHOLD (2*1024*1024) /* 2MB initial TLB threshold */
-+static unsigned long parisc_tlb_flush_threshold __read_mostly = FLUSH_TLB_THRESHOLD;
-
- void __init parisc_setup_cache_timing(void)
- {
- unsigned long rangetime, alltime;
-- unsigned long size;
-+ unsigned long size, start;
-
- alltime = mfctl(16);
- flush_data_cache();
-@@ -364,14 +367,43 @@ void __init parisc_setup_cache_timing(void)
- /* Racy, but if we see an intermediate value, it's ok too... */
- parisc_cache_flush_threshold = size * alltime / rangetime;
-
-- parisc_cache_flush_threshold = (parisc_cache_flush_threshold + L1_CACHE_BYTES - 1) &~ (L1_CACHE_BYTES - 1);
-+ parisc_cache_flush_threshold = L1_CACHE_ALIGN(parisc_cache_flush_threshold);
- if (!parisc_cache_flush_threshold)
- parisc_cache_flush_threshold = FLUSH_THRESHOLD;
-
- if (parisc_cache_flush_threshold > cache_info.dc_size)
- parisc_cache_flush_threshold = cache_info.dc_size;
-
-- printk(KERN_INFO "Setting cache flush threshold to %x (%d CPUs online)\n", parisc_cache_flush_threshold, num_online_cpus());
-+ printk(KERN_INFO "Setting cache flush threshold to %lu kB\n",
-+ parisc_cache_flush_threshold/1024);
-+
-+ /* calculate TLB flush threshold */
-+
-+ alltime = mfctl(16);
-+ flush_tlb_all();
-+ alltime = mfctl(16) - alltime;
-+
-+ size = PAGE_SIZE;
-+ start = (unsigned long) _text;
-+ rangetime = mfctl(16);
-+ while (start < (unsigned long) _end) {
-+ flush_tlb_kernel_range(start, start + PAGE_SIZE);
-+ start += PAGE_SIZE;
-+ size += PAGE_SIZE;
-+ }
-+ rangetime = mfctl(16) - rangetime;
-+
-+ printk(KERN_DEBUG "Whole TLB flush %lu cycles, flushing %lu bytes %lu cycles\n",
-+ alltime, size, rangetime);
-+
-+ parisc_tlb_flush_threshold = size * alltime / rangetime;
-+ parisc_tlb_flush_threshold *= num_online_cpus();
-+ parisc_tlb_flush_threshold = PAGE_ALIGN(parisc_tlb_flush_threshold);
-+ if (!parisc_tlb_flush_threshold)
-+ parisc_tlb_flush_threshold = FLUSH_TLB_THRESHOLD;
-+
-+ printk(KERN_INFO "Setting TLB flush threshold to %lu kB\n",
-+ parisc_tlb_flush_threshold/1024);
- }
-
- extern void purge_kernel_dcache_page_asm(unsigned long);
-@@ -403,48 +435,45 @@ void copy_user_page(void *vto, void *vfrom, unsigned long vaddr,
- }
- EXPORT_SYMBOL(copy_user_page);
-
--void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
--{
-- unsigned long flags;
--
-- /* Note: purge_tlb_entries can be called at startup with
-- no context. */
--
-- purge_tlb_start(flags);
-- mtsp(mm->context, 1);
-- pdtlb(addr);
-- pitlb(addr);
-- purge_tlb_end(flags);
--}
--EXPORT_SYMBOL(purge_tlb_entries);
--
--void __flush_tlb_range(unsigned long sid, unsigned long start,
-- unsigned long end)
-+/* __flush_tlb_range()
-+ *
-+ * returns 1 if all TLBs were flushed.
-+ */
-+int __flush_tlb_range(unsigned long sid, unsigned long start,
-+ unsigned long end)
- {
-- unsigned long npages;
-+ unsigned long flags, size;
-
-- npages = ((end - (start & PAGE_MASK)) + (PAGE_SIZE - 1)) >> PAGE_SHIFT;
-- if (npages >= 512) /* 2MB of space: arbitrary, should be tuned */
-+ size = (end - start);
-+ if (size >= parisc_tlb_flush_threshold) {
- flush_tlb_all();
-- else {
-- unsigned long flags;
-+ return 1;
-+ }
-
-+ /* Purge TLB entries for small ranges using the pdtlb and
-+ pitlb instructions. These instructions execute locally
-+ but cause a purge request to be broadcast to other TLBs. */
-+ if (likely(!split_tlb)) {
-+ while (start < end) {
-+ purge_tlb_start(flags);
-+ mtsp(sid, 1);
-+ pdtlb(start);
-+ purge_tlb_end(flags);
-+ start += PAGE_SIZE;
-+ }
-+ return 0;
-+ }
-+
-+ /* split TLB case */
-+ while (start < end) {
- purge_tlb_start(flags);
- mtsp(sid, 1);
-- if (split_tlb) {
-- while (npages--) {
-- pdtlb(start);
-- pitlb(start);
-- start += PAGE_SIZE;
-- }
-- } else {
-- while (npages--) {
-- pdtlb(start);
-- start += PAGE_SIZE;
-- }
-- }
-+ pdtlb(start);
-+ pitlb(start);
- purge_tlb_end(flags);
-+ start += PAGE_SIZE;
- }
-+ return 0;
- }
-
- static void cacheflush_h_tmp_function(void *dummy)
-diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S
-index 7581961..c5ef408 100644
---- a/arch/parisc/kernel/entry.S
-+++ b/arch/parisc/kernel/entry.S
-@@ -45,7 +45,7 @@
- .level 2.0
- #endif
-
-- .import pa_dbit_lock,data
-+ .import pa_tlb_lock,data
-
- /* space_to_prot macro creates a prot id from a space id */
-
-@@ -420,8 +420,8 @@
- SHLREG %r9,PxD_VALUE_SHIFT,\pmd
- extru \va,31-PAGE_SHIFT,ASM_BITS_PER_PTE,\index
- dep %r0,31,PAGE_SHIFT,\pmd /* clear offset */
-- shladd \index,BITS_PER_PTE_ENTRY,\pmd,\pmd
-- LDREG %r0(\pmd),\pte /* pmd is now pte */
-+ shladd \index,BITS_PER_PTE_ENTRY,\pmd,\pmd /* pmd is now pte */
-+ LDREG %r0(\pmd),\pte
- bb,>=,n \pte,_PAGE_PRESENT_BIT,\fault
- .endm
-
-@@ -453,57 +453,53 @@
- L2_ptep \pgd,\pte,\index,\va,\fault
- .endm
-
-- /* Acquire pa_dbit_lock lock. */
-- .macro dbit_lock spc,tmp,tmp1
-+ /* Acquire pa_tlb_lock lock and recheck page is still present. */
-+ .macro tlb_lock spc,ptp,pte,tmp,tmp1,fault
- #ifdef CONFIG_SMP
- cmpib,COND(=),n 0,\spc,2f
-- load32 PA(pa_dbit_lock),\tmp
-+ load32 PA(pa_tlb_lock),\tmp
- 1: LDCW 0(\tmp),\tmp1
- cmpib,COND(=) 0,\tmp1,1b
- nop
-+ LDREG 0(\ptp),\pte
-+ bb,<,n \pte,_PAGE_PRESENT_BIT,2f
-+ b \fault
-+ stw \spc,0(\tmp)
- 2:
- #endif
- .endm
-
-- /* Release pa_dbit_lock lock without reloading lock address. */
-- .macro dbit_unlock0 spc,tmp
-+ /* Release pa_tlb_lock lock without reloading lock address. */
-+ .macro tlb_unlock0 spc,tmp
- #ifdef CONFIG_SMP
- or,COND(=) %r0,\spc,%r0
- stw \spc,0(\tmp)
- #endif
- .endm
-
-- /* Release pa_dbit_lock lock. */
-- .macro dbit_unlock1 spc,tmp
-+ /* Release pa_tlb_lock lock. */
-+ .macro tlb_unlock1 spc,tmp
- #ifdef CONFIG_SMP
-- load32 PA(pa_dbit_lock),\tmp
-- dbit_unlock0 \spc,\tmp
-+ load32 PA(pa_tlb_lock),\tmp
-+ tlb_unlock0 \spc,\tmp
- #endif
- .endm
-
- /* Set the _PAGE_ACCESSED bit of the PTE. Be clever and
- * don't needlessly dirty the cache line if it was already set */
-- .macro update_ptep spc,ptep,pte,tmp,tmp1
--#ifdef CONFIG_SMP
-- or,COND(=) %r0,\spc,%r0
-- LDREG 0(\ptep),\pte
--#endif
-+ .macro update_accessed ptp,pte,tmp,tmp1
- ldi _PAGE_ACCESSED,\tmp1
- or \tmp1,\pte,\tmp
- and,COND(<>) \tmp1,\pte,%r0
-- STREG \tmp,0(\ptep)
-+ STREG \tmp,0(\ptp)
- .endm
-
- /* Set the dirty bit (and accessed bit). No need to be
- * clever, this is only used from the dirty fault */
-- .macro update_dirty spc,ptep,pte,tmp
--#ifdef CONFIG_SMP
-- or,COND(=) %r0,\spc,%r0
-- LDREG 0(\ptep),\pte
--#endif
-+ .macro update_dirty ptp,pte,tmp
- ldi _PAGE_ACCESSED|_PAGE_DIRTY,\tmp
- or \tmp,\pte,\pte
-- STREG \pte,0(\ptep)
-+ STREG \pte,0(\ptp)
- .endm
-
- /* bitshift difference between a PFN (based on kernel's PAGE_SIZE)
-@@ -1148,14 +1144,14 @@ dtlb_miss_20w:
-
- L3_ptep ptp,pte,t0,va,dtlb_check_alias_20w
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,dtlb_check_alias_20w
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb spc,pte,prot
-
- idtlbt pte,prot
-- dbit_unlock1 spc,t0
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1174,14 +1170,14 @@ nadtlb_miss_20w:
-
- L3_ptep ptp,pte,t0,va,nadtlb_check_alias_20w
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,nadtlb_check_alias_20w
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb spc,pte,prot
-
- idtlbt pte,prot
-- dbit_unlock1 spc,t0
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1202,20 +1198,20 @@ dtlb_miss_11:
-
- L2_ptep ptp,pte,t0,va,dtlb_check_alias_11
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,dtlb_check_alias_11
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb_11 spc,pte,prot
-
-- mfsp %sr1,t0 /* Save sr1 so we can use it in tlb inserts */
-+ mfsp %sr1,t1 /* Save sr1 so we can use it in tlb inserts */
- mtsp spc,%sr1
-
- idtlba pte,(%sr1,va)
- idtlbp prot,(%sr1,va)
-
-- mtsp t0, %sr1 /* Restore sr1 */
-- dbit_unlock1 spc,t0
-+ mtsp t1, %sr1 /* Restore sr1 */
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1235,21 +1231,20 @@ nadtlb_miss_11:
-
- L2_ptep ptp,pte,t0,va,nadtlb_check_alias_11
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,nadtlb_check_alias_11
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb_11 spc,pte,prot
-
--
-- mfsp %sr1,t0 /* Save sr1 so we can use it in tlb inserts */
-+ mfsp %sr1,t1 /* Save sr1 so we can use it in tlb inserts */
- mtsp spc,%sr1
-
- idtlba pte,(%sr1,va)
- idtlbp prot,(%sr1,va)
-
-- mtsp t0, %sr1 /* Restore sr1 */
-- dbit_unlock1 spc,t0
-+ mtsp t1, %sr1 /* Restore sr1 */
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1269,16 +1264,16 @@ dtlb_miss_20:
-
- L2_ptep ptp,pte,t0,va,dtlb_check_alias_20
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,dtlb_check_alias_20
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb spc,pte,prot
-
-- f_extend pte,t0
-+ f_extend pte,t1
-
- idtlbt pte,prot
-- dbit_unlock1 spc,t0
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1297,16 +1292,16 @@ nadtlb_miss_20:
-
- L2_ptep ptp,pte,t0,va,nadtlb_check_alias_20
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,nadtlb_check_alias_20
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb spc,pte,prot
-
-- f_extend pte,t0
-+ f_extend pte,t1
-
-- idtlbt pte,prot
-- dbit_unlock1 spc,t0
-+ idtlbt pte,prot
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1406,14 +1401,14 @@ itlb_miss_20w:
-
- L3_ptep ptp,pte,t0,va,itlb_fault
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,itlb_fault
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb spc,pte,prot
-
- iitlbt pte,prot
-- dbit_unlock1 spc,t0
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1430,14 +1425,14 @@ naitlb_miss_20w:
-
- L3_ptep ptp,pte,t0,va,naitlb_check_alias_20w
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,naitlb_check_alias_20w
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb spc,pte,prot
-
- iitlbt pte,prot
-- dbit_unlock1 spc,t0
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1458,20 +1453,20 @@ itlb_miss_11:
-
- L2_ptep ptp,pte,t0,va,itlb_fault
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,itlb_fault
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb_11 spc,pte,prot
-
-- mfsp %sr1,t0 /* Save sr1 so we can use it in tlb inserts */
-+ mfsp %sr1,t1 /* Save sr1 so we can use it in tlb inserts */
- mtsp spc,%sr1
-
- iitlba pte,(%sr1,va)
- iitlbp prot,(%sr1,va)
-
-- mtsp t0, %sr1 /* Restore sr1 */
-- dbit_unlock1 spc,t0
-+ mtsp t1, %sr1 /* Restore sr1 */
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1482,20 +1477,20 @@ naitlb_miss_11:
-
- L2_ptep ptp,pte,t0,va,naitlb_check_alias_11
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,naitlb_check_alias_11
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb_11 spc,pte,prot
-
-- mfsp %sr1,t0 /* Save sr1 so we can use it in tlb inserts */
-+ mfsp %sr1,t1 /* Save sr1 so we can use it in tlb inserts */
- mtsp spc,%sr1
-
- iitlba pte,(%sr1,va)
- iitlbp prot,(%sr1,va)
-
-- mtsp t0, %sr1 /* Restore sr1 */
-- dbit_unlock1 spc,t0
-+ mtsp t1, %sr1 /* Restore sr1 */
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1516,16 +1511,16 @@ itlb_miss_20:
-
- L2_ptep ptp,pte,t0,va,itlb_fault
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,itlb_fault
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb spc,pte,prot
-
-- f_extend pte,t0
-+ f_extend pte,t1
-
- iitlbt pte,prot
-- dbit_unlock1 spc,t0
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1536,16 +1531,16 @@ naitlb_miss_20:
-
- L2_ptep ptp,pte,t0,va,naitlb_check_alias_20
-
-- dbit_lock spc,t0,t1
-- update_ptep spc,ptp,pte,t0,t1
-+ tlb_lock spc,ptp,pte,t0,t1,naitlb_check_alias_20
-+ update_accessed ptp,pte,t0,t1
-
- make_insert_tlb spc,pte,prot
-
-- f_extend pte,t0
-+ f_extend pte,t1
-
- iitlbt pte,prot
-- dbit_unlock1 spc,t0
-
-+ tlb_unlock1 spc,t0
- rfir
- nop
-
-@@ -1568,14 +1563,14 @@ dbit_trap_20w:
-
- L3_ptep ptp,pte,t0,va,dbit_fault
-
-- dbit_lock spc,t0,t1
-- update_dirty spc,ptp,pte,t1
-+ tlb_lock spc,ptp,pte,t0,t1,dbit_fault
-+ update_dirty ptp,pte,t1
-
- make_insert_tlb spc,pte,prot
-
- idtlbt pte,prot
-- dbit_unlock0 spc,t0
-
-+ tlb_unlock0 spc,t0
- rfir
- nop
- #else
-@@ -1588,8 +1583,8 @@ dbit_trap_11:
-
- L2_ptep ptp,pte,t0,va,dbit_fault
-
-- dbit_lock spc,t0,t1
-- update_dirty spc,ptp,pte,t1
-+ tlb_lock spc,ptp,pte,t0,t1,dbit_fault
-+ update_dirty ptp,pte,t1
-
- make_insert_tlb_11 spc,pte,prot
-
-@@ -1600,8 +1595,8 @@ dbit_trap_11:
- idtlbp prot,(%sr1,va)
-
- mtsp t1, %sr1 /* Restore sr1 */
-- dbit_unlock0 spc,t0
-
-+ tlb_unlock0 spc,t0
- rfir
- nop
-
-@@ -1612,16 +1607,16 @@ dbit_trap_20:
-
- L2_ptep ptp,pte,t0,va,dbit_fault
-
-- dbit_lock spc,t0,t1
-- update_dirty spc,ptp,pte,t1
-+ tlb_lock spc,ptp,pte,t0,t1,dbit_fault
-+ update_dirty ptp,pte,t1
-
- make_insert_tlb spc,pte,prot
-
- f_extend pte,t1
-
-- idtlbt pte,prot
-- dbit_unlock0 spc,t0
-+ idtlbt pte,prot
-
-+ tlb_unlock0 spc,t0
- rfir
- nop
- #endif
-diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c
-index 47ee620..7f67c4c 100644
---- a/arch/parisc/kernel/traps.c
-+++ b/arch/parisc/kernel/traps.c
-@@ -43,10 +43,6 @@
-
- #include "../math-emu/math-emu.h" /* for handle_fpe() */
-
--#if defined(CONFIG_SMP) || defined(CONFIG_DEBUG_SPINLOCK)
--DEFINE_SPINLOCK(pa_dbit_lock);
--#endif
--
- static void parisc_show_stack(struct task_struct *task, unsigned long *sp,
- struct pt_regs *regs);
-
-diff --git a/arch/powerpc/kernel/idle_power7.S b/arch/powerpc/kernel/idle_power7.S
-index ccde8f0..112ccf4 100644
---- a/arch/powerpc/kernel/idle_power7.S
-+++ b/arch/powerpc/kernel/idle_power7.S
-@@ -52,6 +52,22 @@
- .text
-
- /*
-+ * Used by threads when the lock bit of core_idle_state is set.
-+ * Threads will spin in HMT_LOW until the lock bit is cleared.
-+ * r14 - pointer to core_idle_state
-+ * r15 - used to load contents of core_idle_state
-+ */
-+
-+core_idle_lock_held:
-+ HMT_LOW
-+3: lwz r15,0(r14)
-+ andi. r15,r15,PNV_CORE_IDLE_LOCK_BIT
-+ bne 3b
-+ HMT_MEDIUM
-+ lwarx r15,0,r14
-+ blr
-+
-+/*
- * Pass requested state in r3:
- * r3 - PNV_THREAD_NAP/SLEEP/WINKLE
- *
-@@ -150,6 +166,10 @@ power7_enter_nap_mode:
- ld r14,PACA_CORE_IDLE_STATE_PTR(r13)
- lwarx_loop1:
- lwarx r15,0,r14
-+
-+ andi. r9,r15,PNV_CORE_IDLE_LOCK_BIT
-+ bnel core_idle_lock_held
-+
- andc r15,r15,r7 /* Clear thread bit */
-
- andi. r15,r15,PNV_CORE_IDLE_THREAD_BITS
-@@ -294,7 +314,7 @@ lwarx_loop2:
- * workaround undo code or resyncing timebase or restoring context
- * In either case loop until the lock bit is cleared.
- */
-- bne core_idle_lock_held
-+ bnel core_idle_lock_held
-
- cmpwi cr2,r15,0
- lbz r4,PACA_SUBCORE_SIBLING_MASK(r13)
-@@ -319,15 +339,6 @@ lwarx_loop2:
- isync
- b common_exit
-
--core_idle_lock_held:
-- HMT_LOW
--core_idle_lock_loop:
-- lwz r15,0(14)
-- andi. r9,r15,PNV_CORE_IDLE_LOCK_BIT
-- bne core_idle_lock_loop
-- HMT_MEDIUM
-- b lwarx_loop2
--
- first_thread_in_subcore:
- /* First thread in subcore to wakeup */
- ori r15,r15,PNV_CORE_IDLE_LOCK_BIT
-diff --git a/arch/s390/include/asm/ctl_reg.h b/arch/s390/include/asm/ctl_reg.h
-index cfad7fca..d7697ab 100644
---- a/arch/s390/include/asm/ctl_reg.h
-+++ b/arch/s390/include/asm/ctl_reg.h
-@@ -57,7 +57,10 @@ union ctlreg0 {
- unsigned long lap : 1; /* Low-address-protection control */
- unsigned long : 4;
- unsigned long edat : 1; /* Enhanced-DAT-enablement control */
-- unsigned long : 23;
-+ unsigned long : 4;
-+ unsigned long afp : 1; /* AFP-register control */
-+ unsigned long vx : 1; /* Vector enablement control */
-+ unsigned long : 17;
- };
- };
-
-diff --git a/arch/s390/kernel/cache.c b/arch/s390/kernel/cache.c
-index bff5e3b..8ba3243 100644
---- a/arch/s390/kernel/cache.c
-+++ b/arch/s390/kernel/cache.c
-@@ -138,6 +138,8 @@ int init_cache_level(unsigned int cpu)
- union cache_topology ct;
- enum cache_type ctype;
-
-+ if (!test_facility(34))
-+ return -EOPNOTSUPP;
- if (!this_cpu_ci)
- return -EINVAL;
- ct.raw = ecag(EXTRACT_TOPOLOGY, 0, 0);
-diff --git a/arch/s390/kernel/nmi.c b/arch/s390/kernel/nmi.c
-index 505c17c..56b5508 100644
---- a/arch/s390/kernel/nmi.c
-+++ b/arch/s390/kernel/nmi.c
-@@ -21,6 +21,7 @@
- #include <asm/nmi.h>
- #include <asm/crw.h>
- #include <asm/switch_to.h>
-+#include <asm/ctl_reg.h>
-
- struct mcck_struct {
- int kill_task;
-@@ -129,26 +130,30 @@ static int notrace s390_revalidate_registers(struct mci *mci)
- } else
- asm volatile("lfpc 0(%0)" : : "a" (fpt_creg_save_area));
-
-- asm volatile(
-- " ld 0,0(%0)\n"
-- " ld 1,8(%0)\n"
-- " ld 2,16(%0)\n"
-- " ld 3,24(%0)\n"
-- " ld 4,32(%0)\n"
-- " ld 5,40(%0)\n"
-- " ld 6,48(%0)\n"
-- " ld 7,56(%0)\n"
-- " ld 8,64(%0)\n"
-- " ld 9,72(%0)\n"
-- " ld 10,80(%0)\n"
-- " ld 11,88(%0)\n"
-- " ld 12,96(%0)\n"
-- " ld 13,104(%0)\n"
-- " ld 14,112(%0)\n"
-- " ld 15,120(%0)\n"
-- : : "a" (fpt_save_area));
-- /* Revalidate vector registers */
-- if (MACHINE_HAS_VX && current->thread.vxrs) {
-+ if (!MACHINE_HAS_VX) {
-+ /* Revalidate floating point registers */
-+ asm volatile(
-+ " ld 0,0(%0)\n"
-+ " ld 1,8(%0)\n"
-+ " ld 2,16(%0)\n"
-+ " ld 3,24(%0)\n"
-+ " ld 4,32(%0)\n"
-+ " ld 5,40(%0)\n"
-+ " ld 6,48(%0)\n"
-+ " ld 7,56(%0)\n"
-+ " ld 8,64(%0)\n"
-+ " ld 9,72(%0)\n"
-+ " ld 10,80(%0)\n"
-+ " ld 11,88(%0)\n"
-+ " ld 12,96(%0)\n"
-+ " ld 13,104(%0)\n"
-+ " ld 14,112(%0)\n"
-+ " ld 15,120(%0)\n"
-+ : : "a" (fpt_save_area));
-+ } else {
-+ /* Revalidate vector registers */
-+ union ctlreg0 cr0;
-+
- if (!mci->vr) {
- /*
- * Vector registers can't be restored and therefore
-@@ -156,8 +161,12 @@ static int notrace s390_revalidate_registers(struct mci *mci)
- */
- kill_task = 1;
- }
-+ cr0.val = S390_lowcore.cregs_save_area[0];
-+ cr0.afp = cr0.vx = 1;
-+ __ctl_load(cr0.val, 0, 0);
- restore_vx_regs((__vector128 *)
-- S390_lowcore.vector_save_area_addr);
-+ &S390_lowcore.vector_save_area);
-+ __ctl_load(S390_lowcore.cregs_save_area[0], 0, 0);
- }
- /* Revalidate access registers */
- asm volatile(
-diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
-index dc5edc2..8f587d8 100644
---- a/arch/s390/kernel/process.c
-+++ b/arch/s390/kernel/process.c
-@@ -163,7 +163,7 @@ int copy_thread(unsigned long clone_flags, unsigned long new_stackp,
- asmlinkage void execve_tail(void)
- {
- current->thread.fp_regs.fpc = 0;
-- asm volatile("sfpc %0,%0" : : "d" (0));
-+ asm volatile("sfpc %0" : : "d" (0));
- }
-
- /*
-diff --git a/arch/s390/kernel/sclp.S b/arch/s390/kernel/sclp.S
-index 43c3169..ada0c07 100644
---- a/arch/s390/kernel/sclp.S
-+++ b/arch/s390/kernel/sclp.S
-@@ -270,6 +270,8 @@ ENTRY(_sclp_print_early)
- jno .Lesa2
- ahi %r15,-80
- stmh %r6,%r15,96(%r15) # store upper register halves
-+ basr %r13,0
-+ lmh %r0,%r15,.Lzeroes-.(%r13) # clear upper register halves
- .Lesa2:
- lr %r10,%r2 # save string pointer
- lhi %r2,0
-@@ -291,6 +293,8 @@ ENTRY(_sclp_print_early)
- .Lesa3:
- lm %r6,%r15,120(%r15) # restore registers
- br %r14
-+.Lzeroes:
-+ .fill 64,4,0
-
- .LwritedataS4:
- .long 0x00760005 # SCLP command for write data
-diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c
-index 9afb9d6..dc2d7aa 100644
---- a/arch/s390/net/bpf_jit_comp.c
-+++ b/arch/s390/net/bpf_jit_comp.c
-@@ -415,13 +415,13 @@ static void bpf_jit_prologue(struct bpf_jit *jit)
- EMIT6_DISP_LH(0xe3000000, 0x0004, REG_SKB_DATA, REG_0,
- BPF_REG_1, offsetof(struct sk_buff, data));
- }
-- /* BPF compatibility: clear A (%b7) and X (%b8) registers */
-- if (REG_SEEN(BPF_REG_7))
-- /* lghi %b7,0 */
-- EMIT4_IMM(0xa7090000, BPF_REG_7, 0);
-- if (REG_SEEN(BPF_REG_8))
-- /* lghi %b8,0 */
-- EMIT4_IMM(0xa7090000, BPF_REG_8, 0);
-+ /* BPF compatibility: clear A (%b0) and X (%b7) registers */
-+ if (REG_SEEN(BPF_REG_A))
-+ /* lghi %ba,0 */
-+ EMIT4_IMM(0xa7090000, BPF_REG_A, 0);
-+ if (REG_SEEN(BPF_REG_X))
-+ /* lghi %bx,0 */
-+ EMIT4_IMM(0xa7090000, BPF_REG_X, 0);
- }
-
- /*
-diff --git a/arch/tile/kernel/setup.c b/arch/tile/kernel/setup.c
-index d366675..396b5c9 100644
---- a/arch/tile/kernel/setup.c
-+++ b/arch/tile/kernel/setup.c
-@@ -1139,7 +1139,7 @@ static void __init load_hv_initrd(void)
-
- void __init free_initrd_mem(unsigned long begin, unsigned long end)
- {
-- free_bootmem(__pa(begin), end - begin);
-+ free_bootmem_late(__pa(begin), end - begin);
- }
-
- static int __init setup_initrd(char *str)
-diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
-index 48304b8..0cdc154 100644
---- a/arch/x86/boot/compressed/eboot.c
-+++ b/arch/x86/boot/compressed/eboot.c
-@@ -1193,6 +1193,10 @@ static efi_status_t setup_e820(struct boot_params *params,
- unsigned int e820_type = 0;
- unsigned long m = efi->efi_memmap;
-
-+#ifdef CONFIG_X86_64
-+ m |= (u64)efi->efi_memmap_hi << 32;
-+#endif
-+
- d = (efi_memory_desc_t *)(m + (i * efi->efi_memdesc_size));
- switch (d->type) {
- case EFI_RESERVED_TYPE:
-diff --git a/arch/x86/include/asm/kasan.h b/arch/x86/include/asm/kasan.h
-index 8b22422..74a2a8d 100644
---- a/arch/x86/include/asm/kasan.h
-+++ b/arch/x86/include/asm/kasan.h
-@@ -14,15 +14,11 @@
-
- #ifndef __ASSEMBLY__
-
--extern pte_t kasan_zero_pte[];
--extern pte_t kasan_zero_pmd[];
--extern pte_t kasan_zero_pud[];
--
- #ifdef CONFIG_KASAN
--void __init kasan_map_early_shadow(pgd_t *pgd);
-+void __init kasan_early_init(void);
- void __init kasan_init(void);
- #else
--static inline void kasan_map_early_shadow(pgd_t *pgd) { }
-+static inline void kasan_early_init(void) { }
- static inline void kasan_init(void) { }
- #endif
-
-diff --git a/arch/x86/include/asm/mmu_context.h b/arch/x86/include/asm/mmu_context.h
-index 883f6b9..e997f70 100644
---- a/arch/x86/include/asm/mmu_context.h
-+++ b/arch/x86/include/asm/mmu_context.h
-@@ -23,7 +23,7 @@ extern struct static_key rdpmc_always_available;
-
- static inline void load_mm_cr4(struct mm_struct *mm)
- {
-- if (static_key_true(&rdpmc_always_available) ||
-+ if (static_key_false(&rdpmc_always_available) ||
- atomic_read(&mm->context.perf_rdpmc_allowed))
- cr4_set_bits(X86_CR4_PCE);
- else
-diff --git a/arch/x86/kernel/cpu/perf_event_intel_cqm.c b/arch/x86/kernel/cpu/perf_event_intel_cqm.c
-index e4d1b8b..cb77b11 100644
---- a/arch/x86/kernel/cpu/perf_event_intel_cqm.c
-+++ b/arch/x86/kernel/cpu/perf_event_intel_cqm.c
-@@ -934,6 +934,14 @@ static u64 intel_cqm_event_count(struct perf_event *event)
- return 0;
-
- /*
-+ * Getting up-to-date values requires an SMP IPI which is not
-+ * possible if we're being called in interrupt context. Return
-+ * the cached values instead.
-+ */
-+ if (unlikely(in_interrupt()))
-+ goto out;
-+
-+ /*
- * Notice that we don't perform the reading of an RMID
- * atomically, because we can't hold a spin lock across the
- * IPIs.
-diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
-index 5a46681..f129a9a 100644
---- a/arch/x86/kernel/head64.c
-+++ b/arch/x86/kernel/head64.c
-@@ -161,11 +161,12 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
- /* Kill off the identity-map trampoline */
- reset_early_page_tables();
-
-- kasan_map_early_shadow(early_level4_pgt);
--
-- /* clear bss before set_intr_gate with early_idt_handler */
- clear_bss();
-
-+ clear_page(init_level4_pgt);
-+
-+ kasan_early_init();
-+
- for (i = 0; i < NUM_EXCEPTION_VECTORS; i++)
- set_intr_gate(i, early_idt_handler_array[i]);
- load_idt((const struct desc_ptr *)&idt_descr);
-@@ -177,12 +178,9 @@ asmlinkage __visible void __init x86_64_start_kernel(char * real_mode_data)
- */
- load_ucode_bsp();
-
-- clear_page(init_level4_pgt);
- /* set init_level4_pgt kernel high mapping*/
- init_level4_pgt[511] = early_level4_pgt[511];
-
-- kasan_map_early_shadow(init_level4_pgt);
--
- x86_64_start_reservations(real_mode_data);
- }
-
-diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
-index df7e780..7e5da2c 100644
---- a/arch/x86/kernel/head_64.S
-+++ b/arch/x86/kernel/head_64.S
-@@ -516,38 +516,9 @@ ENTRY(phys_base)
- /* This must match the first entry in level2_kernel_pgt */
- .quad 0x0000000000000000
-
--#ifdef CONFIG_KASAN
--#define FILL(VAL, COUNT) \
-- .rept (COUNT) ; \
-- .quad (VAL) ; \
-- .endr
--
--NEXT_PAGE(kasan_zero_pte)
-- FILL(kasan_zero_page - __START_KERNEL_map + _KERNPG_TABLE, 512)
--NEXT_PAGE(kasan_zero_pmd)
-- FILL(kasan_zero_pte - __START_KERNEL_map + _KERNPG_TABLE, 512)
--NEXT_PAGE(kasan_zero_pud)
-- FILL(kasan_zero_pmd - __START_KERNEL_map + _KERNPG_TABLE, 512)
--
--#undef FILL
--#endif
--
--
- #include "../../x86/xen/xen-head.S"
-
- __PAGE_ALIGNED_BSS
- NEXT_PAGE(empty_zero_page)
- .skip PAGE_SIZE
-
--#ifdef CONFIG_KASAN
--/*
-- * This page used as early shadow. We don't use empty_zero_page
-- * at early stages, stack instrumentation could write some garbage
-- * to this page.
-- * Latter we reuse it as zero shadow for large ranges of memory
-- * that allowed to access, but not instrumented by kasan
-- * (vmalloc/vmemmap ...).
-- */
--NEXT_PAGE(kasan_zero_page)
-- .skip PAGE_SIZE
--#endif
-diff --git a/arch/x86/mm/kasan_init_64.c b/arch/x86/mm/kasan_init_64.c
-index 4860906..9a54dbe 100644
---- a/arch/x86/mm/kasan_init_64.c
-+++ b/arch/x86/mm/kasan_init_64.c
-@@ -11,7 +11,19 @@
- extern pgd_t early_level4_pgt[PTRS_PER_PGD];
- extern struct range pfn_mapped[E820_X_MAX];
-
--extern unsigned char kasan_zero_page[PAGE_SIZE];
-+static pud_t kasan_zero_pud[PTRS_PER_PUD] __page_aligned_bss;
-+static pmd_t kasan_zero_pmd[PTRS_PER_PMD] __page_aligned_bss;
-+static pte_t kasan_zero_pte[PTRS_PER_PTE] __page_aligned_bss;
-+
-+/*
-+ * This page used as early shadow. We don't use empty_zero_page
-+ * at early stages, stack instrumentation could write some garbage
-+ * to this page.
-+ * Latter we reuse it as zero shadow for large ranges of memory
-+ * that allowed to access, but not instrumented by kasan
-+ * (vmalloc/vmemmap ...).
-+ */
-+static unsigned char kasan_zero_page[PAGE_SIZE] __page_aligned_bss;
-
- static int __init map_range(struct range *range)
- {
-@@ -36,7 +48,7 @@ static void __init clear_pgds(unsigned long start,
- pgd_clear(pgd_offset_k(start));
- }
-
--void __init kasan_map_early_shadow(pgd_t *pgd)
-+static void __init kasan_map_early_shadow(pgd_t *pgd)
- {
- int i;
- unsigned long start = KASAN_SHADOW_START;
-@@ -73,7 +85,7 @@ static int __init zero_pmd_populate(pud_t *pud, unsigned long addr,
- while (IS_ALIGNED(addr, PMD_SIZE) && addr + PMD_SIZE <= end) {
- WARN_ON(!pmd_none(*pmd));
- set_pmd(pmd, __pmd(__pa_nodebug(kasan_zero_pte)
-- | __PAGE_KERNEL_RO));
-+ | _KERNPG_TABLE));
- addr += PMD_SIZE;
- pmd = pmd_offset(pud, addr);
- }
-@@ -99,7 +111,7 @@ static int __init zero_pud_populate(pgd_t *pgd, unsigned long addr,
- while (IS_ALIGNED(addr, PUD_SIZE) && addr + PUD_SIZE <= end) {
- WARN_ON(!pud_none(*pud));
- set_pud(pud, __pud(__pa_nodebug(kasan_zero_pmd)
-- | __PAGE_KERNEL_RO));
-+ | _KERNPG_TABLE));
- addr += PUD_SIZE;
- pud = pud_offset(pgd, addr);
- }
-@@ -124,7 +136,7 @@ static int __init zero_pgd_populate(unsigned long addr, unsigned long end)
- while (IS_ALIGNED(addr, PGDIR_SIZE) && addr + PGDIR_SIZE <= end) {
- WARN_ON(!pgd_none(*pgd));
- set_pgd(pgd, __pgd(__pa_nodebug(kasan_zero_pud)
-- | __PAGE_KERNEL_RO));
-+ | _KERNPG_TABLE));
- addr += PGDIR_SIZE;
- pgd = pgd_offset_k(addr);
- }
-@@ -166,6 +178,26 @@ static struct notifier_block kasan_die_notifier = {
- };
- #endif
-
-+void __init kasan_early_init(void)
-+{
-+ int i;
-+ pteval_t pte_val = __pa_nodebug(kasan_zero_page) | __PAGE_KERNEL;
-+ pmdval_t pmd_val = __pa_nodebug(kasan_zero_pte) | _KERNPG_TABLE;
-+ pudval_t pud_val = __pa_nodebug(kasan_zero_pmd) | _KERNPG_TABLE;
-+
-+ for (i = 0; i < PTRS_PER_PTE; i++)
-+ kasan_zero_pte[i] = __pte(pte_val);
-+
-+ for (i = 0; i < PTRS_PER_PMD; i++)
-+ kasan_zero_pmd[i] = __pmd(pmd_val);
-+
-+ for (i = 0; i < PTRS_PER_PUD; i++)
-+ kasan_zero_pud[i] = __pud(pud_val);
-+
-+ kasan_map_early_shadow(early_level4_pgt);
-+ kasan_map_early_shadow(init_level4_pgt);
-+}
-+
- void __init kasan_init(void)
- {
- int i;
-@@ -176,6 +208,7 @@ void __init kasan_init(void)
-
- memcpy(early_level4_pgt, init_level4_pgt, sizeof(early_level4_pgt));
- load_cr3(early_level4_pgt);
-+ __flush_tlb_all();
-
- clear_pgds(KASAN_SHADOW_START, KASAN_SHADOW_END);
-
-@@ -202,5 +235,6 @@ void __init kasan_init(void)
- memset(kasan_zero_page, 0, PAGE_SIZE);
-
- load_cr3(init_level4_pgt);
-+ __flush_tlb_all();
- init_task.kasan_depth = 0;
- }
-diff --git a/arch/x86/mm/tlb.c b/arch/x86/mm/tlb.c
-index 3250f23..90b924a 100644
---- a/arch/x86/mm/tlb.c
-+++ b/arch/x86/mm/tlb.c
-@@ -117,7 +117,7 @@ static void flush_tlb_func(void *info)
- } else {
- unsigned long addr;
- unsigned long nr_pages =
-- f->flush_end - f->flush_start / PAGE_SIZE;
-+ (f->flush_end - f->flush_start) / PAGE_SIZE;
- addr = f->flush_start;
- while (addr < f->flush_end) {
- __flush_tlb_single(addr);
-diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
-index 02744df..841ea05 100644
---- a/arch/x86/platform/efi/efi.c
-+++ b/arch/x86/platform/efi/efi.c
-@@ -946,6 +946,11 @@ u64 efi_mem_attributes(unsigned long phys_addr)
-
- static int __init arch_parse_efi_cmdline(char *str)
- {
-+ if (!str) {
-+ pr_warn("need at least one option\n");
-+ return -EINVAL;
-+ }
-+
- if (parse_option_str(str, "old_map"))
- set_bit(EFI_OLD_MEMMAP, &efi.flags);
- if (parse_option_str(str, "debug"))
-diff --git a/block/bio-integrity.c b/block/bio-integrity.c
-index 5cbd5d9..39ce74d 100644
---- a/block/bio-integrity.c
-+++ b/block/bio-integrity.c
-@@ -51,7 +51,7 @@ struct bio_integrity_payload *bio_integrity_alloc(struct bio *bio,
- unsigned long idx = BIO_POOL_NONE;
- unsigned inline_vecs;
-
-- if (!bs) {
-+ if (!bs || !bs->bio_integrity_pool) {
- bip = kmalloc(sizeof(struct bio_integrity_payload) +
- sizeof(struct bio_vec) * nr_vecs, gfp_mask);
- inline_vecs = nr_vecs;
-@@ -104,7 +104,7 @@ void bio_integrity_free(struct bio *bio)
- kfree(page_address(bip->bip_vec->bv_page) +
- bip->bip_vec->bv_offset);
-
-- if (bs) {
-+ if (bs && bs->bio_integrity_pool) {
- if (bip->bip_slab != BIO_POOL_NONE)
- bvec_free(bs->bvec_integrity_pool, bip->bip_vec,
- bip->bip_slab);
-diff --git a/block/blk-cgroup.c b/block/blk-cgroup.c
-index 0ac817b..6817e28 100644
---- a/block/blk-cgroup.c
-+++ b/block/blk-cgroup.c
-@@ -716,8 +716,12 @@ int blkg_conf_prep(struct blkcg *blkcg, const struct blkcg_policy *pol,
- return -EINVAL;
-
- disk = get_gendisk(MKDEV(major, minor), &part);
-- if (!disk || part)
-+ if (!disk)
- return -EINVAL;
-+ if (part) {
-+ put_disk(disk);
-+ return -EINVAL;
-+ }
-
- rcu_read_lock();
- spin_lock_irq(disk->queue->queue_lock);
-diff --git a/block/blk-mq.c b/block/blk-mq.c
-index 594eea0..2dc1fd6 100644
---- a/block/blk-mq.c
-+++ b/block/blk-mq.c
-@@ -1968,7 +1968,7 @@ struct request_queue *blk_mq_init_allocated_queue(struct blk_mq_tag_set *set,
- goto err_hctxs;
-
- setup_timer(&q->timeout, blk_mq_rq_timer, (unsigned long) q);
-- blk_queue_rq_timeout(q, set->timeout ? set->timeout : 30000);
-+ blk_queue_rq_timeout(q, set->timeout ? set->timeout : 30 * HZ);
-
- q->nr_queues = nr_cpu_ids;
- q->nr_hw_queues = set->nr_hw_queues;
-diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
-index 7ccc084..85aa761 100644
---- a/drivers/ata/libata-pmp.c
-+++ b/drivers/ata/libata-pmp.c
-@@ -460,6 +460,13 @@ static void sata_pmp_quirks(struct ata_port *ap)
- ATA_LFLAG_NO_SRST |
- ATA_LFLAG_ASSUME_ATA;
- }
-+ } else if (vendor == 0x11ab && devid == 0x4140) {
-+ /* Marvell 4140 quirks */
-+ ata_for_each_link(link, ap, EDGE) {
-+ /* port 4 is for SEMB device and it doesn't like SRST */
-+ if (link->pmp == 4)
-+ link->flags |= ATA_LFLAG_DISABLED;
-+ }
- }
- }
-
-diff --git a/drivers/clk/st/clk-flexgen.c b/drivers/clk/st/clk-flexgen.c
-index bf12a25..0f8db28 100644
---- a/drivers/clk/st/clk-flexgen.c
-+++ b/drivers/clk/st/clk-flexgen.c
-@@ -303,6 +303,8 @@ void __init st_of_flexgen_setup(struct device_node *np)
- if (!rlock)
- goto err;
-
-+ spin_lock_init(rlock);
-+
- for (i = 0; i < clk_data->clk_num; i++) {
- struct clk *clk;
- const char *clk_name;
-diff --git a/drivers/clk/st/clkgen-fsyn.c b/drivers/clk/st/clkgen-fsyn.c
-index a917c4c..6ae068a 100644
---- a/drivers/clk/st/clkgen-fsyn.c
-+++ b/drivers/clk/st/clkgen-fsyn.c
-@@ -340,7 +340,7 @@ static const struct clkgen_quadfs_data st_fs660c32_C_407 = {
- CLKGEN_FIELD(0x30c, 0xf, 20),
- CLKGEN_FIELD(0x310, 0xf, 20) },
- .lockstatus_present = true,
-- .lock_status = CLKGEN_FIELD(0x2A0, 0x1, 24),
-+ .lock_status = CLKGEN_FIELD(0x2f0, 0x1, 24),
- .powerup_polarity = 1,
- .standby_polarity = 1,
- .pll_ops = &st_quadfs_pll_c32_ops,
-diff --git a/drivers/clk/st/clkgen-mux.c b/drivers/clk/st/clkgen-mux.c
-index fdcff10..ef65146 100644
---- a/drivers/clk/st/clkgen-mux.c
-+++ b/drivers/clk/st/clkgen-mux.c
-@@ -582,7 +582,7 @@ static struct clkgen_mux_data stih416_a9_mux_data = {
- };
- static struct clkgen_mux_data stih407_a9_mux_data = {
- .offset = 0x1a4,
-- .shift = 1,
-+ .shift = 0,
- .width = 2,
- };
-
-diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
-index c45d274..6f9d27f 100644
---- a/drivers/cpufreq/intel_pstate.c
-+++ b/drivers/cpufreq/intel_pstate.c
-@@ -678,6 +678,7 @@ static struct cpu_defaults knl_params = {
- .get_max = core_get_max_pstate,
- .get_min = core_get_min_pstate,
- .get_turbo = knl_get_turbo_pstate,
-+ .get_scaling = core_get_scaling,
- .set = core_set_pstate,
- },
- };
-diff --git a/drivers/crypto/omap-des.c b/drivers/crypto/omap-des.c
-index 4630709..0a70e46 100644
---- a/drivers/crypto/omap-des.c
-+++ b/drivers/crypto/omap-des.c
-@@ -536,9 +536,6 @@ static int omap_des_crypt_dma_stop(struct omap_des_dev *dd)
- dmaengine_terminate_all(dd->dma_lch_in);
- dmaengine_terminate_all(dd->dma_lch_out);
-
-- dma_unmap_sg(dd->dev, dd->in_sg, dd->in_sg_len, DMA_TO_DEVICE);
-- dma_unmap_sg(dd->dev, dd->out_sg, dd->out_sg_len, DMA_FROM_DEVICE);
--
- return err;
- }
-
-diff --git a/drivers/firmware/efi/cper.c b/drivers/firmware/efi/cper.c
-index 4fd9961..d425374 100644
---- a/drivers/firmware/efi/cper.c
-+++ b/drivers/firmware/efi/cper.c
-@@ -305,10 +305,17 @@ const char *cper_mem_err_unpack(struct trace_seq *p,
- return ret;
- }
-
--static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem)
-+static void cper_print_mem(const char *pfx, const struct cper_sec_mem_err *mem,
-+ int len)
- {
- struct cper_mem_err_compact cmem;
-
-+ /* Don't trust UEFI 2.1/2.2 structure with bad validation bits */
-+ if (len == sizeof(struct cper_sec_mem_err_old) &&
-+ (mem->validation_bits & ~(CPER_MEM_VALID_RANK_NUMBER - 1))) {
-+ pr_err(FW_WARN "valid bits set for fields beyond structure\n");
-+ return;
-+ }
- if (mem->validation_bits & CPER_MEM_VALID_ERROR_STATUS)
- printk("%s""error_status: 0x%016llx\n", pfx, mem->error_status);
- if (mem->validation_bits & CPER_MEM_VALID_PA)
-@@ -405,8 +412,10 @@ static void cper_estatus_print_section(
- } else if (!uuid_le_cmp(*sec_type, CPER_SEC_PLATFORM_MEM)) {
- struct cper_sec_mem_err *mem_err = (void *)(gdata + 1);
- printk("%s""section_type: memory error\n", newpfx);
-- if (gdata->error_data_length >= sizeof(*mem_err))
-- cper_print_mem(newpfx, mem_err);
-+ if (gdata->error_data_length >=
-+ sizeof(struct cper_sec_mem_err_old))
-+ cper_print_mem(newpfx, mem_err,
-+ gdata->error_data_length);
- else
- goto err_section_too_small;
- } else if (!uuid_le_cmp(*sec_type, CPER_SEC_PCIE)) {
-diff --git a/drivers/firmware/efi/efi.c b/drivers/firmware/efi/efi.c
-index e14363d..63226e9 100644
---- a/drivers/firmware/efi/efi.c
-+++ b/drivers/firmware/efi/efi.c
-@@ -57,6 +57,11 @@ bool efi_runtime_disabled(void)
-
- static int __init parse_efi_cmdline(char *str)
- {
-+ if (!str) {
-+ pr_warn("need at least one option\n");
-+ return -EINVAL;
-+ }
-+
- if (parse_option_str(str, "noruntime"))
- disable_runtime = true;
-
-diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
-index 8904933..cd6dae0 100644
---- a/drivers/gpu/drm/nouveau/nouveau_drm.c
-+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
-@@ -863,8 +863,10 @@ nouveau_drm_preclose(struct drm_device *dev, struct drm_file *fpriv)
-
- pm_runtime_get_sync(dev->dev);
-
-+ mutex_lock(&cli->mutex);
- if (cli->abi16)
- nouveau_abi16_fini(cli->abi16);
-+ mutex_unlock(&cli->mutex);
-
- mutex_lock(&drm->client.mutex);
- list_del(&cli->head);
-diff --git a/drivers/gpu/drm/nouveau/nv04_fbcon.c b/drivers/gpu/drm/nouveau/nv04_fbcon.c
-index 4ef602c..495c576 100644
---- a/drivers/gpu/drm/nouveau/nv04_fbcon.c
-+++ b/drivers/gpu/drm/nouveau/nv04_fbcon.c
-@@ -203,7 +203,7 @@ nv04_fbcon_accel_init(struct fb_info *info)
- if (ret)
- return ret;
-
-- if (RING_SPACE(chan, 49)) {
-+ if (RING_SPACE(chan, 49 + (device->info.chipset >= 0x11 ? 4 : 0))) {
- nouveau_fbcon_gpu_lockup(info);
- return 0;
- }
-diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c
-index 7da7958..981342d 100644
---- a/drivers/gpu/drm/nouveau/nv50_display.c
-+++ b/drivers/gpu/drm/nouveau/nv50_display.c
-@@ -979,7 +979,7 @@ nv50_crtc_cursor_show_hide(struct nouveau_crtc *nv_crtc, bool show, bool update)
- {
- struct nv50_mast *mast = nv50_mast(nv_crtc->base.dev);
-
-- if (show && nv_crtc->cursor.nvbo)
-+ if (show && nv_crtc->cursor.nvbo && nv_crtc->base.enabled)
- nv50_crtc_cursor_show(nv_crtc);
- else
- nv50_crtc_cursor_hide(nv_crtc);
-diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c b/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c
-index 80614f1..282143f 100644
---- a/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c
-@@ -50,7 +50,12 @@ nv04_instobj_dtor(struct nvkm_object *object)
- {
- struct nv04_instmem_priv *priv = (void *)nvkm_instmem(object);
- struct nv04_instobj_priv *node = (void *)object;
-+ struct nvkm_subdev *subdev = (void *)priv;
-+
-+ mutex_lock(&subdev->mutex);
- nvkm_mm_free(&priv->heap, &node->mem);
-+ mutex_unlock(&subdev->mutex);
-+
- nvkm_instobj_destroy(&node->base);
- }
-
-@@ -62,6 +67,7 @@ nv04_instobj_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
- struct nv04_instmem_priv *priv = (void *)nvkm_instmem(parent);
- struct nv04_instobj_priv *node;
- struct nvkm_instobj_args *args = data;
-+ struct nvkm_subdev *subdev = (void *)priv;
- int ret;
-
- if (!args->align)
-@@ -72,8 +78,10 @@ nv04_instobj_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
- if (ret)
- return ret;
-
-+ mutex_lock(&subdev->mutex);
- ret = nvkm_mm_head(&priv->heap, 0, 1, args->size, args->size,
- args->align, &node->mem);
-+ mutex_unlock(&subdev->mutex);
- if (ret)
- return ret;
-
-diff --git a/drivers/hid/hid-cp2112.c b/drivers/hid/hid-cp2112.c
-index 3318de6..a2dbbbe 100644
---- a/drivers/hid/hid-cp2112.c
-+++ b/drivers/hid/hid-cp2112.c
-@@ -356,6 +356,8 @@ static int cp2112_read(struct cp2112_device *dev, u8 *data, size_t size)
- struct cp2112_force_read_report report;
- int ret;
-
-+ if (size > sizeof(dev->read_data))
-+ size = sizeof(dev->read_data);
- report.report = CP2112_DATA_READ_FORCE_SEND;
- report.length = cpu_to_be16(size);
-
-diff --git a/drivers/hwmon/nct7802.c b/drivers/hwmon/nct7802.c
-index 28fcb2e..fbfc02b 100644
---- a/drivers/hwmon/nct7802.c
-+++ b/drivers/hwmon/nct7802.c
-@@ -195,7 +195,7 @@ abort:
- }
-
- static int nct7802_write_voltage(struct nct7802_data *data, int nr, int index,
-- unsigned int voltage)
-+ unsigned long voltage)
- {
- int shift = 8 - REG_VOLTAGE_LIMIT_MSB_SHIFT[index - 1][nr];
- int err;
-diff --git a/drivers/hwmon/nct7904.c b/drivers/hwmon/nct7904.c
-index b77b82f..6153df73 100644
---- a/drivers/hwmon/nct7904.c
-+++ b/drivers/hwmon/nct7904.c
-@@ -412,8 +412,9 @@ static ssize_t show_pwm(struct device *dev,
- return sprintf(buf, "%d\n", val);
- }
-
--static ssize_t store_mode(struct device *dev, struct device_attribute *devattr,
-- const char *buf, size_t count)
-+static ssize_t store_enable(struct device *dev,
-+ struct device_attribute *devattr,
-+ const char *buf, size_t count)
- {
- int index = to_sensor_dev_attr(devattr)->index;
- struct nct7904_data *data = dev_get_drvdata(dev);
-@@ -422,18 +423,18 @@ static ssize_t store_mode(struct device *dev, struct device_attribute *devattr,
-
- if (kstrtoul(buf, 10, &val) < 0)
- return -EINVAL;
-- if (val > 1 || (val && !data->fan_mode[index]))
-+ if (val < 1 || val > 2 || (val == 2 && !data->fan_mode[index]))
- return -EINVAL;
-
- ret = nct7904_write_reg(data, BANK_3, FANCTL1_FMR_REG + index,
-- val ? data->fan_mode[index] : 0);
-+ val == 2 ? data->fan_mode[index] : 0);
-
- return ret ? ret : count;
- }
-
--/* Return 0 for manual mode or 1 for SmartFan mode */
--static ssize_t show_mode(struct device *dev,
-- struct device_attribute *devattr, char *buf)
-+/* Return 1 for manual mode or 2 for SmartFan mode */
-+static ssize_t show_enable(struct device *dev,
-+ struct device_attribute *devattr, char *buf)
- {
- int index = to_sensor_dev_attr(devattr)->index;
- struct nct7904_data *data = dev_get_drvdata(dev);
-@@ -443,36 +444,36 @@ static ssize_t show_mode(struct device *dev,
- if (val < 0)
- return val;
-
-- return sprintf(buf, "%d\n", val ? 1 : 0);
-+ return sprintf(buf, "%d\n", val ? 2 : 1);
- }
-
- /* 2 attributes per channel: pwm and mode */
--static SENSOR_DEVICE_ATTR(fan1_pwm, S_IRUGO | S_IWUSR,
-+static SENSOR_DEVICE_ATTR(pwm1, S_IRUGO | S_IWUSR,
- show_pwm, store_pwm, 0);
--static SENSOR_DEVICE_ATTR(fan1_mode, S_IRUGO | S_IWUSR,
-- show_mode, store_mode, 0);
--static SENSOR_DEVICE_ATTR(fan2_pwm, S_IRUGO | S_IWUSR,
-+static SENSOR_DEVICE_ATTR(pwm1_enable, S_IRUGO | S_IWUSR,
-+ show_enable, store_enable, 0);
-+static SENSOR_DEVICE_ATTR(pwm2, S_IRUGO | S_IWUSR,
- show_pwm, store_pwm, 1);
--static SENSOR_DEVICE_ATTR(fan2_mode, S_IRUGO | S_IWUSR,
-- show_mode, store_mode, 1);
--static SENSOR_DEVICE_ATTR(fan3_pwm, S_IRUGO | S_IWUSR,
-+static SENSOR_DEVICE_ATTR(pwm2_enable, S_IRUGO | S_IWUSR,
-+ show_enable, store_enable, 1);
-+static SENSOR_DEVICE_ATTR(pwm3, S_IRUGO | S_IWUSR,
- show_pwm, store_pwm, 2);
--static SENSOR_DEVICE_ATTR(fan3_mode, S_IRUGO | S_IWUSR,
-- show_mode, store_mode, 2);
--static SENSOR_DEVICE_ATTR(fan4_pwm, S_IRUGO | S_IWUSR,
-+static SENSOR_DEVICE_ATTR(pwm3_enable, S_IRUGO | S_IWUSR,
-+ show_enable, store_enable, 2);
-+static SENSOR_DEVICE_ATTR(pwm4, S_IRUGO | S_IWUSR,
- show_pwm, store_pwm, 3);
--static SENSOR_DEVICE_ATTR(fan4_mode, S_IRUGO | S_IWUSR,
-- show_mode, store_mode, 3);
-+static SENSOR_DEVICE_ATTR(pwm4_enable, S_IRUGO | S_IWUSR,
-+ show_enable, store_enable, 3);
-
- static struct attribute *nct7904_fanctl_attrs[] = {
-- &sensor_dev_attr_fan1_pwm.dev_attr.attr,
-- &sensor_dev_attr_fan1_mode.dev_attr.attr,
-- &sensor_dev_attr_fan2_pwm.dev_attr.attr,
-- &sensor_dev_attr_fan2_mode.dev_attr.attr,
-- &sensor_dev_attr_fan3_pwm.dev_attr.attr,
-- &sensor_dev_attr_fan3_mode.dev_attr.attr,
-- &sensor_dev_attr_fan4_pwm.dev_attr.attr,
-- &sensor_dev_attr_fan4_mode.dev_attr.attr,
-+ &sensor_dev_attr_pwm1.dev_attr.attr,
-+ &sensor_dev_attr_pwm1_enable.dev_attr.attr,
-+ &sensor_dev_attr_pwm2.dev_attr.attr,
-+ &sensor_dev_attr_pwm2_enable.dev_attr.attr,
-+ &sensor_dev_attr_pwm3.dev_attr.attr,
-+ &sensor_dev_attr_pwm3_enable.dev_attr.attr,
-+ &sensor_dev_attr_pwm4.dev_attr.attr,
-+ &sensor_dev_attr_pwm4_enable.dev_attr.attr,
- NULL
- };
-
-diff --git a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
-index e5cc430..2d13fd0 100644
---- a/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
-+++ b/drivers/infiniband/ulp/ipoib/ipoib_verbs.c
-@@ -176,7 +176,8 @@ int ipoib_transport_dev_init(struct net_device *dev, struct ib_device *ca)
- else
- size += ipoib_recvq_size * ipoib_max_conn_qp;
- } else
-- goto out_free_wq;
-+ if (ret != -ENOSYS)
-+ goto out_free_wq;
-
- priv->recv_cq = ib_create_cq(priv->ca, ipoib_ib_completion, NULL, dev, size, 0);
- if (IS_ERR(priv->recv_cq)) {
-diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
-index 35c8d0c..3a32caf 100644
---- a/drivers/input/mouse/synaptics.c
-+++ b/drivers/input/mouse/synaptics.c
-@@ -1199,7 +1199,7 @@ static void set_input_params(struct psmouse *psmouse,
- ABS_MT_POSITION_Y);
- /* Image sensors can report per-contact pressure */
- input_set_abs_params(dev, ABS_MT_PRESSURE, 0, 255, 0, 0);
-- input_mt_init_slots(dev, 3, INPUT_MT_POINTER | INPUT_MT_TRACK);
-+ input_mt_init_slots(dev, 2, INPUT_MT_POINTER | INPUT_MT_TRACK);
-
- /* Image sensors can signal 4 and 5 finger clicks */
- __set_bit(BTN_TOOL_QUADTAP, dev->keybit);
-diff --git a/drivers/input/touchscreen/usbtouchscreen.c b/drivers/input/touchscreen/usbtouchscreen.c
-index f2c6c35..2c41107 100644
---- a/drivers/input/touchscreen/usbtouchscreen.c
-+++ b/drivers/input/touchscreen/usbtouchscreen.c
-@@ -627,6 +627,9 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
- goto err_out;
- }
-
-+ /* TSC-25 data sheet specifies a delay after the RESET command */
-+ msleep(150);
-+
- /* set coordinate output rate */
- buf[0] = buf[1] = 0xFF;
- ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0),
-diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
-index 5ecfaf2..c87c4b1 100644
---- a/drivers/iommu/intel-iommu.c
-+++ b/drivers/iommu/intel-iommu.c
-@@ -1756,8 +1756,9 @@ static int domain_init(struct dmar_domain *domain, int guest_width)
-
- static void domain_exit(struct dmar_domain *domain)
- {
-+ struct dmar_drhd_unit *drhd;
-+ struct intel_iommu *iommu;
- struct page *freelist = NULL;
-- int i;
-
- /* Domain 0 is reserved, so dont process it */
- if (!domain)
-@@ -1777,8 +1778,10 @@ static void domain_exit(struct dmar_domain *domain)
-
- /* clear attached or cached domains */
- rcu_read_lock();
-- for_each_set_bit(i, domain->iommu_bmp, g_num_of_iommus)
-- iommu_detach_domain(domain, g_iommus[i]);
-+ for_each_active_iommu(iommu, drhd)
-+ if (domain_type_is_vm(domain) ||
-+ test_bit(iommu->seq_id, domain->iommu_bmp))
-+ iommu_detach_domain(domain, iommu);
- rcu_read_unlock();
-
- dma_free_pagelist(freelist);
-diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
-index 1b7e155..c00e2db 100644
---- a/drivers/irqchip/irq-gic-v3-its.c
-+++ b/drivers/irqchip/irq-gic-v3-its.c
-@@ -75,6 +75,13 @@ struct its_node {
-
- #define ITS_ITT_ALIGN SZ_256
-
-+struct event_lpi_map {
-+ unsigned long *lpi_map;
-+ u16 *col_map;
-+ irq_hw_number_t lpi_base;
-+ int nr_lpis;
-+};
-+
- /*
- * The ITS view of a device - belongs to an ITS, a collection, owns an
- * interrupt translation table, and a list of interrupts.
-@@ -82,11 +89,8 @@ struct its_node {
- struct its_device {
- struct list_head entry;
- struct its_node *its;
-- struct its_collection *collection;
-+ struct event_lpi_map event_map;
- void *itt;
-- unsigned long *lpi_map;
-- irq_hw_number_t lpi_base;
-- int nr_lpis;
- u32 nr_ites;
- u32 device_id;
- };
-@@ -99,6 +103,14 @@ static struct rdists *gic_rdists;
- #define gic_data_rdist() (raw_cpu_ptr(gic_rdists->rdist))
- #define gic_data_rdist_rd_base() (gic_data_rdist()->rd_base)
-
-+static struct its_collection *dev_event_to_col(struct its_device *its_dev,
-+ u32 event)
-+{
-+ struct its_node *its = its_dev->its;
-+
-+ return its->collections + its_dev->event_map.col_map[event];
-+}
-+
- /*
- * ITS command descriptors - parameters to be encoded in a command
- * block.
-@@ -134,7 +146,7 @@ struct its_cmd_desc {
- struct {
- struct its_device *dev;
- struct its_collection *col;
-- u32 id;
-+ u32 event_id;
- } its_movi_cmd;
-
- struct {
-@@ -241,7 +253,7 @@ static struct its_collection *its_build_mapd_cmd(struct its_cmd_block *cmd,
-
- its_fixup_cmd(cmd);
-
-- return desc->its_mapd_cmd.dev->collection;
-+ return NULL;
- }
-
- static struct its_collection *its_build_mapc_cmd(struct its_cmd_block *cmd,
-@@ -260,52 +272,72 @@ static struct its_collection *its_build_mapc_cmd(struct its_cmd_block *cmd,
- static struct its_collection *its_build_mapvi_cmd(struct its_cmd_block *cmd,
- struct its_cmd_desc *desc)
- {
-+ struct its_collection *col;
-+
-+ col = dev_event_to_col(desc->its_mapvi_cmd.dev,
-+ desc->its_mapvi_cmd.event_id);
-+
- its_encode_cmd(cmd, GITS_CMD_MAPVI);
- its_encode_devid(cmd, desc->its_mapvi_cmd.dev->device_id);
- its_encode_event_id(cmd, desc->its_mapvi_cmd.event_id);
- its_encode_phys_id(cmd, desc->its_mapvi_cmd.phys_id);
-- its_encode_collection(cmd, desc->its_mapvi_cmd.dev->collection->col_id);
-+ its_encode_collection(cmd, col->col_id);
-
- its_fixup_cmd(cmd);
-
-- return desc->its_mapvi_cmd.dev->collection;
-+ return col;
- }
-
- static struct its_collection *its_build_movi_cmd(struct its_cmd_block *cmd,
- struct its_cmd_desc *desc)
- {
-+ struct its_collection *col;
-+
-+ col = dev_event_to_col(desc->its_movi_cmd.dev,
-+ desc->its_movi_cmd.event_id);
-+
- its_encode_cmd(cmd, GITS_CMD_MOVI);
- its_encode_devid(cmd, desc->its_movi_cmd.dev->device_id);
-- its_encode_event_id(cmd, desc->its_movi_cmd.id);
-+ its_encode_event_id(cmd, desc->its_movi_cmd.event_id);
- its_encode_collection(cmd, desc->its_movi_cmd.col->col_id);
-
- its_fixup_cmd(cmd);
-
-- return desc->its_movi_cmd.dev->collection;
-+ return col;
- }
-
- static struct its_collection *its_build_discard_cmd(struct its_cmd_block *cmd,
- struct its_cmd_desc *desc)
- {
-+ struct its_collection *col;
-+
-+ col = dev_event_to_col(desc->its_discard_cmd.dev,
-+ desc->its_discard_cmd.event_id);
-+
- its_encode_cmd(cmd, GITS_CMD_DISCARD);
- its_encode_devid(cmd, desc->its_discard_cmd.dev->device_id);
- its_encode_event_id(cmd, desc->its_discard_cmd.event_id);
-
- its_fixup_cmd(cmd);
-
-- return desc->its_discard_cmd.dev->collection;
-+ return col;
- }
-
- static struct its_collection *its_build_inv_cmd(struct its_cmd_block *cmd,
- struct its_cmd_desc *desc)
- {
-+ struct its_collection *col;
-+
-+ col = dev_event_to_col(desc->its_inv_cmd.dev,
-+ desc->its_inv_cmd.event_id);
-+
- its_encode_cmd(cmd, GITS_CMD_INV);
- its_encode_devid(cmd, desc->its_inv_cmd.dev->device_id);
- its_encode_event_id(cmd, desc->its_inv_cmd.event_id);
-
- its_fixup_cmd(cmd);
-
-- return desc->its_inv_cmd.dev->collection;
-+ return col;
- }
-
- static struct its_collection *its_build_invall_cmd(struct its_cmd_block *cmd,
-@@ -497,7 +529,7 @@ static void its_send_movi(struct its_device *dev,
-
- desc.its_movi_cmd.dev = dev;
- desc.its_movi_cmd.col = col;
-- desc.its_movi_cmd.id = id;
-+ desc.its_movi_cmd.event_id = id;
-
- its_send_single_command(dev->its, its_build_movi_cmd, &desc);
- }
-@@ -528,7 +560,7 @@ static void its_send_invall(struct its_node *its, struct its_collection *col)
- static inline u32 its_get_event_id(struct irq_data *d)
- {
- struct its_device *its_dev = irq_data_get_irq_chip_data(d);
-- return d->hwirq - its_dev->lpi_base;
-+ return d->hwirq - its_dev->event_map.lpi_base;
- }
-
- static void lpi_set_config(struct irq_data *d, bool enable)
-@@ -583,7 +615,7 @@ static int its_set_affinity(struct irq_data *d, const struct cpumask *mask_val,
-
- target_col = &its_dev->its->collections[cpu];
- its_send_movi(its_dev, target_col, id);
-- its_dev->collection = target_col;
-+ its_dev->event_map.col_map[id] = cpu;
-
- return IRQ_SET_MASK_OK_DONE;
- }
-@@ -713,8 +745,10 @@ out:
- return bitmap;
- }
-
--static void its_lpi_free(unsigned long *bitmap, int base, int nr_ids)
-+static void its_lpi_free(struct event_lpi_map *map)
- {
-+ int base = map->lpi_base;
-+ int nr_ids = map->nr_lpis;
- int lpi;
-
- spin_lock(&lpi_lock);
-@@ -731,7 +765,8 @@ static void its_lpi_free(unsigned long *bitmap, int base, int nr_ids)
-
- spin_unlock(&lpi_lock);
-
-- kfree(bitmap);
-+ kfree(map->lpi_map);
-+ kfree(map->col_map);
- }
-
- /*
-@@ -1099,11 +1134,11 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id,
- struct its_device *dev;
- unsigned long *lpi_map;
- unsigned long flags;
-+ u16 *col_map = NULL;
- void *itt;
- int lpi_base;
- int nr_lpis;
- int nr_ites;
-- int cpu;
- int sz;
-
- dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-@@ -1117,20 +1152,24 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id,
- sz = max(sz, ITS_ITT_ALIGN) + ITS_ITT_ALIGN - 1;
- itt = kzalloc(sz, GFP_KERNEL);
- lpi_map = its_lpi_alloc_chunks(nvecs, &lpi_base, &nr_lpis);
-+ if (lpi_map)
-+ col_map = kzalloc(sizeof(*col_map) * nr_lpis, GFP_KERNEL);
-
-- if (!dev || !itt || !lpi_map) {
-+ if (!dev || !itt || !lpi_map || !col_map) {
- kfree(dev);
- kfree(itt);
- kfree(lpi_map);
-+ kfree(col_map);
- return NULL;
- }
-
- dev->its = its;
- dev->itt = itt;
- dev->nr_ites = nr_ites;
-- dev->lpi_map = lpi_map;
-- dev->lpi_base = lpi_base;
-- dev->nr_lpis = nr_lpis;
-+ dev->event_map.lpi_map = lpi_map;
-+ dev->event_map.col_map = col_map;
-+ dev->event_map.lpi_base = lpi_base;
-+ dev->event_map.nr_lpis = nr_lpis;
- dev->device_id = dev_id;
- INIT_LIST_HEAD(&dev->entry);
-
-@@ -1138,10 +1177,6 @@ static struct its_device *its_create_device(struct its_node *its, u32 dev_id,
- list_add(&dev->entry, &its->its_device_list);
- raw_spin_unlock_irqrestore(&its->lock, flags);
-
-- /* Bind the device to the first possible CPU */
-- cpu = cpumask_first(cpu_online_mask);
-- dev->collection = &its->collections[cpu];
--
- /* Map device to its ITT */
- its_send_mapd(dev, 1);
-
-@@ -1163,12 +1198,13 @@ static int its_alloc_device_irq(struct its_device *dev, irq_hw_number_t *hwirq)
- {
- int idx;
-
-- idx = find_first_zero_bit(dev->lpi_map, dev->nr_lpis);
-- if (idx == dev->nr_lpis)
-+ idx = find_first_zero_bit(dev->event_map.lpi_map,
-+ dev->event_map.nr_lpis);
-+ if (idx == dev->event_map.nr_lpis)
- return -ENOSPC;
-
-- *hwirq = dev->lpi_base + idx;
-- set_bit(idx, dev->lpi_map);
-+ *hwirq = dev->event_map.lpi_base + idx;
-+ set_bit(idx, dev->event_map.lpi_map);
-
- return 0;
- }
-@@ -1288,7 +1324,8 @@ static int its_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,
- irq_domain_set_hwirq_and_chip(domain, virq + i,
- hwirq, &its_irq_chip, its_dev);
- dev_dbg(info->scratchpad[1].ptr, "ID:%d pID:%d vID:%d\n",
-- (int)(hwirq - its_dev->lpi_base), (int)hwirq, virq + i);
-+ (int)(hwirq - its_dev->event_map.lpi_base),
-+ (int)hwirq, virq + i);
- }
-
- return 0;
-@@ -1300,6 +1337,9 @@ static void its_irq_domain_activate(struct irq_domain *domain,
- struct its_device *its_dev = irq_data_get_irq_chip_data(d);
- u32 event = its_get_event_id(d);
-
-+ /* Bind the LPI to the first possible CPU */
-+ its_dev->event_map.col_map[event] = cpumask_first(cpu_online_mask);
-+
- /* Map the GIC IRQ and event to the device */
- its_send_mapvi(its_dev, d->hwirq, event);
- }
-@@ -1327,17 +1367,16 @@ static void its_irq_domain_free(struct irq_domain *domain, unsigned int virq,
- u32 event = its_get_event_id(data);
-
- /* Mark interrupt index as unused */
-- clear_bit(event, its_dev->lpi_map);
-+ clear_bit(event, its_dev->event_map.lpi_map);
-
- /* Nuke the entry in the domain */
- irq_domain_reset_irq_data(data);
- }
-
- /* If all interrupts have been freed, start mopping the floor */
-- if (bitmap_empty(its_dev->lpi_map, its_dev->nr_lpis)) {
-- its_lpi_free(its_dev->lpi_map,
-- its_dev->lpi_base,
-- its_dev->nr_lpis);
-+ if (bitmap_empty(its_dev->event_map.lpi_map,
-+ its_dev->event_map.nr_lpis)) {
-+ its_lpi_free(&its_dev->event_map);
-
- /* Unmap device/itt */
- its_send_mapd(its_dev, 0);
-diff --git a/drivers/md/dm.c b/drivers/md/dm.c
-index 2caf492..e8d8456 100644
---- a/drivers/md/dm.c
-+++ b/drivers/md/dm.c
-@@ -1053,13 +1053,10 @@ static struct dm_rq_target_io *tio_from_request(struct request *rq)
- */
- static void rq_completed(struct mapped_device *md, int rw, bool run_queue)
- {
-- int nr_requests_pending;
--
- atomic_dec(&md->pending[rw]);
-
- /* nudge anyone waiting on suspend queue */
-- nr_requests_pending = md_in_flight(md);
-- if (!nr_requests_pending)
-+ if (!md_in_flight(md))
- wake_up(&md->wait);
-
- /*
-@@ -1071,8 +1068,7 @@ static void rq_completed(struct mapped_device *md, int rw, bool run_queue)
- if (run_queue) {
- if (md->queue->mq_ops)
- blk_mq_run_hw_queues(md->queue, true);
-- else if (!nr_requests_pending ||
-- (nr_requests_pending >= md->queue->nr_congestion_on))
-+ else
- blk_run_queue_async(md->queue);
- }
-
-diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
-index 9157a29..cd7b0c1 100644
---- a/drivers/md/raid1.c
-+++ b/drivers/md/raid1.c
-@@ -336,7 +336,7 @@ static void raid1_end_read_request(struct bio *bio, int error)
- spin_lock_irqsave(&conf->device_lock, flags);
- if (r1_bio->mddev->degraded == conf->raid_disks ||
- (r1_bio->mddev->degraded == conf->raid_disks-1 &&
-- !test_bit(Faulty, &conf->mirrors[mirror].rdev->flags)))
-+ test_bit(In_sync, &conf->mirrors[mirror].rdev->flags)))
- uptodate = 1;
- spin_unlock_irqrestore(&conf->device_lock, flags);
- }
-diff --git a/drivers/misc/cxl/context.c b/drivers/misc/cxl/context.c
-index d1b55fe..e4dc8cd 100644
---- a/drivers/misc/cxl/context.c
-+++ b/drivers/misc/cxl/context.c
-@@ -113,11 +113,11 @@ static int cxl_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
-
- if (ctx->afu->current_mode == CXL_MODE_DEDICATED) {
- area = ctx->afu->psn_phys;
-- if (offset > ctx->afu->adapter->ps_size)
-+ if (offset >= ctx->afu->adapter->ps_size)
- return VM_FAULT_SIGBUS;
- } else {
- area = ctx->psn_phys;
-- if (offset > ctx->psn_size)
-+ if (offset >= ctx->psn_size)
- return VM_FAULT_SIGBUS;
- }
-
-diff --git a/drivers/misc/cxl/main.c b/drivers/misc/cxl/main.c
-index 8ccddce..de350dd 100644
---- a/drivers/misc/cxl/main.c
-+++ b/drivers/misc/cxl/main.c
-@@ -73,7 +73,7 @@ static inline void cxl_slbia_core(struct mm_struct *mm)
- spin_lock(&adapter->afu_list_lock);
- for (slice = 0; slice < adapter->slices; slice++) {
- afu = adapter->afu[slice];
-- if (!afu->enabled)
-+ if (!afu || !afu->enabled)
- continue;
- rcu_read_lock();
- idr_for_each_entry(&afu->contexts_idr, ctx, id)
-diff --git a/drivers/misc/mei/main.c b/drivers/misc/mei/main.c
-index 3e29681..e40bcd03 100644
---- a/drivers/misc/mei/main.c
-+++ b/drivers/misc/mei/main.c
-@@ -685,7 +685,7 @@ int mei_register(struct mei_device *dev, struct device *parent)
- /* Fill in the data structures */
- devno = MKDEV(MAJOR(mei_devt), dev->minor);
- cdev_init(&dev->cdev, &mei_fops);
-- dev->cdev.owner = mei_fops.owner;
-+ dev->cdev.owner = parent->driver->owner;
-
- /* Add the device */
- ret = cdev_add(&dev->cdev, devno, 1);
-diff --git a/drivers/mmc/host/omap_hsmmc.c b/drivers/mmc/host/omap_hsmmc.c
-index 9df2b68..d0abdffb 100644
---- a/drivers/mmc/host/omap_hsmmc.c
-+++ b/drivers/mmc/host/omap_hsmmc.c
-@@ -1062,6 +1062,10 @@ static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status)
-
- if (status & (CTO_EN | CCRC_EN))
- end_cmd = 1;
-+ if (host->data || host->response_busy) {
-+ end_trans = !end_cmd;
-+ host->response_busy = 0;
-+ }
- if (status & (CTO_EN | DTO_EN))
- hsmmc_command_incomplete(host, -ETIMEDOUT, end_cmd);
- else if (status & (CCRC_EN | DCRC_EN))
-@@ -1081,10 +1085,6 @@ static void omap_hsmmc_do_irq(struct omap_hsmmc_host *host, int status)
- }
- dev_dbg(mmc_dev(host->mmc), "AC12 err: 0x%x\n", ac12);
- }
-- if (host->data || host->response_busy) {
-- end_trans = !end_cmd;
-- host->response_busy = 0;
-- }
- }
-
- OMAP_HSMMC_WRITE(host->base, STAT, status);
-diff --git a/drivers/mmc/host/sdhci-esdhc.h b/drivers/mmc/host/sdhci-esdhc.h
-index 3497cfa..a870c42 100644
---- a/drivers/mmc/host/sdhci-esdhc.h
-+++ b/drivers/mmc/host/sdhci-esdhc.h
-@@ -45,6 +45,6 @@
- #define ESDHC_DMA_SYSCTL 0x40c
- #define ESDHC_DMA_SNOOP 0x00000040
-
--#define ESDHC_HOST_CONTROL_RES 0x05
-+#define ESDHC_HOST_CONTROL_RES 0x01
-
- #endif /* _DRIVERS_MMC_SDHCI_ESDHC_H */
-diff --git a/drivers/mmc/host/sdhci-pxav3.c b/drivers/mmc/host/sdhci-pxav3.c
-index b5103a2..065dc70 100644
---- a/drivers/mmc/host/sdhci-pxav3.c
-+++ b/drivers/mmc/host/sdhci-pxav3.c
-@@ -411,6 +411,7 @@ static int sdhci_pxav3_probe(struct platform_device *pdev)
- goto err_of_parse;
- sdhci_get_of_property(pdev);
- pdata = pxav3_get_mmc_pdata(dev);
-+ pdev->dev.platform_data = pdata;
- } else if (pdata) {
- /* on-chip device */
- if (pdata->flags & PXA_FLAG_CARD_PERMANENT)
-diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
-index d3dbb28..bec8a30 100644
---- a/drivers/mmc/host/sdhci.c
-+++ b/drivers/mmc/host/sdhci.c
-@@ -3037,8 +3037,11 @@ int sdhci_add_host(struct sdhci_host *host)
- GFP_KERNEL);
- host->align_buffer = kmalloc(host->align_buffer_sz, GFP_KERNEL);
- if (!host->adma_table || !host->align_buffer) {
-- dma_free_coherent(mmc_dev(mmc), host->adma_table_sz,
-- host->adma_table, host->adma_addr);
-+ if (host->adma_table)
-+ dma_free_coherent(mmc_dev(mmc),
-+ host->adma_table_sz,
-+ host->adma_table,
-+ host->adma_addr);
- kfree(host->align_buffer);
- pr_warn("%s: Unable to allocate ADMA buffers - falling back to standard DMA\n",
- mmc_hostname(mmc));
-diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c
-index 041525d..5d214d1 100644
---- a/drivers/net/can/c_can/c_can.c
-+++ b/drivers/net/can/c_can/c_can.c
-@@ -592,6 +592,7 @@ static int c_can_start(struct net_device *dev)
- {
- struct c_can_priv *priv = netdev_priv(dev);
- int err;
-+ struct pinctrl *p;
-
- /* basic c_can configuration */
- err = c_can_chip_config(dev);
-@@ -604,8 +605,13 @@ static int c_can_start(struct net_device *dev)
-
- priv->can.state = CAN_STATE_ERROR_ACTIVE;
-
-- /* activate pins */
-- pinctrl_pm_select_default_state(dev->dev.parent);
-+ /* Attempt to use "active" if available else use "default" */
-+ p = pinctrl_get_select(priv->device, "active");
-+ if (!IS_ERR(p))
-+ pinctrl_put(p);
-+ else
-+ pinctrl_pm_select_default_state(priv->device);
-+
- return 0;
- }
-
-diff --git a/drivers/net/can/dev.c b/drivers/net/can/dev.c
-index e9b1810..aede704 100644
---- a/drivers/net/can/dev.c
-+++ b/drivers/net/can/dev.c
-@@ -440,9 +440,6 @@ unsigned int can_get_echo_skb(struct net_device *dev, unsigned int idx)
- struct can_frame *cf = (struct can_frame *)skb->data;
- u8 dlc = cf->can_dlc;
-
-- if (!(skb->tstamp.tv64))
-- __net_timestamp(skb);
--
- netif_rx(priv->echo_skb[idx]);
- priv->echo_skb[idx] = NULL;
-
-@@ -578,7 +575,6 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf)
- if (unlikely(!skb))
- return NULL;
-
-- __net_timestamp(skb);
- skb->protocol = htons(ETH_P_CAN);
- skb->pkt_type = PACKET_BROADCAST;
- skb->ip_summed = CHECKSUM_UNNECESSARY;
-@@ -589,6 +585,7 @@ struct sk_buff *alloc_can_skb(struct net_device *dev, struct can_frame **cf)
-
- can_skb_reserve(skb);
- can_skb_prv(skb)->ifindex = dev->ifindex;
-+ can_skb_prv(skb)->skbcnt = 0;
-
- *cf = (struct can_frame *)skb_put(skb, sizeof(struct can_frame));
- memset(*cf, 0, sizeof(struct can_frame));
-@@ -607,7 +604,6 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev,
- if (unlikely(!skb))
- return NULL;
-
-- __net_timestamp(skb);
- skb->protocol = htons(ETH_P_CANFD);
- skb->pkt_type = PACKET_BROADCAST;
- skb->ip_summed = CHECKSUM_UNNECESSARY;
-@@ -618,6 +614,7 @@ struct sk_buff *alloc_canfd_skb(struct net_device *dev,
-
- can_skb_reserve(skb);
- can_skb_prv(skb)->ifindex = dev->ifindex;
-+ can_skb_prv(skb)->skbcnt = 0;
-
- *cfd = (struct canfd_frame *)skb_put(skb, sizeof(struct canfd_frame));
- memset(*cfd, 0, sizeof(struct canfd_frame));
-diff --git a/drivers/net/can/rcar_can.c b/drivers/net/can/rcar_can.c
-index 7deb80d..2f9ebad 100644
---- a/drivers/net/can/rcar_can.c
-+++ b/drivers/net/can/rcar_can.c
-@@ -526,7 +526,7 @@ static int rcar_can_open(struct net_device *ndev)
- napi_enable(&priv->napi);
- err = request_irq(ndev->irq, rcar_can_interrupt, 0, ndev->name, ndev);
- if (err) {
-- netdev_err(ndev, "error requesting interrupt %x\n", ndev->irq);
-+ netdev_err(ndev, "error requesting interrupt %d\n", ndev->irq);
- goto out_close;
- }
- can_led_event(ndev, CAN_LED_EVENT_OPEN);
-@@ -758,8 +758,9 @@ static int rcar_can_probe(struct platform_device *pdev)
- }
-
- irq = platform_get_irq(pdev, 0);
-- if (!irq) {
-+ if (irq < 0) {
- dev_err(&pdev->dev, "No IRQ resource\n");
-+ err = irq;
- goto fail;
- }
-
-@@ -823,7 +824,7 @@ static int rcar_can_probe(struct platform_device *pdev)
-
- devm_can_led_init(ndev);
-
-- dev_info(&pdev->dev, "device registered (reg_base=%p, irq=%u)\n",
-+ dev_info(&pdev->dev, "device registered (regs @ %p, IRQ%d)\n",
- priv->regs, ndev->irq);
-
- return 0;
-diff --git a/drivers/net/can/slcan.c b/drivers/net/can/slcan.c
-index f64f529..a23a7af 100644
---- a/drivers/net/can/slcan.c
-+++ b/drivers/net/can/slcan.c
-@@ -207,7 +207,6 @@ static void slc_bump(struct slcan *sl)
- if (!skb)
- return;
-
-- __net_timestamp(skb);
- skb->dev = sl->dev;
- skb->protocol = htons(ETH_P_CAN);
- skb->pkt_type = PACKET_BROADCAST;
-@@ -215,6 +214,7 @@ static void slc_bump(struct slcan *sl)
-
- can_skb_reserve(skb);
- can_skb_prv(skb)->ifindex = sl->dev->ifindex;
-+ can_skb_prv(skb)->skbcnt = 0;
-
- memcpy(skb_put(skb, sizeof(struct can_frame)),
- &cf, sizeof(struct can_frame));
-diff --git a/drivers/net/can/spi/mcp251x.c b/drivers/net/can/spi/mcp251x.c
-index bf63fee..34c625e 100644
---- a/drivers/net/can/spi/mcp251x.c
-+++ b/drivers/net/can/spi/mcp251x.c
-@@ -1221,17 +1221,16 @@ static int __maybe_unused mcp251x_can_resume(struct device *dev)
- struct spi_device *spi = to_spi_device(dev);
- struct mcp251x_priv *priv = spi_get_drvdata(spi);
-
-- if (priv->after_suspend & AFTER_SUSPEND_POWER) {
-+ if (priv->after_suspend & AFTER_SUSPEND_POWER)
- mcp251x_power_enable(priv->power, 1);
-+
-+ if (priv->after_suspend & AFTER_SUSPEND_UP) {
-+ mcp251x_power_enable(priv->transceiver, 1);
- queue_work(priv->wq, &priv->restart_work);
- } else {
-- if (priv->after_suspend & AFTER_SUSPEND_UP) {
-- mcp251x_power_enable(priv->transceiver, 1);
-- queue_work(priv->wq, &priv->restart_work);
-- } else {
-- priv->after_suspend = 0;
-- }
-+ priv->after_suspend = 0;
- }
-+
- priv->force_quit = 0;
- enable_irq(spi->irq);
- return 0;
-diff --git a/drivers/net/can/vcan.c b/drivers/net/can/vcan.c
-index 0ce868d..674f367 100644
---- a/drivers/net/can/vcan.c
-+++ b/drivers/net/can/vcan.c
-@@ -78,9 +78,6 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev)
- skb->dev = dev;
- skb->ip_summed = CHECKSUM_UNNECESSARY;
-
-- if (!(skb->tstamp.tv64))
-- __net_timestamp(skb);
--
- netif_rx_ni(skb);
- }
-
-diff --git a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
-index 8e604a3..ef20be0 100644
---- a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
-+++ b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
-@@ -540,13 +540,11 @@ static void iwl_set_hw_address_family_8000(struct device *dev,
- hw_addr = (const u8 *)(mac_override +
- MAC_ADDRESS_OVERRIDE_FAMILY_8000);
-
-- /* The byte order is little endian 16 bit, meaning 214365 */
-- data->hw_addr[0] = hw_addr[1];
-- data->hw_addr[1] = hw_addr[0];
-- data->hw_addr[2] = hw_addr[3];
-- data->hw_addr[3] = hw_addr[2];
-- data->hw_addr[4] = hw_addr[5];
-- data->hw_addr[5] = hw_addr[4];
-+ /*
-+ * Store the MAC address from MAO section.
-+ * No byte swapping is required in MAO section
-+ */
-+ memcpy(data->hw_addr, hw_addr, ETH_ALEN);
-
- /*
- * Force the use of the OTP MAC address in case of reserved MAC
-diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c
-index ef32e17..281451c 100644
---- a/drivers/net/wireless/iwlwifi/mvm/tx.c
-+++ b/drivers/net/wireless/iwlwifi/mvm/tx.c
-@@ -225,7 +225,7 @@ void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm, struct iwl_tx_cmd *tx_cmd,
-
- if (info->band == IEEE80211_BAND_2GHZ &&
- !iwl_mvm_bt_coex_is_shared_ant_avail(mvm))
-- rate_flags = BIT(mvm->cfg->non_shared_ant) << RATE_MCS_ANT_POS;
-+ rate_flags = mvm->cfg->non_shared_ant << RATE_MCS_ANT_POS;
- else
- rate_flags =
- BIT(mvm->mgmt_last_antenna_idx) << RATE_MCS_ANT_POS;
-diff --git a/drivers/net/wireless/iwlwifi/pcie/trans.c b/drivers/net/wireless/iwlwifi/pcie/trans.c
-index dc17909..37e6a6f 100644
---- a/drivers/net/wireless/iwlwifi/pcie/trans.c
-+++ b/drivers/net/wireless/iwlwifi/pcie/trans.c
-@@ -2515,6 +2515,12 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev *pdev,
- trans->hw_rev = (trans->hw_rev & 0xfff0) |
- (CSR_HW_REV_STEP(trans->hw_rev << 2) << 2);
-
-+ ret = iwl_pcie_prepare_card_hw(trans);
-+ if (ret) {
-+ IWL_WARN(trans, "Exit HW not ready\n");
-+ goto out_pci_disable_msi;
-+ }
-+
- /*
- * in-order to recognize C step driver should read chip version
- * id located at the AUX bus MISC address space.
-diff --git a/drivers/pinctrl/freescale/pinctrl-imx1-core.c b/drivers/pinctrl/freescale/pinctrl-imx1-core.c
-index 5ac59fb..d3a3be7 100644
---- a/drivers/pinctrl/freescale/pinctrl-imx1-core.c
-+++ b/drivers/pinctrl/freescale/pinctrl-imx1-core.c
-@@ -403,14 +403,13 @@ static int imx1_pinconf_set(struct pinctrl_dev *pctldev,
- unsigned num_configs)
- {
- struct imx1_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
-- const struct imx1_pinctrl_soc_info *info = ipctl->info;
- int i;
-
- for (i = 0; i != num_configs; ++i) {
- imx1_write_bit(ipctl, pin_id, configs[i] & 0x01, MX1_PUEN);
-
- dev_dbg(ipctl->dev, "pinconf set pullup pin %s\n",
-- info->pins[pin_id].name);
-+ pin_desc_get(pctldev, pin_id)->name);
- }
-
- return 0;
-diff --git a/drivers/regulator/s2mps11.c b/drivers/regulator/s2mps11.c
-index ff82811..8de1351 100644
---- a/drivers/regulator/s2mps11.c
-+++ b/drivers/regulator/s2mps11.c
-@@ -34,6 +34,8 @@
- #include <linux/mfd/samsung/s2mps14.h>
- #include <linux/mfd/samsung/s2mpu02.h>
-
-+/* The highest number of possible regulators for supported devices. */
-+#define S2MPS_REGULATOR_MAX S2MPS13_REGULATOR_MAX
- struct s2mps11_info {
- unsigned int rdev_num;
- int ramp_delay2;
-@@ -49,7 +51,7 @@ struct s2mps11_info {
- * One bit for each S2MPS13/S2MPS14/S2MPU02 regulator whether
- * the suspend mode was enabled.
- */
-- unsigned long long s2mps14_suspend_state:50;
-+ DECLARE_BITMAP(suspend_state, S2MPS_REGULATOR_MAX);
-
- /* Array of size rdev_num with GPIO-s for external sleep control */
- int *ext_control_gpio;
-@@ -500,7 +502,7 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev)
- switch (s2mps11->dev_type) {
- case S2MPS13X:
- case S2MPS14X:
-- if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev)))
-+ if (test_bit(rdev_get_id(rdev), s2mps11->suspend_state))
- val = S2MPS14_ENABLE_SUSPEND;
- else if (gpio_is_valid(s2mps11->ext_control_gpio[rdev_get_id(rdev)]))
- val = S2MPS14_ENABLE_EXT_CONTROL;
-@@ -508,7 +510,7 @@ static int s2mps14_regulator_enable(struct regulator_dev *rdev)
- val = rdev->desc->enable_mask;
- break;
- case S2MPU02:
-- if (s2mps11->s2mps14_suspend_state & (1 << rdev_get_id(rdev)))
-+ if (test_bit(rdev_get_id(rdev), s2mps11->suspend_state))
- val = S2MPU02_ENABLE_SUSPEND;
- else
- val = rdev->desc->enable_mask;
-@@ -562,7 +564,7 @@ static int s2mps14_regulator_set_suspend_disable(struct regulator_dev *rdev)
- if (ret < 0)
- return ret;
-
-- s2mps11->s2mps14_suspend_state |= (1 << rdev_get_id(rdev));
-+ set_bit(rdev_get_id(rdev), s2mps11->suspend_state);
- /*
- * Don't enable suspend mode if regulator is already disabled because
- * this would effectively for a short time turn on the regulator after
-@@ -960,18 +962,22 @@ static int s2mps11_pmic_probe(struct platform_device *pdev)
- case S2MPS11X:
- s2mps11->rdev_num = ARRAY_SIZE(s2mps11_regulators);
- regulators = s2mps11_regulators;
-+ BUILD_BUG_ON(S2MPS_REGULATOR_MAX < s2mps11->rdev_num);
- break;
- case S2MPS13X:
- s2mps11->rdev_num = ARRAY_SIZE(s2mps13_regulators);
- regulators = s2mps13_regulators;
-+ BUILD_BUG_ON(S2MPS_REGULATOR_MAX < s2mps11->rdev_num);
- break;
- case S2MPS14X:
- s2mps11->rdev_num = ARRAY_SIZE(s2mps14_regulators);
- regulators = s2mps14_regulators;
-+ BUILD_BUG_ON(S2MPS_REGULATOR_MAX < s2mps11->rdev_num);
- break;
- case S2MPU02:
- s2mps11->rdev_num = ARRAY_SIZE(s2mpu02_regulators);
- regulators = s2mpu02_regulators;
-+ BUILD_BUG_ON(S2MPS_REGULATOR_MAX < s2mps11->rdev_num);
- break;
- default:
- dev_err(&pdev->dev, "Invalid device type: %u\n",
-diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
-index 0e6ee3c..e9ae6b9 100644
---- a/drivers/scsi/qla2xxx/qla_dbg.c
-+++ b/drivers/scsi/qla2xxx/qla_dbg.c
-@@ -68,7 +68,7 @@
- * | | | 0xd101-0xd1fe |
- * | | | 0xd214-0xd2fe |
- * | Target Mode | 0xe079 | |
-- * | Target Mode Management | 0xf072 | 0xf002 |
-+ * | Target Mode Management | 0xf080 | 0xf002 |
- * | | | 0xf046-0xf049 |
- * | Target Mode Task Management | 0x1000b | |
- * ----------------------------------------------------------------------
-diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
-index 285cb20..998498e 100644
---- a/drivers/scsi/qla2xxx/qla_init.c
-+++ b/drivers/scsi/qla2xxx/qla_init.c
-@@ -2924,6 +2924,7 @@ qla2x00_rport_del(void *data)
- struct fc_rport *rport;
- scsi_qla_host_t *vha = fcport->vha;
- unsigned long flags;
-+ unsigned long vha_flags;
-
- spin_lock_irqsave(fcport->vha->host->host_lock, flags);
- rport = fcport->drport ? fcport->drport: fcport->rport;
-@@ -2935,7 +2936,9 @@ qla2x00_rport_del(void *data)
- * Release the target mode FC NEXUS in qla_target.c code
- * if target mod is enabled.
- */
-+ spin_lock_irqsave(&vha->hw->hardware_lock, vha_flags);
- qlt_fc_port_deleted(vha, fcport);
-+ spin_unlock_irqrestore(&vha->hw->hardware_lock, vha_flags);
- }
- }
-
-@@ -3303,6 +3306,7 @@ qla2x00_reg_remote_port(scsi_qla_host_t *vha, fc_port_t *fcport)
- * Create target mode FC NEXUS in qla_target.c if target mode is
- * enabled..
- */
-+
- qlt_fc_port_added(vha, fcport);
-
- spin_lock_irqsave(fcport->vha->host->host_lock, flags);
-@@ -3460,20 +3464,43 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
- if ((fcport->flags & FCF_FABRIC_DEVICE) == 0)
- continue;
-
-- if (fcport->scan_state == QLA_FCPORT_SCAN &&
-- atomic_read(&fcport->state) == FCS_ONLINE) {
-- qla2x00_mark_device_lost(vha, fcport,
-- ql2xplogiabsentdevice, 0);
-- if (fcport->loop_id != FC_NO_LOOP_ID &&
-- (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
-- fcport->port_type != FCT_INITIATOR &&
-- fcport->port_type != FCT_BROADCAST) {
-- ha->isp_ops->fabric_logout(vha,
-- fcport->loop_id,
-- fcport->d_id.b.domain,
-- fcport->d_id.b.area,
-- fcport->d_id.b.al_pa);
-- qla2x00_clear_loop_id(fcport);
-+ if (fcport->scan_state == QLA_FCPORT_SCAN) {
-+ if (qla_ini_mode_enabled(base_vha) &&
-+ atomic_read(&fcport->state) == FCS_ONLINE) {
-+ qla2x00_mark_device_lost(vha, fcport,
-+ ql2xplogiabsentdevice, 0);
-+ if (fcport->loop_id != FC_NO_LOOP_ID &&
-+ (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
-+ fcport->port_type != FCT_INITIATOR &&
-+ fcport->port_type != FCT_BROADCAST) {
-+ ha->isp_ops->fabric_logout(vha,
-+ fcport->loop_id,
-+ fcport->d_id.b.domain,
-+ fcport->d_id.b.area,
-+ fcport->d_id.b.al_pa);
-+ qla2x00_clear_loop_id(fcport);
-+ }
-+ } else if (!qla_ini_mode_enabled(base_vha)) {
-+ /*
-+ * In target mode, explicitly kill
-+ * sessions and log out of devices
-+ * that are gone, so that we don't
-+ * end up with an initiator using the
-+ * wrong ACL (if the fabric recycles
-+ * an FC address and we have a stale
-+ * session around) and so that we don't
-+ * report initiators that are no longer
-+ * on the fabric.
-+ */
-+ ql_dbg(ql_dbg_tgt_mgt, vha, 0xf077,
-+ "port gone, logging out/killing session: "
-+ "%8phC state 0x%x flags 0x%x fc4_type 0x%x "
-+ "scan_state %d\n",
-+ fcport->port_name,
-+ atomic_read(&fcport->state),
-+ fcport->flags, fcport->fc4_type,
-+ fcport->scan_state);
-+ qlt_fc_port_deleted(vha, fcport);
- }
- }
- }
-@@ -3494,6 +3521,28 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
- (fcport->flags & FCF_LOGIN_NEEDED) == 0)
- continue;
-
-+ /*
-+ * If we're not an initiator, skip looking for devices
-+ * and logging in. There's no reason for us to do it,
-+ * and it seems to actively cause problems in target
-+ * mode if we race with the initiator logging into us
-+ * (we might get the "port ID used" status back from
-+ * our login command and log out the initiator, which
-+ * seems to cause havoc).
-+ */
-+ if (!qla_ini_mode_enabled(base_vha)) {
-+ if (fcport->scan_state == QLA_FCPORT_FOUND) {
-+ ql_dbg(ql_dbg_tgt_mgt, vha, 0xf078,
-+ "port %8phC state 0x%x flags 0x%x fc4_type 0x%x "
-+ "scan_state %d (initiator mode disabled; skipping "
-+ "login)\n", fcport->port_name,
-+ atomic_read(&fcport->state),
-+ fcport->flags, fcport->fc4_type,
-+ fcport->scan_state);
-+ }
-+ continue;
-+ }
-+
- if (fcport->loop_id == FC_NO_LOOP_ID) {
- fcport->loop_id = next_loopid;
- rval = qla2x00_find_new_loop_id(
-@@ -3520,16 +3569,38 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
- test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
- break;
-
-- /* Find a new loop ID to use. */
-- fcport->loop_id = next_loopid;
-- rval = qla2x00_find_new_loop_id(base_vha, fcport);
-- if (rval != QLA_SUCCESS) {
-- /* Ran out of IDs to use */
-- break;
-- }
-+ /*
-+ * If we're not an initiator, skip looking for devices
-+ * and logging in. There's no reason for us to do it,
-+ * and it seems to actively cause problems in target
-+ * mode if we race with the initiator logging into us
-+ * (we might get the "port ID used" status back from
-+ * our login command and log out the initiator, which
-+ * seems to cause havoc).
-+ */
-+ if (qla_ini_mode_enabled(base_vha)) {
-+ /* Find a new loop ID to use. */
-+ fcport->loop_id = next_loopid;
-+ rval = qla2x00_find_new_loop_id(base_vha,
-+ fcport);
-+ if (rval != QLA_SUCCESS) {
-+ /* Ran out of IDs to use */
-+ break;
-+ }
-
-- /* Login and update database */
-- qla2x00_fabric_dev_login(vha, fcport, &next_loopid);
-+ /* Login and update database */
-+ qla2x00_fabric_dev_login(vha, fcport,
-+ &next_loopid);
-+ } else {
-+ ql_dbg(ql_dbg_tgt_mgt, vha, 0xf079,
-+ "new port %8phC state 0x%x flags 0x%x fc4_type "
-+ "0x%x scan_state %d (initiator mode disabled; "
-+ "skipping login)\n",
-+ fcport->port_name,
-+ atomic_read(&fcport->state),
-+ fcport->flags, fcport->fc4_type,
-+ fcport->scan_state);
-+ }
-
- list_move_tail(&fcport->list, &vha->vp_fcports);
- }
-@@ -3725,11 +3796,12 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
- fcport->fp_speed = new_fcport->fp_speed;
-
- /*
-- * If address the same and state FCS_ONLINE, nothing
-- * changed.
-+ * If address the same and state FCS_ONLINE
-+ * (or in target mode), nothing changed.
- */
- if (fcport->d_id.b24 == new_fcport->d_id.b24 &&
-- atomic_read(&fcport->state) == FCS_ONLINE) {
-+ (atomic_read(&fcport->state) == FCS_ONLINE ||
-+ !qla_ini_mode_enabled(base_vha))) {
- break;
- }
-
-@@ -3749,6 +3821,22 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
- * Log it out if still logged in and mark it for
- * relogin later.
- */
-+ if (!qla_ini_mode_enabled(base_vha)) {
-+ ql_dbg(ql_dbg_tgt_mgt, vha, 0xf080,
-+ "port changed FC ID, %8phC"
-+ " old %x:%x:%x (loop_id 0x%04x)-> new %x:%x:%x\n",
-+ fcport->port_name,
-+ fcport->d_id.b.domain,
-+ fcport->d_id.b.area,
-+ fcport->d_id.b.al_pa,
-+ fcport->loop_id,
-+ new_fcport->d_id.b.domain,
-+ new_fcport->d_id.b.area,
-+ new_fcport->d_id.b.al_pa);
-+ fcport->d_id.b24 = new_fcport->d_id.b24;
-+ break;
-+ }
-+
- fcport->d_id.b24 = new_fcport->d_id.b24;
- fcport->flags |= FCF_LOGIN_NEEDED;
- if (fcport->loop_id != FC_NO_LOOP_ID &&
-@@ -3768,6 +3856,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
- if (found)
- continue;
- /* If device was not in our fcports list, then add it. */
-+ new_fcport->scan_state = QLA_FCPORT_FOUND;
- list_add_tail(&new_fcport->list, new_fcports);
-
- /* Allocate a new replacement fcport. */
-diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c
-index fe8a8d1..496a733 100644
---- a/drivers/scsi/qla2xxx/qla_target.c
-+++ b/drivers/scsi/qla2xxx/qla_target.c
-@@ -113,6 +113,7 @@ static void qlt_abort_cmd_on_host_reset(struct scsi_qla_host *vha,
- static void qlt_alloc_qfull_cmd(struct scsi_qla_host *vha,
- struct atio_from_isp *atio, uint16_t status, int qfull);
- static void qlt_disable_vha(struct scsi_qla_host *vha);
-+static void qlt_clear_tgt_db(struct qla_tgt *tgt);
- /*
- * Global Variables
- */
-@@ -431,10 +432,10 @@ static int qlt_reset(struct scsi_qla_host *vha, void *iocb, int mcmd)
-
- loop_id = le16_to_cpu(n->u.isp24.nport_handle);
- if (loop_id == 0xFFFF) {
--#if 0 /* FIXME: Re-enable Global event handling.. */
- /* Global event */
-- atomic_inc(&ha->tgt.qla_tgt->tgt_global_resets_count);
-- qlt_clear_tgt_db(ha->tgt.qla_tgt);
-+ atomic_inc(&vha->vha_tgt.qla_tgt->tgt_global_resets_count);
-+ qlt_clear_tgt_db(vha->vha_tgt.qla_tgt);
-+#if 0 /* FIXME: do we need to choose a session here? */
- if (!list_empty(&ha->tgt.qla_tgt->sess_list)) {
- sess = list_entry(ha->tgt.qla_tgt->sess_list.next,
- typeof(*sess), sess_list_entry);
-@@ -782,25 +783,20 @@ void qlt_fc_port_added(struct scsi_qla_host *vha, fc_port_t *fcport)
-
- void qlt_fc_port_deleted(struct scsi_qla_host *vha, fc_port_t *fcport)
- {
-- struct qla_hw_data *ha = vha->hw;
- struct qla_tgt *tgt = vha->vha_tgt.qla_tgt;
- struct qla_tgt_sess *sess;
-- unsigned long flags;
-
- if (!vha->hw->tgt.tgt_ops)
- return;
-
-- if (!tgt || (fcport->port_type != FCT_INITIATOR))
-+ if (!tgt)
- return;
-
-- spin_lock_irqsave(&ha->hardware_lock, flags);
- if (tgt->tgt_stop) {
-- spin_unlock_irqrestore(&ha->hardware_lock, flags);
- return;
- }
- sess = qlt_find_sess_by_port_name(tgt, fcport->port_name);
- if (!sess) {
-- spin_unlock_irqrestore(&ha->hardware_lock, flags);
- return;
- }
-
-@@ -808,7 +804,6 @@ void qlt_fc_port_deleted(struct scsi_qla_host *vha, fc_port_t *fcport)
-
- sess->local = 1;
- qlt_schedule_sess_for_deletion(sess, false);
-- spin_unlock_irqrestore(&ha->hardware_lock, flags);
- }
-
- static inline int test_tgt_sess_count(struct qla_tgt *tgt)
-@@ -2347,9 +2342,10 @@ int qlt_xmit_response(struct qla_tgt_cmd *cmd, int xmit_type,
- res = qlt_build_ctio_crc2_pkt(&prm, vha);
- else
- res = qlt_24xx_build_ctio_pkt(&prm, vha);
-- if (unlikely(res != 0))
-+ if (unlikely(res != 0)) {
-+ vha->req->cnt += full_req_cnt;
- goto out_unmap_unlock;
--
-+ }
-
- pkt = (struct ctio7_to_24xx *)prm.pkt;
-
-@@ -2487,8 +2483,11 @@ int qlt_rdy_to_xfer(struct qla_tgt_cmd *cmd)
- else
- res = qlt_24xx_build_ctio_pkt(&prm, vha);
-
-- if (unlikely(res != 0))
-+ if (unlikely(res != 0)) {
-+ vha->req->cnt += prm.req_cnt;
- goto out_unlock_free_unmap;
-+ }
-+
- pkt = (struct ctio7_to_24xx *)prm.pkt;
- pkt->u.status0.flags |= __constant_cpu_to_le16(CTIO7_FLAGS_DATA_OUT |
- CTIO7_FLAGS_STATUS_MODE_0);
-@@ -2717,7 +2716,7 @@ static int __qlt_send_term_exchange(struct scsi_qla_host *vha,
- static void qlt_send_term_exchange(struct scsi_qla_host *vha,
- struct qla_tgt_cmd *cmd, struct atio_from_isp *atio, int ha_locked)
- {
-- unsigned long flags;
-+ unsigned long flags = 0;
- int rc;
-
- if (qlt_issue_marker(vha, ha_locked) < 0)
-@@ -2733,17 +2732,18 @@ static void qlt_send_term_exchange(struct scsi_qla_host *vha,
- rc = __qlt_send_term_exchange(vha, cmd, atio);
- if (rc == -ENOMEM)
- qlt_alloc_qfull_cmd(vha, atio, 0, 0);
-- spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
-
- done:
- if (cmd && ((cmd->state != QLA_TGT_STATE_ABORTED) ||
- !cmd->cmd_sent_to_fw)) {
-- if (!ha_locked && !in_interrupt())
-- msleep(250); /* just in case */
--
-- qlt_unmap_sg(vha, cmd);
-+ if (cmd->sg_mapped)
-+ qlt_unmap_sg(vha, cmd);
- vha->hw->tgt.tgt_ops->free_cmd(cmd);
- }
-+
-+ if (!ha_locked)
-+ spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
-+
- return;
- }
-
-@@ -3347,6 +3347,11 @@ static struct qla_tgt_cmd *qlt_get_tag(scsi_qla_host_t *vha,
- cmd->loop_id = sess->loop_id;
- cmd->conf_compl_supported = sess->conf_compl_supported;
-
-+ cmd->cmd_flags = 0;
-+ cmd->jiffies_at_alloc = get_jiffies_64();
-+
-+ cmd->reset_count = vha->hw->chip_reset;
-+
- return cmd;
- }
-
-@@ -3453,11 +3458,6 @@ static int qlt_handle_cmd_for_atio(struct scsi_qla_host *vha,
- return -ENOMEM;
- }
-
-- cmd->cmd_flags = 0;
-- cmd->jiffies_at_alloc = get_jiffies_64();
--
-- cmd->reset_count = vha->hw->chip_reset;
--
- cmd->cmd_in_wq = 1;
- cmd->cmd_flags |= BIT_0;
- INIT_WORK(&cmd->work, qlt_do_work);
-diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
-index c95a4e9..59c31bf 100644
---- a/drivers/scsi/scsi_error.c
-+++ b/drivers/scsi/scsi_error.c
-@@ -944,7 +944,7 @@ void scsi_eh_prep_cmnd(struct scsi_cmnd *scmd, struct scsi_eh_save *ses,
- scmd->sdb.length);
- scmd->sdb.table.sgl = &ses->sense_sgl;
- scmd->sc_data_direction = DMA_FROM_DEVICE;
-- scmd->sdb.table.nents = 1;
-+ scmd->sdb.table.nents = scmd->sdb.table.orig_nents = 1;
- scmd->cmnd[0] = REQUEST_SENSE;
- scmd->cmnd[4] = scmd->sdb.length;
- scmd->cmd_len = COMMAND_SIZE(scmd->cmnd[0]);
-diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
-index b1a2631..448ebda 100644
---- a/drivers/scsi/scsi_lib.c
-+++ b/drivers/scsi/scsi_lib.c
-@@ -583,7 +583,7 @@ static struct scatterlist *scsi_sg_alloc(unsigned int nents, gfp_t gfp_mask)
-
- static void scsi_free_sgtable(struct scsi_data_buffer *sdb, bool mq)
- {
-- if (mq && sdb->table.nents <= SCSI_MAX_SG_SEGMENTS)
-+ if (mq && sdb->table.orig_nents <= SCSI_MAX_SG_SEGMENTS)
- return;
- __sg_free_table(&sdb->table, SCSI_MAX_SG_SEGMENTS, mq, scsi_sg_free);
- }
-@@ -597,8 +597,8 @@ static int scsi_alloc_sgtable(struct scsi_data_buffer *sdb, int nents, bool mq)
-
- if (mq) {
- if (nents <= SCSI_MAX_SG_SEGMENTS) {
-- sdb->table.nents = nents;
-- sg_init_table(sdb->table.sgl, sdb->table.nents);
-+ sdb->table.nents = sdb->table.orig_nents = nents;
-+ sg_init_table(sdb->table.sgl, nents);
- return 0;
- }
- first_chunk = sdb->table.sgl;
-diff --git a/drivers/scsi/scsi_sysfs.c b/drivers/scsi/scsi_sysfs.c
-index 1ac38e7..9ad4116 100644
---- a/drivers/scsi/scsi_sysfs.c
-+++ b/drivers/scsi/scsi_sysfs.c
-@@ -859,7 +859,7 @@ sdev_store_queue_depth(struct device *dev, struct device_attribute *attr,
-
- depth = simple_strtoul(buf, NULL, 0);
-
-- if (depth < 1 || depth > sht->can_queue)
-+ if (depth < 1 || depth > sdev->host->can_queue)
- return -EINVAL;
-
- retval = sht->change_queue_depth(sdev, depth);
-diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c
-index 9a1c342..525ab4c 100644
---- a/drivers/scsi/st.c
-+++ b/drivers/scsi/st.c
-@@ -1274,9 +1274,9 @@ static int st_open(struct inode *inode, struct file *filp)
- spin_lock(&st_use_lock);
- STp->in_use = 0;
- spin_unlock(&st_use_lock);
-- scsi_tape_put(STp);
- if (resumed)
- scsi_autopm_put_device(STp->device);
-+ scsi_tape_put(STp);
- return retval;
-
- }
-diff --git a/drivers/spi/spi-img-spfi.c b/drivers/spi/spi-img-spfi.c
-index 788e2b1..acce90a 100644
---- a/drivers/spi/spi-img-spfi.c
-+++ b/drivers/spi/spi-img-spfi.c
-@@ -40,6 +40,7 @@
- #define SPFI_CONTROL_SOFT_RESET BIT(11)
- #define SPFI_CONTROL_SEND_DMA BIT(10)
- #define SPFI_CONTROL_GET_DMA BIT(9)
-+#define SPFI_CONTROL_SE BIT(8)
- #define SPFI_CONTROL_TMODE_SHIFT 5
- #define SPFI_CONTROL_TMODE_MASK 0x7
- #define SPFI_CONTROL_TMODE_SINGLE 0
-@@ -491,6 +492,7 @@ static void img_spfi_config(struct spi_master *master, struct spi_device *spi,
- else if (xfer->tx_nbits == SPI_NBITS_QUAD &&
- xfer->rx_nbits == SPI_NBITS_QUAD)
- val |= SPFI_CONTROL_TMODE_QUAD << SPFI_CONTROL_TMODE_SHIFT;
-+ val |= SPFI_CONTROL_SE;
- spfi_writel(spfi, val, SPFI_CONTROL);
- }
-
-diff --git a/drivers/spi/spi-imx.c b/drivers/spi/spi-imx.c
-index f08e812..412b9c8 100644
---- a/drivers/spi/spi-imx.c
-+++ b/drivers/spi/spi-imx.c
-@@ -201,8 +201,9 @@ static bool spi_imx_can_dma(struct spi_master *master, struct spi_device *spi,
- {
- struct spi_imx_data *spi_imx = spi_master_get_devdata(master);
-
-- if (spi_imx->dma_is_inited && (transfer->len > spi_imx->rx_wml)
-- && (transfer->len > spi_imx->tx_wml))
-+ if (spi_imx->dma_is_inited
-+ && transfer->len > spi_imx->rx_wml * sizeof(u32)
-+ && transfer->len > spi_imx->tx_wml * sizeof(u32))
- return true;
- return false;
- }
-diff --git a/drivers/target/iscsi/iscsi_target.c b/drivers/target/iscsi/iscsi_target.c
-index 74e6114f..305a5cb 100644
---- a/drivers/target/iscsi/iscsi_target.c
-+++ b/drivers/target/iscsi/iscsi_target.c
-@@ -4001,7 +4001,13 @@ get_immediate:
- }
-
- transport_err:
-- iscsit_take_action_for_connection_exit(conn);
-+ /*
-+ * Avoid the normal connection failure code-path if this connection
-+ * is still within LOGIN mode, and iscsi_np process context is
-+ * responsible for cleaning up the early connection failure.
-+ */
-+ if (conn->conn_state != TARG_CONN_STATE_IN_LOGIN)
-+ iscsit_take_action_for_connection_exit(conn);
- out:
- return 0;
- }
-@@ -4093,7 +4099,7 @@ reject:
-
- int iscsi_target_rx_thread(void *arg)
- {
-- int ret;
-+ int ret, rc;
- u8 buffer[ISCSI_HDR_LEN], opcode;
- u32 checksum = 0, digest = 0;
- struct iscsi_conn *conn = arg;
-@@ -4103,10 +4109,16 @@ int iscsi_target_rx_thread(void *arg)
- * connection recovery / failure event can be triggered externally.
- */
- allow_signal(SIGINT);
-+ /*
-+ * Wait for iscsi_post_login_handler() to complete before allowing
-+ * incoming iscsi/tcp socket I/O, and/or failing the connection.
-+ */
-+ rc = wait_for_completion_interruptible(&conn->rx_login_comp);
-+ if (rc < 0)
-+ return 0;
-
- if (conn->conn_transport->transport_type == ISCSI_INFINIBAND) {
- struct completion comp;
-- int rc;
-
- init_completion(&comp);
- rc = wait_for_completion_interruptible(&comp);
-@@ -4543,7 +4555,18 @@ static void iscsit_logout_post_handler_closesession(
- struct iscsi_conn *conn)
- {
- struct iscsi_session *sess = conn->sess;
-- int sleep = cmpxchg(&conn->tx_thread_active, true, false);
-+ int sleep = 1;
-+ /*
-+ * Traditional iscsi/tcp will invoke this logic from TX thread
-+ * context during session logout, so clear tx_thread_active and
-+ * sleep if iscsit_close_connection() has not already occured.
-+ *
-+ * Since iser-target invokes this logic from it's own workqueue,
-+ * always sleep waiting for RX/TX thread shutdown to complete
-+ * within iscsit_close_connection().
-+ */
-+ if (conn->conn_transport->transport_type == ISCSI_TCP)
-+ sleep = cmpxchg(&conn->tx_thread_active, true, false);
-
- atomic_set(&conn->conn_logout_remove, 0);
- complete(&conn->conn_logout_comp);
-@@ -4557,7 +4580,10 @@ static void iscsit_logout_post_handler_closesession(
- static void iscsit_logout_post_handler_samecid(
- struct iscsi_conn *conn)
- {
-- int sleep = cmpxchg(&conn->tx_thread_active, true, false);
-+ int sleep = 1;
-+
-+ if (conn->conn_transport->transport_type == ISCSI_TCP)
-+ sleep = cmpxchg(&conn->tx_thread_active, true, false);
-
- atomic_set(&conn->conn_logout_remove, 0);
- complete(&conn->conn_logout_comp);
-@@ -4776,6 +4802,7 @@ int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *tpg, int force)
- struct iscsi_session *sess;
- struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
- struct se_session *se_sess, *se_sess_tmp;
-+ LIST_HEAD(free_list);
- int session_count = 0;
-
- spin_lock_bh(&se_tpg->session_lock);
-@@ -4797,14 +4824,17 @@ int iscsit_release_sessions_for_tpg(struct iscsi_portal_group *tpg, int force)
- }
- atomic_set(&sess->session_reinstatement, 1);
- spin_unlock(&sess->conn_lock);
-- spin_unlock_bh(&se_tpg->session_lock);
-
-- iscsit_free_session(sess);
-- spin_lock_bh(&se_tpg->session_lock);
-+ list_move_tail(&se_sess->sess_list, &free_list);
-+ }
-+ spin_unlock_bh(&se_tpg->session_lock);
-+
-+ list_for_each_entry_safe(se_sess, se_sess_tmp, &free_list, sess_list) {
-+ sess = (struct iscsi_session *)se_sess->fabric_sess_ptr;
-
-+ iscsit_free_session(sess);
- session_count++;
- }
-- spin_unlock_bh(&se_tpg->session_lock);
-
- pr_debug("Released %d iSCSI Session(s) from Target Portal"
- " Group: %hu\n", session_count, tpg->tpgt);
-diff --git a/drivers/target/iscsi/iscsi_target_login.c b/drivers/target/iscsi/iscsi_target_login.c
-index 70d799d..c3bccad 100644
---- a/drivers/target/iscsi/iscsi_target_login.c
-+++ b/drivers/target/iscsi/iscsi_target_login.c
-@@ -82,6 +82,7 @@ static struct iscsi_login *iscsi_login_init_conn(struct iscsi_conn *conn)
- init_completion(&conn->conn_logout_comp);
- init_completion(&conn->rx_half_close_comp);
- init_completion(&conn->tx_half_close_comp);
-+ init_completion(&conn->rx_login_comp);
- spin_lock_init(&conn->cmd_lock);
- spin_lock_init(&conn->conn_usage_lock);
- spin_lock_init(&conn->immed_queue_lock);
-@@ -699,7 +700,7 @@ static void iscsi_post_login_start_timers(struct iscsi_conn *conn)
- iscsit_start_nopin_timer(conn);
- }
-
--static int iscsit_start_kthreads(struct iscsi_conn *conn)
-+int iscsit_start_kthreads(struct iscsi_conn *conn)
- {
- int ret = 0;
-
-@@ -734,6 +735,7 @@ static int iscsit_start_kthreads(struct iscsi_conn *conn)
-
- return 0;
- out_tx:
-+ send_sig(SIGINT, conn->tx_thread, 1);
- kthread_stop(conn->tx_thread);
- conn->tx_thread_active = false;
- out_bitmap:
-@@ -744,7 +746,7 @@ out_bitmap:
- return ret;
- }
-
--int iscsi_post_login_handler(
-+void iscsi_post_login_handler(
- struct iscsi_np *np,
- struct iscsi_conn *conn,
- u8 zero_tsih)
-@@ -754,7 +756,6 @@ int iscsi_post_login_handler(
- struct se_session *se_sess = sess->se_sess;
- struct iscsi_portal_group *tpg = sess->tpg;
- struct se_portal_group *se_tpg = &tpg->tpg_se_tpg;
-- int rc;
-
- iscsit_inc_conn_usage_count(conn);
-
-@@ -795,10 +796,6 @@ int iscsi_post_login_handler(
- sess->sess_ops->InitiatorName);
- spin_unlock_bh(&sess->conn_lock);
-
-- rc = iscsit_start_kthreads(conn);
-- if (rc)
-- return rc;
--
- iscsi_post_login_start_timers(conn);
- /*
- * Determine CPU mask to ensure connection's RX and TX kthreads
-@@ -807,15 +804,20 @@ int iscsi_post_login_handler(
- iscsit_thread_get_cpumask(conn);
- conn->conn_rx_reset_cpumask = 1;
- conn->conn_tx_reset_cpumask = 1;
--
-+ /*
-+ * Wakeup the sleeping iscsi_target_rx_thread() now that
-+ * iscsi_conn is in TARG_CONN_STATE_LOGGED_IN state.
-+ */
-+ complete(&conn->rx_login_comp);
- iscsit_dec_conn_usage_count(conn);
-+
- if (stop_timer) {
- spin_lock_bh(&se_tpg->session_lock);
- iscsit_stop_time2retain_timer(sess);
- spin_unlock_bh(&se_tpg->session_lock);
- }
- iscsit_dec_session_usage_count(sess);
-- return 0;
-+ return;
- }
-
- iscsi_set_session_parameters(sess->sess_ops, conn->param_list, 1);
-@@ -856,10 +858,6 @@ int iscsi_post_login_handler(
- " iSCSI Target Portal Group: %hu\n", tpg->nsessions, tpg->tpgt);
- spin_unlock_bh(&se_tpg->session_lock);
-
-- rc = iscsit_start_kthreads(conn);
-- if (rc)
-- return rc;
--
- iscsi_post_login_start_timers(conn);
- /*
- * Determine CPU mask to ensure connection's RX and TX kthreads
-@@ -868,10 +866,12 @@ int iscsi_post_login_handler(
- iscsit_thread_get_cpumask(conn);
- conn->conn_rx_reset_cpumask = 1;
- conn->conn_tx_reset_cpumask = 1;
--
-+ /*
-+ * Wakeup the sleeping iscsi_target_rx_thread() now that
-+ * iscsi_conn is in TARG_CONN_STATE_LOGGED_IN state.
-+ */
-+ complete(&conn->rx_login_comp);
- iscsit_dec_conn_usage_count(conn);
--
-- return 0;
- }
-
- static void iscsi_handle_login_thread_timeout(unsigned long data)
-@@ -1436,23 +1436,12 @@ static int __iscsi_target_login_thread(struct iscsi_np *np)
- if (ret < 0)
- goto new_sess_out;
-
-- if (!conn->sess) {
-- pr_err("struct iscsi_conn session pointer is NULL!\n");
-- goto new_sess_out;
-- }
--
- iscsi_stop_login_thread_timer(np);
-
-- if (signal_pending(current))
-- goto new_sess_out;
--
- if (ret == 1) {
- tpg_np = conn->tpg_np;
-
-- ret = iscsi_post_login_handler(np, conn, zero_tsih);
-- if (ret < 0)
-- goto new_sess_out;
--
-+ iscsi_post_login_handler(np, conn, zero_tsih);
- iscsit_deaccess_np(np, tpg, tpg_np);
- }
-
-diff --git a/drivers/target/iscsi/iscsi_target_login.h b/drivers/target/iscsi/iscsi_target_login.h
-index 29d0983..55cbf45 100644
---- a/drivers/target/iscsi/iscsi_target_login.h
-+++ b/drivers/target/iscsi/iscsi_target_login.h
-@@ -12,7 +12,8 @@ extern int iscsit_accept_np(struct iscsi_np *, struct iscsi_conn *);
- extern int iscsit_get_login_rx(struct iscsi_conn *, struct iscsi_login *);
- extern int iscsit_put_login_tx(struct iscsi_conn *, struct iscsi_login *, u32);
- extern void iscsit_free_conn(struct iscsi_np *, struct iscsi_conn *);
--extern int iscsi_post_login_handler(struct iscsi_np *, struct iscsi_conn *, u8);
-+extern int iscsit_start_kthreads(struct iscsi_conn *);
-+extern void iscsi_post_login_handler(struct iscsi_np *, struct iscsi_conn *, u8);
- extern void iscsi_target_login_sess_out(struct iscsi_conn *, struct iscsi_np *,
- bool, bool);
- extern int iscsi_target_login_thread(void *);
-diff --git a/drivers/target/iscsi/iscsi_target_nego.c b/drivers/target/iscsi/iscsi_target_nego.c
-index 8c02fa3..f9cde91 100644
---- a/drivers/target/iscsi/iscsi_target_nego.c
-+++ b/drivers/target/iscsi/iscsi_target_nego.c
-@@ -17,6 +17,7 @@
- ******************************************************************************/
-
- #include <linux/ctype.h>
-+#include <linux/kthread.h>
- #include <scsi/iscsi_proto.h>
- #include <target/target_core_base.h>
- #include <target/target_core_fabric.h>
-@@ -361,10 +362,24 @@ static int iscsi_target_do_tx_login_io(struct iscsi_conn *conn, struct iscsi_log
- ntohl(login_rsp->statsn), login->rsp_length);
-
- padding = ((-login->rsp_length) & 3);
-+ /*
-+ * Before sending the last login response containing the transition
-+ * bit for full-feature-phase, go ahead and start up TX/RX threads
-+ * now to avoid potential resource allocation failures after the
-+ * final login response has been sent.
-+ */
-+ if (login->login_complete) {
-+ int rc = iscsit_start_kthreads(conn);
-+ if (rc) {
-+ iscsit_tx_login_rsp(conn, ISCSI_STATUS_CLS_TARGET_ERR,
-+ ISCSI_LOGIN_STATUS_NO_RESOURCES);
-+ return -1;
-+ }
-+ }
-
- if (conn->conn_transport->iscsit_put_login_tx(conn, login,
- login->rsp_length + padding) < 0)
-- return -1;
-+ goto err;
-
- login->rsp_length = 0;
- mutex_lock(&sess->cmdsn_mutex);
-@@ -373,6 +388,23 @@ static int iscsi_target_do_tx_login_io(struct iscsi_conn *conn, struct iscsi_log
- mutex_unlock(&sess->cmdsn_mutex);
-
- return 0;
-+
-+err:
-+ if (login->login_complete) {
-+ if (conn->rx_thread && conn->rx_thread_active) {
-+ send_sig(SIGINT, conn->rx_thread, 1);
-+ kthread_stop(conn->rx_thread);
-+ }
-+ if (conn->tx_thread && conn->tx_thread_active) {
-+ send_sig(SIGINT, conn->tx_thread, 1);
-+ kthread_stop(conn->tx_thread);
-+ }
-+ spin_lock(&iscsit_global->ts_bitmap_lock);
-+ bitmap_release_region(iscsit_global->ts_bitmap, conn->bitmap_id,
-+ get_order(1));
-+ spin_unlock(&iscsit_global->ts_bitmap_lock);
-+ }
-+ return -1;
- }
-
- static void iscsi_target_sk_data_ready(struct sock *sk)
-diff --git a/drivers/tty/n_tty.c b/drivers/tty/n_tty.c
-index 396344c..16ed0b6 100644
---- a/drivers/tty/n_tty.c
-+++ b/drivers/tty/n_tty.c
-@@ -1108,19 +1108,29 @@ static void eraser(unsigned char c, struct tty_struct *tty)
- * Locking: ctrl_lock
- */
-
--static void isig(int sig, struct tty_struct *tty)
-+static void __isig(int sig, struct tty_struct *tty)
- {
-- struct n_tty_data *ldata = tty->disc_data;
- struct pid *tty_pgrp = tty_get_pgrp(tty);
- if (tty_pgrp) {
- kill_pgrp(tty_pgrp, sig, 1);
- put_pid(tty_pgrp);
- }
-+}
-
-- if (!L_NOFLSH(tty)) {
-+static void isig(int sig, struct tty_struct *tty)
-+{
-+ struct n_tty_data *ldata = tty->disc_data;
-+
-+ if (L_NOFLSH(tty)) {
-+ /* signal only */
-+ __isig(sig, tty);
-+
-+ } else { /* signal and flush */
- up_read(&tty->termios_rwsem);
- down_write(&tty->termios_rwsem);
-
-+ __isig(sig, tty);
-+
- /* clear echo buffer */
- mutex_lock(&ldata->output_lock);
- ldata->echo_head = ldata->echo_tail = 0;
-diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c
-index 8825039..01aa52f 100644
---- a/drivers/tty/serial/imx.c
-+++ b/drivers/tty/serial/imx.c
-@@ -1132,11 +1132,6 @@ static int imx_startup(struct uart_port *port)
- while (!(readl(sport->port.membase + UCR2) & UCR2_SRST) && (--i > 0))
- udelay(1);
-
-- /* Can we enable the DMA support? */
-- if (is_imx6q_uart(sport) && !uart_console(port) &&
-- !sport->dma_is_inited)
-- imx_uart_dma_init(sport);
--
- spin_lock_irqsave(&sport->port.lock, flags);
-
- /*
-@@ -1145,9 +1140,6 @@ static int imx_startup(struct uart_port *port)
- writel(USR1_RTSD, sport->port.membase + USR1);
- writel(USR2_ORE, sport->port.membase + USR2);
-
-- if (sport->dma_is_inited && !sport->dma_is_enabled)
-- imx_enable_dma(sport);
--
- temp = readl(sport->port.membase + UCR1);
- temp |= UCR1_RRDYEN | UCR1_RTSDEN | UCR1_UARTEN;
-
-@@ -1318,6 +1310,11 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
- } else {
- ucr2 |= UCR2_CTSC;
- }
-+
-+ /* Can we enable the DMA support? */
-+ if (is_imx6q_uart(sport) && !uart_console(port)
-+ && !sport->dma_is_inited)
-+ imx_uart_dma_init(sport);
- } else {
- termios->c_cflag &= ~CRTSCTS;
- }
-@@ -1434,6 +1431,8 @@ imx_set_termios(struct uart_port *port, struct ktermios *termios,
- if (UART_ENABLE_MS(&sport->port, termios->c_cflag))
- imx_enable_ms(&sport->port);
-
-+ if (sport->dma_is_inited && !sport->dma_is_enabled)
-+ imx_enable_dma(sport);
- spin_unlock_irqrestore(&sport->port.lock, flags);
- }
-
-diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
-index 0b7bb12..ec54044 100644
---- a/drivers/tty/serial/serial_core.c
-+++ b/drivers/tty/serial/serial_core.c
-@@ -1409,7 +1409,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
- mutex_lock(&port->mutex);
- uart_shutdown(tty, state);
- tty_port_tty_set(port, NULL);
-- tty->closing = 0;
-+
- spin_lock_irqsave(&port->lock, flags);
-
- if (port->blocked_open) {
-@@ -1435,6 +1435,7 @@ static void uart_close(struct tty_struct *tty, struct file *filp)
- mutex_unlock(&port->mutex);
-
- tty_ldisc_flush(tty);
-+ tty->closing = 0;
- }
-
- static void uart_wait_until_sent(struct tty_struct *tty, int timeout)
-diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
-index 0827d7c..ee07ba4 100644
---- a/drivers/usb/host/xhci-hub.c
-+++ b/drivers/usb/host/xhci-hub.c
-@@ -484,10 +484,13 @@ static void xhci_hub_report_usb3_link_state(struct xhci_hcd *xhci,
- u32 pls = status_reg & PORT_PLS_MASK;
-
- /* resume state is a xHCI internal state.
-- * Do not report it to usb core.
-+ * Do not report it to usb core, instead, pretend to be U3,
-+ * thus usb core knows it's not ready for transfer
- */
-- if (pls == XDEV_RESUME)
-+ if (pls == XDEV_RESUME) {
-+ *status |= USB_SS_PORT_LS_U3;
- return;
-+ }
-
- /* When the CAS bit is set then warm reset
- * should be performed on port
-@@ -588,7 +591,14 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd,
- status |= USB_PORT_STAT_C_RESET << 16;
- /* USB3.0 only */
- if (hcd->speed == HCD_USB3) {
-- if ((raw_port_status & PORT_PLC))
-+ /* Port link change with port in resume state should not be
-+ * reported to usbcore, as this is an internal state to be
-+ * handled by xhci driver. Reporting PLC to usbcore may
-+ * cause usbcore clearing PLC first and port change event
-+ * irq won't be generated.
-+ */
-+ if ((raw_port_status & PORT_PLC) &&
-+ (raw_port_status & PORT_PLS_MASK) != XDEV_RESUME)
- status |= USB_PORT_STAT_C_LINK_STATE << 16;
- if ((raw_port_status & PORT_WRC))
- status |= USB_PORT_STAT_C_BH_RESET << 16;
-@@ -1120,10 +1130,10 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
- spin_lock_irqsave(&xhci->lock, flags);
-
- if (hcd->self.root_hub->do_remote_wakeup) {
-- if (bus_state->resuming_ports) {
-+ if (bus_state->resuming_ports || /* USB2 */
-+ bus_state->port_remote_wakeup) { /* USB3 */
- spin_unlock_irqrestore(&xhci->lock, flags);
-- xhci_dbg(xhci, "suspend failed because "
-- "a port is resuming\n");
-+ xhci_dbg(xhci, "suspend failed because a port is resuming\n");
- return -EBUSY;
- }
- }
-diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
-index 7d34cbf..d095677 100644
---- a/drivers/usb/host/xhci-ring.c
-+++ b/drivers/usb/host/xhci-ring.c
-@@ -1546,6 +1546,9 @@ static void handle_port_status(struct xhci_hcd *xhci,
- usb_hcd_resume_root_hub(hcd);
- }
-
-+ if (hcd->speed == HCD_USB3 && (temp & PORT_PLS_MASK) == XDEV_INACTIVE)
-+ bus_state->port_remote_wakeup &= ~(1 << faked_port_index);
-+
- if ((temp & PORT_PLC) && (temp & PORT_PLS_MASK) == XDEV_RESUME) {
- xhci_dbg(xhci, "port resume event for port %d\n", port_id);
-
-diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
-index 36bf089..c502c22 100644
---- a/drivers/usb/host/xhci.c
-+++ b/drivers/usb/host/xhci.c
-@@ -3453,6 +3453,9 @@ int xhci_discover_or_reset_device(struct usb_hcd *hcd, struct usb_device *udev)
- return -EINVAL;
- }
-
-+ if (virt_dev->tt_info)
-+ old_active_eps = virt_dev->tt_info->active_eps;
-+
- if (virt_dev->udev != udev) {
- /* If the virt_dev and the udev does not match, this virt_dev
- * may belong to another udev.
-diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
-index 6977f84..0f26dd2 100644
---- a/drivers/usb/host/xhci.h
-+++ b/drivers/usb/host/xhci.h
-@@ -285,6 +285,7 @@ struct xhci_op_regs {
- #define XDEV_U0 (0x0 << 5)
- #define XDEV_U2 (0x2 << 5)
- #define XDEV_U3 (0x3 << 5)
-+#define XDEV_INACTIVE (0x6 << 5)
- #define XDEV_RESUME (0xf << 5)
- /* true: port has power (see HCC_PPC) */
- #define PORT_POWER (1 << 9)
-diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
-index caf1888..87898ca 100644
---- a/drivers/usb/storage/unusual_devs.h
-+++ b/drivers/usb/storage/unusual_devs.h
-@@ -2065,6 +2065,18 @@ UNUSUAL_DEV( 0x1908, 0x3335, 0x0200, 0x0200,
- USB_SC_DEVICE, USB_PR_DEVICE, NULL,
- US_FL_NO_READ_DISC_INFO ),
-
-+/* Reported by Oliver Neukum <oneukum@suse.com>
-+ * This device morphes spontaneously into another device if the access
-+ * pattern of Windows isn't followed. Thus writable media would be dirty
-+ * if the initial instance is used. So the device is limited to its
-+ * virtual CD.
-+ * And yes, the concept that BCD goes up to 9 is not heeded */
-+UNUSUAL_DEV( 0x19d2, 0x1225, 0x0000, 0xffff,
-+ "ZTE,Incorporated",
-+ "ZTE WCDMA Technologies MSM",
-+ USB_SC_DEVICE, USB_PR_DEVICE, NULL,
-+ US_FL_SINGLE_LUN ),
-+
- /* Reported by Sven Geggus <sven-usbst@geggus.net>
- * This encrypted pen drive returns bogus data for the initial READ(10).
- */
-diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
-index 2ee2826..fa49d329 100644
---- a/drivers/vhost/vhost.c
-+++ b/drivers/vhost/vhost.c
-@@ -886,6 +886,7 @@ long vhost_dev_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *argp)
- }
- if (eventfp != d->log_file) {
- filep = d->log_file;
-+ d->log_file = eventfp;
- ctx = d->log_ctx;
- d->log_ctx = eventfp ?
- eventfd_ctx_fileget(eventfp) : NULL;
-diff --git a/fs/dcache.c b/fs/dcache.c
-index 50bb3c2..5d03eb0 100644
---- a/fs/dcache.c
-+++ b/fs/dcache.c
-@@ -642,7 +642,7 @@ static inline bool fast_dput(struct dentry *dentry)
-
- /*
- * If we have a d_op->d_delete() operation, we sould not
-- * let the dentry count go to zero, so use "put__or_lock".
-+ * let the dentry count go to zero, so use "put_or_lock".
- */
- if (unlikely(dentry->d_flags & DCACHE_OP_DELETE))
- return lockref_put_or_lock(&dentry->d_lockref);
-@@ -697,7 +697,7 @@ static inline bool fast_dput(struct dentry *dentry)
- */
- smp_rmb();
- d_flags = ACCESS_ONCE(dentry->d_flags);
-- d_flags &= DCACHE_REFERENCED | DCACHE_LRU_LIST;
-+ d_flags &= DCACHE_REFERENCED | DCACHE_LRU_LIST | DCACHE_DISCONNECTED;
-
- /* Nothing to do? Dropping the reference was all we needed? */
- if (d_flags == (DCACHE_REFERENCED | DCACHE_LRU_LIST) && !d_unhashed(dentry))
-@@ -776,6 +776,9 @@ repeat:
- if (unlikely(d_unhashed(dentry)))
- goto kill_it;
-
-+ if (unlikely(dentry->d_flags & DCACHE_DISCONNECTED))
-+ goto kill_it;
-+
- if (unlikely(dentry->d_flags & DCACHE_OP_DELETE)) {
- if (dentry->d_op->d_delete(dentry))
- goto kill_it;
-diff --git a/fs/namespace.c b/fs/namespace.c
-index 02c6875..fce3cc1 100644
---- a/fs/namespace.c
-+++ b/fs/namespace.c
-@@ -1350,6 +1350,36 @@ enum umount_tree_flags {
- UMOUNT_PROPAGATE = 2,
- UMOUNT_CONNECTED = 4,
- };
-+
-+static bool disconnect_mount(struct mount *mnt, enum umount_tree_flags how)
-+{
-+ /* Leaving mounts connected is only valid for lazy umounts */
-+ if (how & UMOUNT_SYNC)
-+ return true;
-+
-+ /* A mount without a parent has nothing to be connected to */
-+ if (!mnt_has_parent(mnt))
-+ return true;
-+
-+ /* Because the reference counting rules change when mounts are
-+ * unmounted and connected, umounted mounts may not be
-+ * connected to mounted mounts.
-+ */
-+ if (!(mnt->mnt_parent->mnt.mnt_flags & MNT_UMOUNT))
-+ return true;
-+
-+ /* Has it been requested that the mount remain connected? */
-+ if (how & UMOUNT_CONNECTED)
-+ return false;
-+
-+ /* Is the mount locked such that it needs to remain connected? */
-+ if (IS_MNT_LOCKED(mnt))
-+ return false;
-+
-+ /* By default disconnect the mount */
-+ return true;
-+}
-+
- /*
- * mount_lock must be held
- * namespace_sem must be held for write
-@@ -1387,10 +1417,7 @@ static void umount_tree(struct mount *mnt, enum umount_tree_flags how)
- if (how & UMOUNT_SYNC)
- p->mnt.mnt_flags |= MNT_SYNC_UMOUNT;
-
-- disconnect = !(((how & UMOUNT_CONNECTED) &&
-- mnt_has_parent(p) &&
-- (p->mnt_parent->mnt.mnt_flags & MNT_UMOUNT)) ||
-- IS_MNT_LOCKED_AND_LAZY(p));
-+ disconnect = disconnect_mount(p, how);
-
- pin_insert_group(&p->mnt_umount, &p->mnt_parent->mnt,
- disconnect ? &unmounted : NULL);
-@@ -1527,11 +1554,8 @@ void __detach_mounts(struct dentry *dentry)
- while (!hlist_empty(&mp->m_list)) {
- mnt = hlist_entry(mp->m_list.first, struct mount, mnt_mp_list);
- if (mnt->mnt.mnt_flags & MNT_UMOUNT) {
-- struct mount *p, *tmp;
-- list_for_each_entry_safe(p, tmp, &mnt->mnt_mounts, mnt_child) {
-- hlist_add_head(&p->mnt_umount.s_list, &unmounted);
-- umount_mnt(p);
-- }
-+ hlist_add_head(&mnt->mnt_umount.s_list, &unmounted);
-+ umount_mnt(mnt);
- }
- else umount_tree(mnt, UMOUNT_CONNECTED);
- }
-diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c
-index f734562..5d25b9d 100644
---- a/fs/nfs/inode.c
-+++ b/fs/nfs/inode.c
-@@ -1242,9 +1242,11 @@ static int nfs_check_inode_attributes(struct inode *inode, struct nfs_fattr *fat
- if (fattr->valid & NFS_ATTR_FATTR_SIZE) {
- cur_size = i_size_read(inode);
- new_isize = nfs_size_to_loff_t(fattr->size);
-- if (cur_size != new_isize && nfsi->nrequests == 0)
-+ if (cur_size != new_isize)
- invalid |= NFS_INO_INVALID_ATTR|NFS_INO_REVAL_PAGECACHE;
- }
-+ if (nfsi->nrequests != 0)
-+ invalid &= ~NFS_INO_REVAL_PAGECACHE;
-
- /* Have any file permissions changed? */
- if ((fattr->valid & NFS_ATTR_FATTR_MODE) && (inode->i_mode & S_IALLUGO) != (fattr->mode & S_IALLUGO))
-@@ -1682,8 +1684,7 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
- invalid |= NFS_INO_INVALID_ATTR
- | NFS_INO_INVALID_DATA
- | NFS_INO_INVALID_ACCESS
-- | NFS_INO_INVALID_ACL
-- | NFS_INO_REVAL_PAGECACHE;
-+ | NFS_INO_INVALID_ACL;
- if (S_ISDIR(inode->i_mode))
- nfs_force_lookup_revalidate(inode);
- inode->i_version = fattr->change_attr;
-@@ -1715,7 +1716,6 @@ static int nfs_update_inode(struct inode *inode, struct nfs_fattr *fattr)
- if ((nfsi->nrequests == 0) || new_isize > cur_isize) {
- i_size_write(inode, new_isize);
- invalid |= NFS_INO_INVALID_ATTR|NFS_INO_INVALID_DATA;
-- invalid &= ~NFS_INO_REVAL_PAGECACHE;
- }
- dprintk("NFS: isize change on server for file %s/%ld "
- "(%Ld to %Ld)\n",
-diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
-index 55e1e3a..d3f2051 100644
---- a/fs/nfs/nfs4proc.c
-+++ b/fs/nfs/nfs4proc.c
-@@ -1204,12 +1204,15 @@ static bool nfs_need_update_open_stateid(struct nfs4_state *state,
-
- static void nfs_resync_open_stateid_locked(struct nfs4_state *state)
- {
-+ if (!(state->n_wronly || state->n_rdonly || state->n_rdwr))
-+ return;
- if (state->n_wronly)
- set_bit(NFS_O_WRONLY_STATE, &state->flags);
- if (state->n_rdonly)
- set_bit(NFS_O_RDONLY_STATE, &state->flags);
- if (state->n_rdwr)
- set_bit(NFS_O_RDWR_STATE, &state->flags);
-+ set_bit(NFS_OPEN_STATE, &state->flags);
- }
-
- static void nfs_clear_open_stateid_locked(struct nfs4_state *state,
-diff --git a/fs/nfs/pagelist.c b/fs/nfs/pagelist.c
-index 282b393..7b45526 100644
---- a/fs/nfs/pagelist.c
-+++ b/fs/nfs/pagelist.c
-@@ -1110,8 +1110,11 @@ static int nfs_do_recoalesce(struct nfs_pageio_descriptor *desc)
- nfs_list_remove_request(req);
- if (__nfs_pageio_add_request(desc, req))
- continue;
-- if (desc->pg_error < 0)
-+ if (desc->pg_error < 0) {
-+ list_splice_tail(&head, &mirror->pg_list);
-+ mirror->pg_recoalesce = 1;
- return 0;
-+ }
- break;
- }
- } while (mirror->pg_recoalesce);
-diff --git a/fs/pnode.h b/fs/pnode.h
-index 7114ce6..0fcdbe7 100644
---- a/fs/pnode.h
-+++ b/fs/pnode.h
-@@ -20,8 +20,6 @@
- #define SET_MNT_MARK(m) ((m)->mnt.mnt_flags |= MNT_MARKED)
- #define CLEAR_MNT_MARK(m) ((m)->mnt.mnt_flags &= ~MNT_MARKED)
- #define IS_MNT_LOCKED(m) ((m)->mnt.mnt_flags & MNT_LOCKED)
--#define IS_MNT_LOCKED_AND_LAZY(m) \
-- (((m)->mnt.mnt_flags & (MNT_LOCKED|MNT_SYNC_UMOUNT)) == MNT_LOCKED)
-
- #define CL_EXPIRE 0x01
- #define CL_SLAVE 0x02
-diff --git a/fs/xfs/libxfs/xfs_attr_remote.c b/fs/xfs/libxfs/xfs_attr_remote.c
-index 20de88d..dd71403 100644
---- a/fs/xfs/libxfs/xfs_attr_remote.c
-+++ b/fs/xfs/libxfs/xfs_attr_remote.c
-@@ -159,11 +159,10 @@ xfs_attr3_rmt_write_verify(
- struct xfs_buf *bp)
- {
- struct xfs_mount *mp = bp->b_target->bt_mount;
-- struct xfs_buf_log_item *bip = bp->b_fspriv;
-+ int blksize = mp->m_attr_geo->blksize;
- char *ptr;
- int len;
- xfs_daddr_t bno;
-- int blksize = mp->m_attr_geo->blksize;
-
- /* no verification of non-crc buffers */
- if (!xfs_sb_version_hascrc(&mp->m_sb))
-@@ -175,16 +174,22 @@ xfs_attr3_rmt_write_verify(
- ASSERT(len >= blksize);
-
- while (len > 0) {
-+ struct xfs_attr3_rmt_hdr *rmt = (struct xfs_attr3_rmt_hdr *)ptr;
-+
- if (!xfs_attr3_rmt_verify(mp, ptr, blksize, bno)) {
- xfs_buf_ioerror(bp, -EFSCORRUPTED);
- xfs_verifier_error(bp);
- return;
- }
-- if (bip) {
-- struct xfs_attr3_rmt_hdr *rmt;
-
-- rmt = (struct xfs_attr3_rmt_hdr *)ptr;
-- rmt->rm_lsn = cpu_to_be64(bip->bli_item.li_lsn);
-+ /*
-+ * Ensure we aren't writing bogus LSNs to disk. See
-+ * xfs_attr3_rmt_hdr_set() for the explanation.
-+ */
-+ if (rmt->rm_lsn != cpu_to_be64(NULLCOMMITLSN)) {
-+ xfs_buf_ioerror(bp, -EFSCORRUPTED);
-+ xfs_verifier_error(bp);
-+ return;
- }
- xfs_update_cksum(ptr, blksize, XFS_ATTR3_RMT_CRC_OFF);
-
-@@ -221,6 +226,18 @@ xfs_attr3_rmt_hdr_set(
- rmt->rm_owner = cpu_to_be64(ino);
- rmt->rm_blkno = cpu_to_be64(bno);
-
-+ /*
-+ * Remote attribute blocks are written synchronously, so we don't
-+ * have an LSN that we can stamp in them that makes any sense to log
-+ * recovery. To ensure that log recovery handles overwrites of these
-+ * blocks sanely (i.e. once they've been freed and reallocated as some
-+ * other type of metadata) we need to ensure that the LSN has a value
-+ * that tells log recovery to ignore the LSN and overwrite the buffer
-+ * with whatever is in it's log. To do this, we use the magic
-+ * NULLCOMMITLSN to indicate that the LSN is invalid.
-+ */
-+ rmt->rm_lsn = cpu_to_be64(NULLCOMMITLSN);
-+
- return sizeof(struct xfs_attr3_rmt_hdr);
- }
-
-@@ -434,14 +451,21 @@ xfs_attr_rmtval_set(
-
- /*
- * Allocate a single extent, up to the size of the value.
-+ *
-+ * Note that we have to consider this a data allocation as we
-+ * write the remote attribute without logging the contents.
-+ * Hence we must ensure that we aren't using blocks that are on
-+ * the busy list so that we don't overwrite blocks which have
-+ * recently been freed but their transactions are not yet
-+ * committed to disk. If we overwrite the contents of a busy
-+ * extent and then crash then the block may not contain the
-+ * correct metadata after log recovery occurs.
- */
- xfs_bmap_init(args->flist, args->firstblock);
- nmap = 1;
- error = xfs_bmapi_write(args->trans, dp, (xfs_fileoff_t)lblkno,
-- blkcnt,
-- XFS_BMAPI_ATTRFORK | XFS_BMAPI_METADATA,
-- args->firstblock, args->total, &map, &nmap,
-- args->flist);
-+ blkcnt, XFS_BMAPI_ATTRFORK, args->firstblock,
-+ args->total, &map, &nmap, args->flist);
- if (!error) {
- error = xfs_bmap_finish(&args->trans, args->flist,
- &committed);
-diff --git a/fs/xfs/xfs_log_recover.c b/fs/xfs/xfs_log_recover.c
-index 4f5784f..a5d0339 100644
---- a/fs/xfs/xfs_log_recover.c
-+++ b/fs/xfs/xfs_log_recover.c
-@@ -1887,9 +1887,14 @@ xlog_recover_get_buf_lsn(
- uuid = &((struct xfs_dir3_blk_hdr *)blk)->uuid;
- break;
- case XFS_ATTR3_RMT_MAGIC:
-- lsn = be64_to_cpu(((struct xfs_attr3_rmt_hdr *)blk)->rm_lsn);
-- uuid = &((struct xfs_attr3_rmt_hdr *)blk)->rm_uuid;
-- break;
-+ /*
-+ * Remote attr blocks are written synchronously, rather than
-+ * being logged. That means they do not contain a valid LSN
-+ * (i.e. transactionally ordered) in them, and hence any time we
-+ * see a buffer to replay over the top of a remote attribute
-+ * block we should simply do so.
-+ */
-+ goto recover_immediately;
- case XFS_SB_MAGIC:
- lsn = be64_to_cpu(((struct xfs_dsb *)blk)->sb_lsn);
- uuid = &((struct xfs_dsb *)blk)->sb_uuid;
-diff --git a/include/linux/can/skb.h b/include/linux/can/skb.h
-index b6a52a4..51bb653 100644
---- a/include/linux/can/skb.h
-+++ b/include/linux/can/skb.h
-@@ -27,10 +27,12 @@
- /**
- * struct can_skb_priv - private additional data inside CAN sk_buffs
- * @ifindex: ifindex of the first interface the CAN frame appeared on
-+ * @skbcnt: atomic counter to have an unique id together with skb pointer
- * @cf: align to the following CAN frame at skb->data
- */
- struct can_skb_priv {
- int ifindex;
-+ int skbcnt;
- struct can_frame cf[0];
- };
-
-diff --git a/include/linux/cper.h b/include/linux/cper.h
-index 76abba4..dcacb1a 100644
---- a/include/linux/cper.h
-+++ b/include/linux/cper.h
-@@ -340,7 +340,27 @@ struct cper_ia_proc_ctx {
- __u64 mm_reg_addr;
- };
-
--/* Memory Error Section */
-+/* Old Memory Error Section UEFI 2.1, 2.2 */
-+struct cper_sec_mem_err_old {
-+ __u64 validation_bits;
-+ __u64 error_status;
-+ __u64 physical_addr;
-+ __u64 physical_addr_mask;
-+ __u16 node;
-+ __u16 card;
-+ __u16 module;
-+ __u16 bank;
-+ __u16 device;
-+ __u16 row;
-+ __u16 column;
-+ __u16 bit_pos;
-+ __u64 requestor_id;
-+ __u64 responder_id;
-+ __u64 target_id;
-+ __u8 error_type;
-+};
-+
-+/* Memory Error Section UEFI >= 2.3 */
- struct cper_sec_mem_err {
- __u64 validation_bits;
- __u64 error_status;
-diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h
-index 1da6029..6cd8c0e 100644
---- a/include/linux/ftrace.h
-+++ b/include/linux/ftrace.h
-@@ -116,6 +116,7 @@ ftrace_func_t ftrace_ops_get_func(struct ftrace_ops *ops);
- * SAVE_REGS. If another ops with this flag set is already registered
- * for any of the functions that this ops will be registered for, then
- * this ops will fail to register or set_filter_ip.
-+ * PID - Is affected by set_ftrace_pid (allows filtering on those pids)
- */
- enum {
- FTRACE_OPS_FL_ENABLED = 1 << 0,
-@@ -132,6 +133,7 @@ enum {
- FTRACE_OPS_FL_MODIFYING = 1 << 11,
- FTRACE_OPS_FL_ALLOC_TRAMP = 1 << 12,
- FTRACE_OPS_FL_IPMODIFY = 1 << 13,
-+ FTRACE_OPS_FL_PID = 1 << 14,
- };
-
- #ifdef CONFIG_DYNAMIC_FTRACE
-@@ -159,6 +161,7 @@ struct ftrace_ops {
- struct ftrace_ops *next;
- unsigned long flags;
- void *private;
-+ ftrace_func_t saved_func;
- int __percpu *disabled;
- #ifdef CONFIG_DYNAMIC_FTRACE
- int nr_trampolines;
-diff --git a/include/target/iscsi/iscsi_target_core.h b/include/target/iscsi/iscsi_target_core.h
-index 54e7af3..73abbc5 100644
---- a/include/target/iscsi/iscsi_target_core.h
-+++ b/include/target/iscsi/iscsi_target_core.h
-@@ -606,6 +606,7 @@ struct iscsi_conn {
- int bitmap_id;
- int rx_thread_active;
- struct task_struct *rx_thread;
-+ struct completion rx_login_comp;
- int tx_thread_active;
- struct task_struct *tx_thread;
- /* list_head for session connection list */
-diff --git a/kernel/irq/resend.c b/kernel/irq/resend.c
-index 9065107..7a5237a 100644
---- a/kernel/irq/resend.c
-+++ b/kernel/irq/resend.c
-@@ -75,13 +75,21 @@ void check_irq_resend(struct irq_desc *desc, unsigned int irq)
- !desc->irq_data.chip->irq_retrigger(&desc->irq_data)) {
- #ifdef CONFIG_HARDIRQS_SW_RESEND
- /*
-- * If the interrupt has a parent irq and runs
-- * in the thread context of the parent irq,
-- * retrigger the parent.
-+ * If the interrupt is running in the thread
-+ * context of the parent irq we need to be
-+ * careful, because we cannot trigger it
-+ * directly.
- */
-- if (desc->parent_irq &&
-- irq_settings_is_nested_thread(desc))
-+ if (irq_settings_is_nested_thread(desc)) {
-+ /*
-+ * If the parent_irq is valid, we
-+ * retrigger the parent, otherwise we
-+ * do nothing.
-+ */
-+ if (!desc->parent_irq)
-+ return;
- irq = desc->parent_irq;
-+ }
- /* Set it pending and activate the softirq: */
- set_bit(irq, irqs_resend);
- tasklet_schedule(&resend_tasklet);
-diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c
-index 02bece4..eb11011 100644
---- a/kernel/trace/ftrace.c
-+++ b/kernel/trace/ftrace.c
-@@ -98,6 +98,13 @@ struct ftrace_pid {
- struct pid *pid;
- };
-
-+static bool ftrace_pids_enabled(void)
-+{
-+ return !list_empty(&ftrace_pids);
-+}
-+
-+static void ftrace_update_trampoline(struct ftrace_ops *ops);
-+
- /*
- * ftrace_disabled is set when an anomaly is discovered.
- * ftrace_disabled is much stronger than ftrace_enabled.
-@@ -109,7 +116,6 @@ static DEFINE_MUTEX(ftrace_lock);
- static struct ftrace_ops *ftrace_control_list __read_mostly = &ftrace_list_end;
- static struct ftrace_ops *ftrace_ops_list __read_mostly = &ftrace_list_end;
- ftrace_func_t ftrace_trace_function __read_mostly = ftrace_stub;
--ftrace_func_t ftrace_pid_function __read_mostly = ftrace_stub;
- static struct ftrace_ops global_ops;
- static struct ftrace_ops control_ops;
-
-@@ -183,14 +189,7 @@ static void ftrace_pid_func(unsigned long ip, unsigned long parent_ip,
- if (!test_tsk_trace_trace(current))
- return;
-
-- ftrace_pid_function(ip, parent_ip, op, regs);
--}
--
--static void set_ftrace_pid_function(ftrace_func_t func)
--{
-- /* do not set ftrace_pid_function to itself! */
-- if (func != ftrace_pid_func)
-- ftrace_pid_function = func;
-+ op->saved_func(ip, parent_ip, op, regs);
- }
-
- /**
-@@ -202,7 +201,6 @@ static void set_ftrace_pid_function(ftrace_func_t func)
- void clear_ftrace_function(void)
- {
- ftrace_trace_function = ftrace_stub;
-- ftrace_pid_function = ftrace_stub;
- }
-
- static void control_ops_disable_all(struct ftrace_ops *ops)
-@@ -436,6 +434,12 @@ static int __register_ftrace_function(struct ftrace_ops *ops)
- } else
- add_ftrace_ops(&ftrace_ops_list, ops);
-
-+ /* Always save the function, and reset at unregistering */
-+ ops->saved_func = ops->func;
-+
-+ if (ops->flags & FTRACE_OPS_FL_PID && ftrace_pids_enabled())
-+ ops->func = ftrace_pid_func;
-+
- ftrace_update_trampoline(ops);
-
- if (ftrace_enabled)
-@@ -463,15 +467,28 @@ static int __unregister_ftrace_function(struct ftrace_ops *ops)
- if (ftrace_enabled)
- update_ftrace_function();
-
-+ ops->func = ops->saved_func;
-+
- return 0;
- }
-
- static void ftrace_update_pid_func(void)
- {
-+ bool enabled = ftrace_pids_enabled();
-+ struct ftrace_ops *op;
-+
- /* Only do something if we are tracing something */
- if (ftrace_trace_function == ftrace_stub)
- return;
-
-+ do_for_each_ftrace_op(op, ftrace_ops_list) {
-+ if (op->flags & FTRACE_OPS_FL_PID) {
-+ op->func = enabled ? ftrace_pid_func :
-+ op->saved_func;
-+ ftrace_update_trampoline(op);
-+ }
-+ } while_for_each_ftrace_op(op);
-+
- update_ftrace_function();
- }
-
-@@ -1133,7 +1150,8 @@ static struct ftrace_ops global_ops = {
- .local_hash.filter_hash = EMPTY_HASH,
- INIT_OPS_HASH(global_ops)
- .flags = FTRACE_OPS_FL_RECURSION_SAFE |
-- FTRACE_OPS_FL_INITIALIZED,
-+ FTRACE_OPS_FL_INITIALIZED |
-+ FTRACE_OPS_FL_PID,
- };
-
- /*
-@@ -5023,7 +5041,9 @@ static void ftrace_update_trampoline(struct ftrace_ops *ops)
-
- static struct ftrace_ops global_ops = {
- .func = ftrace_stub,
-- .flags = FTRACE_OPS_FL_RECURSION_SAFE | FTRACE_OPS_FL_INITIALIZED,
-+ .flags = FTRACE_OPS_FL_RECURSION_SAFE |
-+ FTRACE_OPS_FL_INITIALIZED |
-+ FTRACE_OPS_FL_PID,
- };
-
- static int __init ftrace_nodyn_init(void)
-@@ -5080,11 +5100,6 @@ void ftrace_init_array_ops(struct trace_array *tr, ftrace_func_t func)
- if (WARN_ON(tr->ops->func != ftrace_stub))
- printk("ftrace ops had %pS for function\n",
- tr->ops->func);
-- /* Only the top level instance does pid tracing */
-- if (!list_empty(&ftrace_pids)) {
-- set_ftrace_pid_function(func);
-- func = ftrace_pid_func;
-- }
- }
- tr->ops->func = func;
- tr->ops->private = tr;
-@@ -5371,7 +5386,7 @@ static void *fpid_start(struct seq_file *m, loff_t *pos)
- {
- mutex_lock(&ftrace_lock);
-
-- if (list_empty(&ftrace_pids) && (!*pos))
-+ if (!ftrace_pids_enabled() && (!*pos))
- return (void *) 1;
-
- return seq_list_start(&ftrace_pids, *pos);
-@@ -5610,6 +5625,7 @@ static struct ftrace_ops graph_ops = {
- .func = ftrace_stub,
- .flags = FTRACE_OPS_FL_RECURSION_SAFE |
- FTRACE_OPS_FL_INITIALIZED |
-+ FTRACE_OPS_FL_PID |
- FTRACE_OPS_FL_STUB,
- #ifdef FTRACE_GRAPH_TRAMP_ADDR
- .trampoline = FTRACE_GRAPH_TRAMP_ADDR,
-diff --git a/lib/dma-debug.c b/lib/dma-debug.c
-index ae4b65e..dace71f 100644
---- a/lib/dma-debug.c
-+++ b/lib/dma-debug.c
-@@ -574,6 +574,9 @@ void debug_dma_assert_idle(struct page *page)
- unsigned long flags;
- phys_addr_t cln;
-
-+ if (dma_debug_disabled())
-+ return;
-+
- if (!page)
- return;
-
-diff --git a/net/can/af_can.c b/net/can/af_can.c
-index 689c818..62c635f 100644
---- a/net/can/af_can.c
-+++ b/net/can/af_can.c
-@@ -89,6 +89,8 @@ struct timer_list can_stattimer; /* timer for statistics update */
- struct s_stats can_stats; /* packet statistics */
- struct s_pstats can_pstats; /* receive list statistics */
-
-+static atomic_t skbcounter = ATOMIC_INIT(0);
-+
- /*
- * af_can socket functions
- */
-@@ -310,12 +312,8 @@ int can_send(struct sk_buff *skb, int loop)
- return err;
- }
-
-- if (newskb) {
-- if (!(newskb->tstamp.tv64))
-- __net_timestamp(newskb);
--
-+ if (newskb)
- netif_rx_ni(newskb);
-- }
-
- /* update statistics */
- can_stats.tx_frames++;
-@@ -683,6 +681,10 @@ static void can_receive(struct sk_buff *skb, struct net_device *dev)
- can_stats.rx_frames++;
- can_stats.rx_frames_delta++;
-
-+ /* create non-zero unique skb identifier together with *skb */
-+ while (!(can_skb_prv(skb)->skbcnt))
-+ can_skb_prv(skb)->skbcnt = atomic_inc_return(&skbcounter);
-+
- rcu_read_lock();
-
- /* deliver the packet to sockets listening on all devices */
-diff --git a/net/can/bcm.c b/net/can/bcm.c
-index b523453..a1ba687 100644
---- a/net/can/bcm.c
-+++ b/net/can/bcm.c
-@@ -261,6 +261,7 @@ static void bcm_can_tx(struct bcm_op *op)
-
- can_skb_reserve(skb);
- can_skb_prv(skb)->ifindex = dev->ifindex;
-+ can_skb_prv(skb)->skbcnt = 0;
-
- memcpy(skb_put(skb, CFSIZ), cf, CFSIZ);
-
-@@ -1217,6 +1218,7 @@ static int bcm_tx_send(struct msghdr *msg, int ifindex, struct sock *sk)
- }
-
- can_skb_prv(skb)->ifindex = dev->ifindex;
-+ can_skb_prv(skb)->skbcnt = 0;
- skb->dev = dev;
- can_skb_set_owner(skb, sk);
- err = can_send(skb, 1); /* send with loopback */
-diff --git a/net/can/raw.c b/net/can/raw.c
-index 31b9748..2e67b14 100644
---- a/net/can/raw.c
-+++ b/net/can/raw.c
-@@ -75,7 +75,7 @@ MODULE_ALIAS("can-proto-1");
- */
-
- struct uniqframe {
-- ktime_t tstamp;
-+ int skbcnt;
- const struct sk_buff *skb;
- unsigned int join_rx_count;
- };
-@@ -133,7 +133,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data)
-
- /* eliminate multiple filter matches for the same skb */
- if (this_cpu_ptr(ro->uniq)->skb == oskb &&
-- ktime_equal(this_cpu_ptr(ro->uniq)->tstamp, oskb->tstamp)) {
-+ this_cpu_ptr(ro->uniq)->skbcnt == can_skb_prv(oskb)->skbcnt) {
- if (ro->join_filters) {
- this_cpu_inc(ro->uniq->join_rx_count);
- /* drop frame until all enabled filters matched */
-@@ -144,7 +144,7 @@ static void raw_rcv(struct sk_buff *oskb, void *data)
- }
- } else {
- this_cpu_ptr(ro->uniq)->skb = oskb;
-- this_cpu_ptr(ro->uniq)->tstamp = oskb->tstamp;
-+ this_cpu_ptr(ro->uniq)->skbcnt = can_skb_prv(oskb)->skbcnt;
- this_cpu_ptr(ro->uniq)->join_rx_count = 1;
- /* drop first frame to check all enabled filters? */
- if (ro->join_filters && ro->count > 1)
-@@ -749,6 +749,7 @@ static int raw_sendmsg(struct socket *sock, struct msghdr *msg, size_t size)
-
- can_skb_reserve(skb);
- can_skb_prv(skb)->ifindex = dev->ifindex;
-+ can_skb_prv(skb)->skbcnt = 0;
-
- err = memcpy_from_msg(skb_put(skb, size), msg, size);
- if (err < 0)
-diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c
-index 29236e8..c09c013 100644
---- a/net/mac80211/debugfs_netdev.c
-+++ b/net/mac80211/debugfs_netdev.c
-@@ -723,6 +723,7 @@ void ieee80211_debugfs_remove_netdev(struct ieee80211_sub_if_data *sdata)
-
- debugfs_remove_recursive(sdata->vif.debugfs_dir);
- sdata->vif.debugfs_dir = NULL;
-+ sdata->debugfs.subdir_stations = NULL;
- }
-
- void ieee80211_debugfs_rename_netdev(struct ieee80211_sub_if_data *sdata)
-diff --git a/net/rds/ib_rdma.c b/net/rds/ib_rdma.c
-index 273b8bf..657ba9f 100644
---- a/net/rds/ib_rdma.c
-+++ b/net/rds/ib_rdma.c
-@@ -759,8 +759,10 @@ void *rds_ib_get_mr(struct scatterlist *sg, unsigned long nents,
- }
-
- ibmr = rds_ib_alloc_fmr(rds_ibdev);
-- if (IS_ERR(ibmr))
-+ if (IS_ERR(ibmr)) {
-+ rds_ib_dev_put(rds_ibdev);
- return ibmr;
-+ }
-
- ret = rds_ib_map_fmr(rds_ibdev, ibmr, sg, nents);
- if (ret == 0)
-diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
-index d126c03..75888dd 100644
---- a/sound/core/pcm_native.c
-+++ b/sound/core/pcm_native.c
-@@ -85,7 +85,7 @@ static DECLARE_RWSEM(snd_pcm_link_rwsem);
- void snd_pcm_stream_lock(struct snd_pcm_substream *substream)
- {
- if (substream->pcm->nonatomic) {
-- down_read(&snd_pcm_link_rwsem);
-+ down_read_nested(&snd_pcm_link_rwsem, SINGLE_DEPTH_NESTING);
- mutex_lock(&substream->self_group.mutex);
- } else {
- read_lock(&snd_pcm_link_rwlock);
-diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
-index c403dd1..44dfc7b 100644
---- a/sound/pci/hda/hda_intel.c
-+++ b/sound/pci/hda/hda_intel.c
-@@ -2056,6 +2056,8 @@ static const struct pci_device_id azx_ids[] = {
- /* ATI HDMI */
- { PCI_DEVICE(0x1002, 0x1308),
- .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
-+ { PCI_DEVICE(0x1002, 0x157a),
-+ .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
- { PCI_DEVICE(0x1002, 0x793b),
- .driver_data = AZX_DRIVER_ATIHDMI | AZX_DCAPS_PRESET_ATI_HDMI },
- { PCI_DEVICE(0x1002, 0x7919),
-@@ -2110,8 +2112,14 @@ static const struct pci_device_id azx_ids[] = {
- .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
- { PCI_DEVICE(0x1002, 0xaab0),
- .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
-+ { PCI_DEVICE(0x1002, 0xaac0),
-+ .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
- { PCI_DEVICE(0x1002, 0xaac8),
- .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
-+ { PCI_DEVICE(0x1002, 0xaad8),
-+ .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
-+ { PCI_DEVICE(0x1002, 0xaae8),
-+ .driver_data = AZX_DRIVER_ATIHDMI_NS | AZX_DCAPS_PRESET_ATI_HDMI_NS },
- /* VIA VT8251/VT8237A */
- { PCI_DEVICE(0x1106, 0x3288),
- .driver_data = AZX_DRIVER_VIA | AZX_DCAPS_POSFIX_VIA },
-diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
-index 5f44f60..225b78b 100644
---- a/sound/pci/hda/patch_hdmi.c
-+++ b/sound/pci/hda/patch_hdmi.c
-@@ -3333,6 +3333,7 @@ static const struct hda_codec_preset snd_hda_preset_hdmi[] = {
- { .id = 0x10de0070, .name = "GPU 70 HDMI/DP", .patch = patch_nvhdmi },
- { .id = 0x10de0071, .name = "GPU 71 HDMI/DP", .patch = patch_nvhdmi },
- { .id = 0x10de0072, .name = "GPU 72 HDMI/DP", .patch = patch_nvhdmi },
-+{ .id = 0x10de007d, .name = "GPU 7d HDMI/DP", .patch = patch_nvhdmi },
- { .id = 0x10de8001, .name = "MCP73 HDMI", .patch = patch_nvhdmi_2ch },
- { .id = 0x11069f80, .name = "VX900 HDMI/DP", .patch = patch_via_hdmi },
- { .id = 0x11069f81, .name = "VX900 HDMI/DP", .patch = patch_via_hdmi },
-@@ -3396,6 +3397,7 @@ MODULE_ALIAS("snd-hda-codec-id:10de0067");
- MODULE_ALIAS("snd-hda-codec-id:10de0070");
- MODULE_ALIAS("snd-hda-codec-id:10de0071");
- MODULE_ALIAS("snd-hda-codec-id:10de0072");
-+MODULE_ALIAS("snd-hda-codec-id:10de007d");
- MODULE_ALIAS("snd-hda-codec-id:10de8001");
- MODULE_ALIAS("snd-hda-codec-id:11069f80");
- MODULE_ALIAS("snd-hda-codec-id:11069f81");
-diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
-index 0e75998..590bcfb0 100644
---- a/sound/pci/hda/patch_realtek.c
-+++ b/sound/pci/hda/patch_realtek.c
-@@ -2224,7 +2224,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
- SND_PCI_QUIRK(0x106b, 0x4300, "iMac 9,1", ALC889_FIXUP_IMAC91_VREF),
- SND_PCI_QUIRK(0x106b, 0x4600, "MacbookPro 5,2", ALC889_FIXUP_IMAC91_VREF),
- SND_PCI_QUIRK(0x106b, 0x4900, "iMac 9,1 Aluminum", ALC889_FIXUP_IMAC91_VREF),
-- SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_IMAC91_VREF),
-+ SND_PCI_QUIRK(0x106b, 0x4a00, "Macbook 5,2", ALC889_FIXUP_MBA11_VREF),
-
- SND_PCI_QUIRK(0x1071, 0x8258, "Evesham Voyaeger", ALC882_FIXUP_EAPD),
- SND_PCI_QUIRK(0x1462, 0x7350, "MSI-7350", ALC889_FIXUP_CD),
-@@ -5004,7 +5004,7 @@ static const struct hda_fixup alc269_fixups[] = {
- { 0x14, 0x90170110 },
- { 0x17, 0x40000008 },
- { 0x18, 0x411111f0 },
-- { 0x19, 0x411111f0 },
-+ { 0x19, 0x01a1913c },
- { 0x1a, 0x411111f0 },
- { 0x1b, 0x411111f0 },
- { 0x1d, 0x40f89b2d },
-@@ -5114,6 +5114,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
- SND_PCI_QUIRK(0x1028, 0x064a, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
- SND_PCI_QUIRK(0x1028, 0x064b, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
- SND_PCI_QUIRK(0x1028, 0x0665, "Dell XPS 13", ALC288_FIXUP_DELL_XPS_13),
-+ SND_PCI_QUIRK(0x1028, 0x069a, "Dell Vostro 5480", ALC290_FIXUP_SUBWOOFER_HSJACK),
- SND_PCI_QUIRK(0x1028, 0x06c7, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE),
- SND_PCI_QUIRK(0x1028, 0x06d9, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
- SND_PCI_QUIRK(0x1028, 0x06da, "Dell", ALC293_FIXUP_DELL1_MIC_NO_PRESENCE),
-@@ -5382,6 +5383,17 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
- {0x1d, 0x40700001},
- {0x21, 0x02211030}),
- SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
-+ {0x12, 0x40000000},
-+ {0x14, 0x90170130},
-+ {0x17, 0x411111f0},
-+ {0x18, 0x411111f0},
-+ {0x19, 0x411111f0},
-+ {0x1a, 0x411111f0},
-+ {0x1b, 0x01014020},
-+ {0x1d, 0x4054c029},
-+ {0x1e, 0x411111f0},
-+ {0x21, 0x0221103f}),
-+ SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL1_MIC_NO_PRESENCE,
- {0x12, 0x90a60160},
- {0x14, 0x90170120},
- {0x17, 0x90170140},
-diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
-index 6c66d7e..25f0f45 100644
---- a/sound/pci/hda/patch_sigmatel.c
-+++ b/sound/pci/hda/patch_sigmatel.c
-@@ -2920,7 +2920,8 @@ static const struct snd_pci_quirk stac92hd83xxx_fixup_tbl[] = {
- SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x148a,
- "HP Mini", STAC_92HD83XXX_HP_LED),
- SND_PCI_QUIRK_VENDOR(PCI_VENDOR_ID_HP, "HP", STAC_92HD83XXX_HP),
-- SND_PCI_QUIRK(PCI_VENDOR_ID_TOSHIBA, 0xfa91,
-+ /* match both for 0xfa91 and 0xfa93 */
-+ SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_TOSHIBA, 0xfffd, 0xfa91,
- "Toshiba Satellite S50D", STAC_92HD83XXX_GPIO10_EAPD),
- {} /* terminator */
- };
-diff --git a/sound/usb/line6/pcm.c b/sound/usb/line6/pcm.c
-index 8461d6b..204cc07 100644
---- a/sound/usb/line6/pcm.c
-+++ b/sound/usb/line6/pcm.c
-@@ -186,12 +186,8 @@ static int line6_stream_start(struct snd_line6_pcm *line6pcm, int direction,
- int ret = 0;
-
- spin_lock_irqsave(&pstr->lock, flags);
-- if (!test_and_set_bit(type, &pstr->running)) {
-- if (pstr->active_urbs || pstr->unlink_urbs) {
-- ret = -EBUSY;
-- goto error;
-- }
--
-+ if (!test_and_set_bit(type, &pstr->running) &&
-+ !(pstr->active_urbs || pstr->unlink_urbs)) {
- pstr->count = 0;
- /* Submit all currently available URBs */
- if (direction == SNDRV_PCM_STREAM_PLAYBACK)
-@@ -199,7 +195,6 @@ static int line6_stream_start(struct snd_line6_pcm *line6pcm, int direction,
- else
- ret = line6_submit_audio_in_all_urbs(line6pcm);
- }
-- error:
- if (ret < 0)
- clear_bit(type, &pstr->running);
- spin_unlock_irqrestore(&pstr->lock, flags);
-diff --git a/sound/usb/mixer_maps.c b/sound/usb/mixer_maps.c
-index e5000da..6a803ef 100644
---- a/sound/usb/mixer_maps.c
-+++ b/sound/usb/mixer_maps.c
-@@ -341,6 +341,20 @@ static const struct usbmix_name_map scms_usb3318_map[] = {
- { 0 }
- };
-
-+/* Bose companion 5, the dB conversion factor is 16 instead of 256 */
-+static struct usbmix_dB_map bose_companion5_dB = {-5006, -6};
-+static struct usbmix_name_map bose_companion5_map[] = {
-+ { 3, NULL, .dB = &bose_companion5_dB },
-+ { 0 } /* terminator */
-+};
-+
-+/* Dragonfly DAC 1.2, the dB conversion factor is 1 instead of 256 */
-+static struct usbmix_dB_map dragonfly_1_2_dB = {0, 5000};
-+static struct usbmix_name_map dragonfly_1_2_map[] = {
-+ { 7, NULL, .dB = &dragonfly_1_2_dB },
-+ { 0 } /* terminator */
-+};
-+
- /*
- * Control map entries
- */
-@@ -451,6 +465,16 @@ static struct usbmix_ctl_map usbmix_ctl_maps[] = {
- .id = USB_ID(0x25c4, 0x0003),
- .map = scms_usb3318_map,
- },
-+ {
-+ /* Bose Companion 5 */
-+ .id = USB_ID(0x05a7, 0x1020),
-+ .map = bose_companion5_map,
-+ },
-+ {
-+ /* Dragonfly DAC 1.2 */
-+ .id = USB_ID(0x21b4, 0x0081),
-+ .map = dragonfly_1_2_map,
-+ },
- { 0 } /* terminator */
- };
-
-diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
-index 2f6d3e9..e475665 100644
---- a/sound/usb/quirks-table.h
-+++ b/sound/usb/quirks-table.h
-@@ -2512,6 +2512,74 @@ YAMAHA_DEVICE(0x7010, "UB99"),
- }
- },
-
-+/* Steinberg devices */
-+{
-+ /* Steinberg MI2 */
-+ USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x2040),
-+ .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
-+ .ifnum = QUIRK_ANY_INTERFACE,
-+ .type = QUIRK_COMPOSITE,
-+ .data = & (const struct snd_usb_audio_quirk[]) {
-+ {
-+ .ifnum = 0,
-+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
-+ },
-+ {
-+ .ifnum = 1,
-+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
-+ },
-+ {
-+ .ifnum = 2,
-+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
-+ },
-+ {
-+ .ifnum = 3,
-+ .type = QUIRK_MIDI_FIXED_ENDPOINT,
-+ .data = &(const struct snd_usb_midi_endpoint_info) {
-+ .out_cables = 0x0001,
-+ .in_cables = 0x0001
-+ }
-+ },
-+ {
-+ .ifnum = -1
-+ }
-+ }
-+ }
-+},
-+{
-+ /* Steinberg MI4 */
-+ USB_DEVICE_VENDOR_SPEC(0x0a4e, 0x4040),
-+ .driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
-+ .ifnum = QUIRK_ANY_INTERFACE,
-+ .type = QUIRK_COMPOSITE,
-+ .data = & (const struct snd_usb_audio_quirk[]) {
-+ {
-+ .ifnum = 0,
-+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
-+ },
-+ {
-+ .ifnum = 1,
-+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
-+ },
-+ {
-+ .ifnum = 2,
-+ .type = QUIRK_AUDIO_STANDARD_INTERFACE
-+ },
-+ {
-+ .ifnum = 3,
-+ .type = QUIRK_MIDI_FIXED_ENDPOINT,
-+ .data = &(const struct snd_usb_midi_endpoint_info) {
-+ .out_cables = 0x0001,
-+ .in_cables = 0x0001
-+ }
-+ },
-+ {
-+ .ifnum = -1
-+ }
-+ }
-+ }
-+},
-+
- /* TerraTec devices */
- {
- USB_DEVICE_VENDOR_SPEC(0x0ccd, 0x0012),
-diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
-index 995b7a8..658b0a8 100644
---- a/tools/perf/ui/browsers/hists.c
-+++ b/tools/perf/ui/browsers/hists.c
-@@ -45,7 +45,7 @@ static struct rb_node *hists__filter_entries(struct rb_node *nd,
-
- static bool hist_browser__has_filter(struct hist_browser *hb)
- {
-- return hists__has_filter(hb->hists) || hb->min_pcnt;
-+ return hists__has_filter(hb->hists) || hb->min_pcnt || symbol_conf.has_filter;
- }
-
- static int hist_browser__get_folding(struct hist_browser *browser)
-diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
-index 201f6c4c..99378a5 100644
---- a/tools/perf/util/symbol.c
-+++ b/tools/perf/util/symbol.c
-@@ -1893,6 +1893,8 @@ int setup_intlist(struct intlist **list, const char *list_str,
- pr_err("problems parsing %s list\n", list_name);
- return -1;
- }
-+
-+ symbol_conf.has_filter = true;
- return 0;
- }
-
-diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
-index 0956150..be02179 100644
---- a/tools/perf/util/symbol.h
-+++ b/tools/perf/util/symbol.h
-@@ -105,7 +105,8 @@ struct symbol_conf {
- demangle_kernel,
- filter_relative,
- show_hist_headers,
-- branch_callstack;
-+ branch_callstack,
-+ has_filter;
- const char *vmlinux_name,
- *kallsyms_name,
- *source_prefix,