commit:     488850749b4c4278a1faeeeca07f65803e067e75
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Mon Feb 15 19:19:54 2016 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Mon Feb 15 19:19:54 2016 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=48885074

Linux patch 3.12.54

 0000_README              |    4 +
 1053_linux-3.12.54.patch | 2174 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 2178 insertions(+)

diff --git a/0000_README b/0000_README
index 27b9211..54bac92 100644
--- a/0000_README
+++ b/0000_README
@@ -254,6 +254,10 @@ Patch:  1052_linux-3.12.53.patch
 From:   http://www.kernel.org
 Desc:   Linux 3.12.53
 
+Patch:  1053_linux-3.12.54.patch
+From:   http://www.kernel.org
+Desc:   Linux 3.12.54
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1053_linux-3.12.54.patch b/1053_linux-3.12.54.patch
new file mode 100644
index 0000000..4045383
--- /dev/null
+++ b/1053_linux-3.12.54.patch
@@ -0,0 +1,2174 @@
+diff --git a/Makefile b/Makefile
+index 3a572ff5b8e3..0d86c6da7d7e 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,6 +1,6 @@
+ VERSION = 3
+ PATCHLEVEL = 12
+-SUBLEVEL = 53
++SUBLEVEL = 54
+ EXTRAVERSION =
+ NAME = One Giant Leap for Frogkind
+ 
+diff --git a/arch/arm/include/asm/ftrace.h b/arch/arm/include/asm/ftrace.h
+index f89515adac60..2bb8cac28b9e 100644
+--- a/arch/arm/include/asm/ftrace.h
++++ b/arch/arm/include/asm/ftrace.h
+@@ -45,7 +45,7 @@ void *return_address(unsigned int);
+ 
+ #else
+ 
+-extern inline void *return_address(unsigned int level)
++static inline void *return_address(unsigned int level)
+ {
+       return NULL;
+ }
+diff --git a/arch/arm/kernel/return_address.c 
b/arch/arm/kernel/return_address.c
+index fafedd86885d..98ea4b7eb406 100644
+--- a/arch/arm/kernel/return_address.c
++++ b/arch/arm/kernel/return_address.c
+@@ -59,15 +59,6 @@ void *return_address(unsigned int level)
+ 
+ #else /* if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) */
+ 
+-#if defined(CONFIG_ARM_UNWIND)
+-#warning "TODO: return_address should use unwind tables"
+-#endif
+-
+-void *return_address(unsigned int level)
+-{
+-      return NULL;
+-}
+-
+ #endif /* if defined(CONFIG_FRAME_POINTER) && !defined(CONFIG_ARM_UNWIND) / 
else */
+ 
+ EXPORT_SYMBOL_GPL(return_address);
+diff --git a/arch/arm64/include/asm/kvm_emulate.h 
b/arch/arm64/include/asm/kvm_emulate.h
+index 2b01e2bdb7ef..a79bcce9b66d 100644
+--- a/arch/arm64/include/asm/kvm_emulate.h
++++ b/arch/arm64/include/asm/kvm_emulate.h
+@@ -86,11 +86,13 @@ static inline void vcpu_set_thumb(struct kvm_vcpu *vcpu)
+       *vcpu_cpsr(vcpu) |= COMPAT_PSR_T_BIT;
+ }
+ 
++/*
++ * vcpu_reg should always be passed a register number coming from a
++ * read of ESR_EL2. Otherwise, it may give the wrong result on AArch32
++ * with banked registers.
++ */
+ static inline unsigned long *vcpu_reg(const struct kvm_vcpu *vcpu, u8 reg_num)
+ {
+-      if (vcpu_mode_is_32bit(vcpu))
+-              return vcpu_reg32(vcpu, reg_num);
+-
+       return (unsigned long *)&vcpu_gp_regs(vcpu)->regs.regs[reg_num];
+ }
+ 
+diff --git a/arch/arm64/kernel/ptrace.c b/arch/arm64/kernel/ptrace.c
+index ee79a1a6e965..9b9d651446ba 100644
+--- a/arch/arm64/kernel/ptrace.c
++++ b/arch/arm64/kernel/ptrace.c
+@@ -51,6 +51,12 @@
+  */
+ void ptrace_disable(struct task_struct *child)
+ {
++      /*
++       * This would be better off in core code, but PTRACE_DETACH has
++       * grown its fair share of arch-specific worts and changing it
++       * is likely to cause regressions on obscure architectures.
++       */
++      user_disable_single_step(child);
+ }
+ 
+ #ifdef CONFIG_HAVE_HW_BREAKPOINT
+diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
+index 24bf1563c3bd..59411c933393 100644
+--- a/arch/arm64/kernel/setup.c
++++ b/arch/arm64/kernel/setup.c
+@@ -365,6 +365,10 @@ static int c_show(struct seq_file *m, void *v)
+               seq_printf(m, "processor\t: %d\n", i);
+ #endif
+ 
++              seq_printf(m, "BogoMIPS\t: %lu.%02lu\n",
++                         loops_per_jiffy / (500000UL/HZ),
++                         loops_per_jiffy / (5000UL/HZ) % 100);
++
+               /*
+                * Dump out the common processor features in a single line.
+                * Userspace should read the hwcaps with getauxval(AT_HWCAP)
+diff --git a/arch/arm64/kvm/inject_fault.c b/arch/arm64/kvm/inject_fault.c
+index 86825f8883de..f527a37ac979 100644
+--- a/arch/arm64/kvm/inject_fault.c
++++ b/arch/arm64/kvm/inject_fault.c
+@@ -48,7 +48,7 @@ static void prepare_fault32(struct kvm_vcpu *vcpu, u32 mode, 
u32 vect_offset)
+ 
+       /* Note: These now point to the banked copies */
+       *vcpu_spsr(vcpu) = new_spsr_value;
+-      *vcpu_reg(vcpu, 14) = *vcpu_pc(vcpu) + return_offset;
++      *vcpu_reg32(vcpu, 14) = *vcpu_pc(vcpu) + return_offset;
+ 
+       /* Branch to exception vector */
+       if (sctlr & (1 << 13))
+diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c
+index f8dc7e8fce6f..84ddb372fbc6 100644
+--- a/arch/arm64/mm/mmu.c
++++ b/arch/arm64/mm/mmu.c
+@@ -374,6 +374,9 @@ void __init paging_init(void)
+ 
+       empty_zero_page = virt_to_page(zero_page);
+ 
++      /* Ensure the zero page is visible to the page table walker */
++      dsb();
++
+       /*
+        * TTBR0 is only used for the identity mapping at this stage. Make it
+        * point to zero page to avoid speculatively fetching new entries.
+diff --git a/arch/mn10300/Kconfig b/arch/mn10300/Kconfig
+index 6aaa1607001a..c61bf144b8f2 100644
+--- a/arch/mn10300/Kconfig
++++ b/arch/mn10300/Kconfig
+@@ -1,6 +1,7 @@
+ config MN10300
+       def_bool y
+       select HAVE_OPROFILE
++      select HAVE_UID16
+       select GENERIC_IRQ_SHOW
+       select ARCH_WANT_IPC_PARSE_VERSION
+       select HAVE_ARCH_TRACEHOOK
+@@ -37,9 +38,6 @@ config HIGHMEM
+ config NUMA
+       def_bool n
+ 
+-config UID16
+-      def_bool y
+-
+ config RWSEM_GENERIC_SPINLOCK
+       def_bool y
+ 
+diff --git a/arch/openrisc/Kconfig b/arch/openrisc/Kconfig
+index 9488209a5253..191cd8e8b5da 100644
+--- a/arch/openrisc/Kconfig
++++ b/arch/openrisc/Kconfig
+@@ -16,6 +16,7 @@ config OPENRISC
+       select GENERIC_IRQ_SHOW
+       select GENERIC_IOMAP
+       select GENERIC_CPU_DEVICES
++      select HAVE_UID16
+       select GENERIC_ATOMIC64
+       select GENERIC_CLOCKEVENTS
+       select GENERIC_STRNCPY_FROM_USER
+@@ -29,9 +30,6 @@ config MMU
+ config HAVE_DMA_ATTRS
+       def_bool y
+ 
+-config UID16
+-      def_bool y
+-
+ config RWSEM_GENERIC_SPINLOCK
+       def_bool y
+ 
+diff --git a/arch/powerpc/include/asm/cmpxchg.h 
b/arch/powerpc/include/asm/cmpxchg.h
+index e245aab7f191..95b515113186 100644
+--- a/arch/powerpc/include/asm/cmpxchg.h
++++ b/arch/powerpc/include/asm/cmpxchg.h
+@@ -18,12 +18,12 @@ __xchg_u32(volatile void *p, unsigned long val)
+       unsigned long prev;
+ 
+       __asm__ __volatile__(
+-      PPC_RELEASE_BARRIER
++      PPC_ATOMIC_ENTRY_BARRIER
+ "1:   lwarx   %0,0,%2 \n"
+       PPC405_ERR77(0,%2)
+ "     stwcx.  %3,0,%2 \n\
+       bne-    1b"
+-      PPC_ACQUIRE_BARRIER
++      PPC_ATOMIC_EXIT_BARRIER
+       : "=&r" (prev), "+m" (*(volatile unsigned int *)p)
+       : "r" (p), "r" (val)
+       : "cc", "memory");
+@@ -61,12 +61,12 @@ __xchg_u64(volatile void *p, unsigned long val)
+       unsigned long prev;
+ 
+       __asm__ __volatile__(
+-      PPC_RELEASE_BARRIER
++      PPC_ATOMIC_ENTRY_BARRIER
+ "1:   ldarx   %0,0,%2 \n"
+       PPC405_ERR77(0,%2)
+ "     stdcx.  %3,0,%2 \n\
+       bne-    1b"
+-      PPC_ACQUIRE_BARRIER
++      PPC_ATOMIC_EXIT_BARRIER
+       : "=&r" (prev), "+m" (*(volatile unsigned long *)p)
+       : "r" (p), "r" (val)
+       : "cc", "memory");
+@@ -152,14 +152,14 @@ __cmpxchg_u32(volatile unsigned int *p, unsigned long 
old, unsigned long new)
+       unsigned int prev;
+ 
+       __asm__ __volatile__ (
+-      PPC_RELEASE_BARRIER
++      PPC_ATOMIC_ENTRY_BARRIER
+ "1:   lwarx   %0,0,%2         # __cmpxchg_u32\n\
+       cmpw    0,%0,%3\n\
+       bne-    2f\n"
+       PPC405_ERR77(0,%2)
+ "     stwcx.  %4,0,%2\n\
+       bne-    1b"
+-      PPC_ACQUIRE_BARRIER
++      PPC_ATOMIC_EXIT_BARRIER
+       "\n\
+ 2:"
+       : "=&r" (prev), "+m" (*p)
+@@ -198,13 +198,13 @@ __cmpxchg_u64(volatile unsigned long *p, unsigned long 
old, unsigned long new)
+       unsigned long prev;
+ 
+       __asm__ __volatile__ (
+-      PPC_RELEASE_BARRIER
++      PPC_ATOMIC_ENTRY_BARRIER
+ "1:   ldarx   %0,0,%2         # __cmpxchg_u64\n\
+       cmpd    0,%0,%3\n\
+       bne-    2f\n\
+       stdcx.  %4,0,%2\n\
+       bne-    1b"
+-      PPC_ACQUIRE_BARRIER
++      PPC_ATOMIC_EXIT_BARRIER
+       "\n\
+ 2:"
+       : "=&r" (prev), "+m" (*p)
+diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
+index 390e09872b77..3ce6b7b5ca19 100644
+--- a/arch/powerpc/include/asm/reg.h
++++ b/arch/powerpc/include/asm/reg.h
+@@ -108,6 +108,7 @@
+ #define MSR_TS_T      __MASK(MSR_TS_T_LG)     /*  Transaction Transactional */
+ #define MSR_TS_MASK   (MSR_TS_T | MSR_TS_S)   /* Transaction State bits */
+ #define MSR_TM_ACTIVE(x) (((x) & MSR_TS_MASK) != 0) /* Transaction active? */
++#define MSR_TM_RESV(x) (((x) & MSR_TS_MASK) == MSR_TS_MASK) /* Reserved */
+ #define MSR_TM_TRANSACTIONAL(x)       (((x) & MSR_TS_MASK) == MSR_TS_T)
+ #define MSR_TM_SUSPENDED(x)   (((x) & MSR_TS_MASK) == MSR_TS_S)
+ 
+diff --git a/arch/powerpc/include/asm/synch.h 
b/arch/powerpc/include/asm/synch.h
+index e682a7143edb..c50868681f9e 100644
+--- a/arch/powerpc/include/asm/synch.h
++++ b/arch/powerpc/include/asm/synch.h
+@@ -44,7 +44,7 @@ static inline void isync(void)
+       MAKE_LWSYNC_SECTION_ENTRY(97, __lwsync_fixup);
+ #define PPC_ACQUIRE_BARRIER    "\n" stringify_in_c(__PPC_ACQUIRE_BARRIER)
+ #define PPC_RELEASE_BARRIER    stringify_in_c(LWSYNC) "\n"
+-#define PPC_ATOMIC_ENTRY_BARRIER "\n" stringify_in_c(LWSYNC) "\n"
++#define PPC_ATOMIC_ENTRY_BARRIER "\n" stringify_in_c(sync) "\n"
+ #define PPC_ATOMIC_EXIT_BARRIER        "\n" stringify_in_c(sync) "\n"
+ #else
+ #define PPC_ACQUIRE_BARRIER
+diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
+index 7fce77b89f6d..3678e5097c59 100644
+--- a/arch/powerpc/kernel/signal_32.c
++++ b/arch/powerpc/kernel/signal_32.c
+@@ -867,6 +867,15 @@ static long restore_tm_user_regs(struct pt_regs *regs,
+               return 1;
+ #endif /* CONFIG_SPE */
+ 
++      /* Get the top half of the MSR from the user context */
++      if (__get_user(msr_hi, &tm_sr->mc_gregs[PT_MSR]))
++              return 1;
++      msr_hi <<= 32;
++      /* If TM bits are set to the reserved value, it's an invalid context */
++      if (MSR_TM_RESV(msr_hi))
++              return 1;
++      /* Pull in the MSR TM bits from the user context */
++      regs->msr = (regs->msr & ~MSR_TS_MASK) | (msr_hi & MSR_TS_MASK);
+       /* Now, recheckpoint.  This loads up all of the checkpointed (older)
+        * registers, including FP and V[S]Rs.  After recheckpointing, the
+        * transactional versions should be loaded.
+@@ -876,11 +885,6 @@ static long restore_tm_user_regs(struct pt_regs *regs,
+       current->thread.tm_texasr |= TEXASR_FS;
+       /* This loads the checkpointed FP/VEC state, if used */
+       tm_recheckpoint(&current->thread, msr);
+-      /* Get the top half of the MSR */
+-      if (__get_user(msr_hi, &tm_sr->mc_gregs[PT_MSR]))
+-              return 1;
+-      /* Pull in MSR TM from user context */
+-      regs->msr = (regs->msr & ~MSR_TS_MASK) | ((msr_hi<<32) & MSR_TS_MASK);
+ 
+       /* This loads the speculative FP/VEC state, if used */
+       if (msr & MSR_FP) {
+diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
+index 4456779dba1c..1c43da49fb1c 100644
+--- a/arch/powerpc/kernel/signal_64.c
++++ b/arch/powerpc/kernel/signal_64.c
+@@ -420,6 +420,10 @@ static long restore_tm_sigcontexts(struct pt_regs *regs,
+ 
+       /* get MSR separately, transfer the LE bit if doing signal return */
+       err |= __get_user(msr, &sc->gp_regs[PT_MSR]);
++      /* Don't allow reserved mode. */
++      if (MSR_TM_RESV(msr))
++              return -EINVAL;
++
+       /* pull in MSR TM from user context */
+       regs->msr = (regs->msr & ~MSR_TS_MASK) | (msr & MSR_TS_MASK);
+ 
+diff --git a/arch/x86/include/asm/vvar.h b/arch/x86/include/asm/vvar.h
+index d76ac40da206..9fb01a91c013 100644
+--- a/arch/x86/include/asm/vvar.h
++++ b/arch/x86/include/asm/vvar.h
+@@ -30,7 +30,7 @@
+ #else
+ 
+ #define DECLARE_VVAR(offset, type, name)                              \
+-      static type const * const vvaraddr_ ## name =                   \
++      static type const * const vvaraddr_ ## name __maybe_unused =    \
+               (void *)(VVAR_ADDRESS + (offset));
+ 
+ #define DEFINE_VVAR(type, name)                                               
\
+diff --git a/crypto/algif_hash.c b/crypto/algif_hash.c
+index 850246206b12..a68b56a368a8 100644
+--- a/crypto/algif_hash.c
++++ b/crypto/algif_hash.c
+@@ -192,9 +192,14 @@ static int hash_accept(struct socket *sock, struct socket 
*newsock, int flags)
+       struct sock *sk2;
+       struct alg_sock *ask2;
+       struct hash_ctx *ctx2;
++      bool more;
+       int err;
+ 
+-      err = crypto_ahash_export(req, state);
++      lock_sock(sk);
++      more = ctx->more;
++      err = more ? crypto_ahash_export(req, state) : 0;
++      release_sock(sk);
++
+       if (err)
+               return err;
+ 
+@@ -205,7 +210,10 @@ static int hash_accept(struct socket *sock, struct socket 
*newsock, int flags)
+       sk2 = newsock->sk;
+       ask2 = alg_sk(sk2);
+       ctx2 = ask2->private;
+-      ctx2->more = 1;
++      ctx2->more = more;
++
++      if (!more)
++              return err;
+ 
+       err = crypto_ahash_import(&ctx2->req, state);
+       if (err) {
+diff --git a/drivers/base/memory.c b/drivers/base/memory.c
+index bece691cb5d9..3e2a3059b1f8 100644
+--- a/drivers/base/memory.c
++++ b/drivers/base/memory.c
+@@ -311,6 +311,10 @@ static int memory_subsys_offline(struct device *dev)
+       if (mem->state == MEM_OFFLINE)
+               return 0;
+ 
++      /* Can't offline block with non-present sections */
++      if (mem->section_count != sections_per_block)
++              return -EINVAL;
++
+       return memory_block_change_state(mem, MEM_OFFLINE, MEM_ONLINE);
+ }
+ 
+diff --git a/drivers/connector/connector.c b/drivers/connector/connector.c
+index fb1bad083aa9..12e737e0a5af 100644
+--- a/drivers/connector/connector.c
++++ b/drivers/connector/connector.c
+@@ -160,26 +160,21 @@ static int cn_call_callback(struct sk_buff *skb)
+  *
+  * It checks skb, netlink header and msg sizes, and calls callback helper.
+  */
+-static void cn_rx_skb(struct sk_buff *__skb)
++static void cn_rx_skb(struct sk_buff *skb)
+ {
+       struct nlmsghdr *nlh;
+-      struct sk_buff *skb;
+       int len, err;
+ 
+-      skb = skb_get(__skb);
+-
+       if (skb->len >= NLMSG_HDRLEN) {
+               nlh = nlmsg_hdr(skb);
+               len = nlmsg_len(nlh);
+ 
+               if (len < (int)sizeof(struct cn_msg) ||
+                   skb->len < nlh->nlmsg_len ||
+-                  len > CONNECTOR_MAX_MSG_SIZE) {
+-                      kfree_skb(skb);
++                  len > CONNECTOR_MAX_MSG_SIZE)
+                       return;
+-              }
+ 
+-              err = cn_call_callback(skb);
++              err = cn_call_callback(skb_get(skb));
+               if (err < 0)
+                       kfree_skb(skb);
+       }
+diff --git a/drivers/gpu/drm/radeon/cypress_dpm.c 
b/drivers/gpu/drm/radeon/cypress_dpm.c
+index 7143783fb237..b5a00771f27a 100644
+--- a/drivers/gpu/drm/radeon/cypress_dpm.c
++++ b/drivers/gpu/drm/radeon/cypress_dpm.c
+@@ -299,7 +299,9 @@ void cypress_program_response_times(struct radeon_device 
*rdev)
+ static int cypress_pcie_performance_request(struct radeon_device *rdev,
+                                           u8 perf_req, bool advertise)
+ {
++#if defined(CONFIG_ACPI)
+       struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
++#endif
+       u32 tmp;
+ 
+       udelay(10);
+diff --git a/drivers/gpu/drm/radeon/ni_dpm.c b/drivers/gpu/drm/radeon/ni_dpm.c
+index 85f36e702595..89bdc12adebb 100644
+--- a/drivers/gpu/drm/radeon/ni_dpm.c
++++ b/drivers/gpu/drm/radeon/ni_dpm.c
+@@ -3445,9 +3445,9 @@ static int ni_enable_smc_cac(struct radeon_device *rdev,
+ static int ni_pcie_performance_request(struct radeon_device *rdev,
+                                      u8 perf_req, bool advertise)
+ {
++#if defined(CONFIG_ACPI)
+       struct evergreen_power_info *eg_pi = evergreen_get_pi(rdev);
+ 
+-#if defined(CONFIG_ACPI)
+       if ((perf_req == PCIE_PERF_REQ_PECI_GEN1) ||
+             (perf_req == PCIE_PERF_REQ_PECI_GEN2)) {
+               if (eg_pi->pcie_performance_request_registered == false)
+diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c
+index 85b0da8c33f4..7ca1b4a97a14 100644
+--- a/drivers/hid/hid-core.c
++++ b/drivers/hid/hid-core.c
+@@ -1514,7 +1514,7 @@ int hid_connect(struct hid_device *hdev, unsigned int 
connect_mask)
+               "Multi-Axis Controller"
+       };
+       const char *type, *bus;
+-      char buf[64];
++      char buf[64] = "";
+       unsigned int i;
+       int len;
+       int ret;
+diff --git a/drivers/hid/usbhid/hid-core.c b/drivers/hid/usbhid/hid-core.c
+index f44be51e261d..183a3e9b1ccc 100644
+--- a/drivers/hid/usbhid/hid-core.c
++++ b/drivers/hid/usbhid/hid-core.c
+@@ -492,8 +492,6 @@ static void hid_ctrl(struct urb *urb)
+       struct usbhid_device *usbhid = hid->driver_data;
+       int unplug = 0, status = urb->status;
+ 
+-      spin_lock(&usbhid->lock);
+-
+       switch (status) {
+       case 0:                 /* success */
+               if (usbhid->ctrl[usbhid->ctrltail].dir == USB_DIR_IN)
+@@ -513,6 +511,8 @@ static void hid_ctrl(struct urb *urb)
+               hid_warn(urb->dev, "ctrl urb status %d received\n", status);
+       }
+ 
++      spin_lock(&usbhid->lock);
++
+       if (unplug) {
+               usbhid->ctrltail = usbhid->ctrlhead;
+       } else {
+diff --git a/drivers/infiniband/hw/cxgb4/mem.c 
b/drivers/infiniband/hw/cxgb4/mem.c
+index 4cb8eb24497c..a80503b3795c 100644
+--- a/drivers/infiniband/hw/cxgb4/mem.c
++++ b/drivers/infiniband/hw/cxgb4/mem.c
+@@ -76,7 +76,7 @@ static int _c4iw_write_mem_dma_aligned(struct c4iw_rdev 
*rdev, u32 addr,
+       INIT_ULPTX_WR(req, wr_len, 0, 0);
+       req->wr.wr_hi = cpu_to_be32(FW_WR_OP(FW_ULPTX_WR) |
+                       (wait ? FW_WR_COMPL(1) : 0));
+-      req->wr.wr_lo = wait ? (__force __be64)&wr_wait : 0;
++      req->wr.wr_lo = wait ? (__force __be64)(unsigned long) &wr_wait : 0L;
+       req->wr.wr_mid = cpu_to_be32(FW_WR_LEN16(DIV_ROUND_UP(wr_len, 16)));
+       req->cmd = cpu_to_be32(ULPTX_CMD(ULP_TX_MEM_WRITE));
+       req->cmd |= cpu_to_be32(V_T5_ULP_MEMIO_ORDER(1));
+diff --git a/drivers/isdn/hardware/mISDN/mISDNipac.c 
b/drivers/isdn/hardware/mISDN/mISDNipac.c
+index ccd7d851be26..a77eea594b69 100644
+--- a/drivers/isdn/hardware/mISDN/mISDNipac.c
++++ b/drivers/isdn/hardware/mISDN/mISDNipac.c
+@@ -754,10 +754,10 @@ dbusy_timer_handler(struct isac_hw *isac)
+ }
+ 
+ static int
+-open_dchannel(struct isac_hw *isac, struct channel_req *rq)
++open_dchannel_caller(struct isac_hw *isac, struct channel_req *rq, void 
*caller)
+ {
+       pr_debug("%s: %s dev(%d) open from %p\n", isac->name, __func__,
+-               isac->dch.dev.id, __builtin_return_address(1));
++               isac->dch.dev.id, caller);
+       if (rq->protocol != ISDN_P_TE_S0)
+               return -EINVAL;
+       if (rq->adr.channel == 1)
+@@ -771,6 +771,12 @@ open_dchannel(struct isac_hw *isac, struct channel_req 
*rq)
+       return 0;
+ }
+ 
++static int
++open_dchannel(struct isac_hw *isac, struct channel_req *rq)
++{
++      return open_dchannel_caller(isac, rq, __builtin_return_address(0));
++}
++
+ static const char *ISACVer[] =
+ {"2086/2186 V1.1", "2085 B1", "2085 B2",
+  "2085 V2.3"};
+@@ -1548,7 +1554,7 @@ ipac_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
+       case OPEN_CHANNEL:
+               rq = arg;
+               if (rq->protocol == ISDN_P_TE_S0)
+-                      err = open_dchannel(isac, rq);
++                      err = open_dchannel_caller(isac, rq, 
__builtin_return_address(0));
+               else
+                       err = open_bchannel(ipac, rq);
+               if (err)
+diff --git a/drivers/isdn/hardware/mISDN/w6692.c 
b/drivers/isdn/hardware/mISDN/w6692.c
+index de69f6828c76..741675525b53 100644
+--- a/drivers/isdn/hardware/mISDN/w6692.c
++++ b/drivers/isdn/hardware/mISDN/w6692.c
+@@ -1176,10 +1176,10 @@ w6692_l1callback(struct dchannel *dch, u32 cmd)
+ }
+ 
+ static int
+-open_dchannel(struct w6692_hw *card, struct channel_req *rq)
++open_dchannel(struct w6692_hw *card, struct channel_req *rq, void *caller)
+ {
+       pr_debug("%s: %s dev(%d) open from %p\n", card->name, __func__,
+-               card->dch.dev.id, __builtin_return_address(1));
++               card->dch.dev.id, caller);
+       if (rq->protocol != ISDN_P_TE_S0)
+               return -EINVAL;
+       if (rq->adr.channel == 1)
+@@ -1207,7 +1207,7 @@ w6692_dctrl(struct mISDNchannel *ch, u32 cmd, void *arg)
+       case OPEN_CHANNEL:
+               rq = arg;
+               if (rq->protocol == ISDN_P_TE_S0)
+-                      err = open_dchannel(card, rq);
++                      err = open_dchannel(card, rq, 
__builtin_return_address(0));
+               else
+                       err = open_bchannel(card, rq);
+               if (err)
+diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
+index 5ff934102f30..d14d1c1fff8b 100644
+--- a/drivers/md/dm-thin.c
++++ b/drivers/md/dm-thin.c
+@@ -2331,7 +2331,7 @@ static void pool_postsuspend(struct dm_target *ti)
+       struct pool_c *pt = ti->private;
+       struct pool *pool = pt->pool;
+ 
+-      cancel_delayed_work(&pool->waker);
++      cancel_delayed_work_sync(&pool->waker);
+       flush_workqueue(pool->wq);
+       (void) commit(pool);
+ }
+diff --git a/drivers/md/persistent-data/dm-btree.c 
b/drivers/md/persistent-data/dm-btree.c
+index fc3d733aab1c..28662bd600e0 100644
+--- a/drivers/md/persistent-data/dm-btree.c
++++ b/drivers/md/persistent-data/dm-btree.c
+@@ -471,8 +471,10 @@ static int btree_split_sibling(struct shadow_spine *s, 
dm_block_t root,
+ 
+       r = insert_at(sizeof(__le64), pn, parent_index + 1,
+                     le64_to_cpu(rn->keys[0]), &location);
+-      if (r)
++      if (r) {
++              unlock_block(s->info, right);
+               return r;
++      }
+ 
+       if (key < le64_to_cpu(rn->keys[0])) {
+               unlock_block(s->info, right);
+diff --git a/drivers/misc/lkdtm.c b/drivers/misc/lkdtm.c
+index 9cbd0370ca44..482344242f94 100644
+--- a/drivers/misc/lkdtm.c
++++ b/drivers/misc/lkdtm.c
+@@ -49,8 +49,19 @@
+ #include <linux/ide.h>
+ #endif
+ 
++/*
++ * Make sure our attempts to over run the kernel stack doesn't trigger
++ * a compiler warning when CONFIG_FRAME_WARN is set. Then make sure we
++ * recurse past the end of THREAD_SIZE by default.
++ */
++#if defined(CONFIG_FRAME_WARN) && (CONFIG_FRAME_WARN > 0)
++#define REC_STACK_SIZE (CONFIG_FRAME_WARN / 2)
++#else
++#define REC_STACK_SIZE (THREAD_SIZE / 8)
++#endif
++#define REC_NUM_DEFAULT ((THREAD_SIZE / REC_STACK_SIZE) * 2)
++
+ #define DEFAULT_COUNT 10
+-#define REC_NUM_DEFAULT 10
+ #define EXEC_SIZE 64
+ 
+ enum cname {
+@@ -140,8 +151,7 @@ static DEFINE_SPINLOCK(lock_me_up);
+ static u8 data_area[EXEC_SIZE];
+ 
+ module_param(recur_count, int, 0644);
+-MODULE_PARM_DESC(recur_count, " Recursion level for the stack overflow test, 
"\
+-                               "default is 10");
++MODULE_PARM_DESC(recur_count, " Recursion level for the stack overflow test");
+ module_param(cpoint_name, charp, 0444);
+ MODULE_PARM_DESC(cpoint_name, " Crash Point, where kernel is to be crashed");
+ module_param(cpoint_type, charp, 0444);
+@@ -280,16 +290,16 @@ static int lkdtm_parse_commandline(void)
+       return -EINVAL;
+ }
+ 
+-static int recursive_loop(int a)
++static int recursive_loop(int remaining)
+ {
+-      char buf[1024];
++      char buf[REC_STACK_SIZE];
+ 
+-      memset(buf,0xFF,1024);
+-      recur_count--;
+-      if (!recur_count)
++      /* Make sure compiler does not optimize this away. */
++      memset(buf, (remaining & 0xff) | 0x1, REC_STACK_SIZE);
++      if (!remaining)
+               return 0;
+       else
+-              return recursive_loop(a);
++              return recursive_loop(remaining - 1);
+ }
+ 
+ static void do_nothing(void)
+@@ -333,7 +343,7 @@ static void lkdtm_do_action(enum ctype which)
+                       ;
+               break;
+       case CT_OVERFLOW:
+-              (void) recursive_loop(0);
++              (void) recursive_loop(recur_count);
+               break;
+       case CT_CORRUPT_STACK:
+               corrupt_stack();
+diff --git a/drivers/net/team/team.c b/drivers/net/team/team.c
+index 020581ddfdd3..3059b8c3825f 100644
+--- a/drivers/net/team/team.c
++++ b/drivers/net/team/team.c
+@@ -1831,10 +1831,10 @@ static int team_vlan_rx_kill_vid(struct net_device 
*dev, __be16 proto, u16 vid)
+       struct team *team = netdev_priv(dev);
+       struct team_port *port;
+ 
+-      rcu_read_lock();
+-      list_for_each_entry_rcu(port, &team->port_list, list)
++      mutex_lock(&team->lock);
++      list_for_each_entry(port, &team->port_list, list)
+               vlan_vid_del(port->dev, proto, vid);
+-      rcu_read_unlock();
++      mutex_unlock(&team->lock);
+ 
+       return 0;
+ }
+diff --git a/drivers/net/veth.c b/drivers/net/veth.c
+index 61c4044f644e..917abeae77ad 100644
+--- a/drivers/net/veth.c
++++ b/drivers/net/veth.c
+@@ -116,12 +116,6 @@ static netdev_tx_t veth_xmit(struct sk_buff *skb, struct 
net_device *dev)
+               kfree_skb(skb);
+               goto drop;
+       }
+-      /* don't change ip_summed == CHECKSUM_PARTIAL, as that
+-       * will cause bad checksum on forwarded packets
+-       */
+-      if (skb->ip_summed == CHECKSUM_NONE &&
+-          rcv->features & NETIF_F_RXCSUM)
+-              skb->ip_summed = CHECKSUM_UNNECESSARY;
+ 
+       if (likely(dev_forward_skb(rcv, skb) == NET_RX_SUCCESS)) {
+               struct pcpu_vstats *stats = this_cpu_ptr(dev->vstats);
+diff --git a/drivers/parisc/iommu-helpers.h b/drivers/parisc/iommu-helpers.h
+index 8c33491b21fe..c6aa38883466 100644
+--- a/drivers/parisc/iommu-helpers.h
++++ b/drivers/parisc/iommu-helpers.h
+@@ -104,7 +104,11 @@ iommu_coalesce_chunks(struct ioc *ioc, struct device *dev,
+       struct scatterlist *contig_sg;     /* contig chunk head */
+       unsigned long dma_offset, dma_len; /* start/len of DMA stream */
+       unsigned int n_mappings = 0;
+-      unsigned int max_seg_size = dma_get_max_seg_size(dev);
++      unsigned int max_seg_size = min(dma_get_max_seg_size(dev),
++                                      (unsigned)DMA_CHUNK_SIZE);
++      unsigned int max_seg_boundary = dma_get_seg_boundary(dev) + 1;
++      if (max_seg_boundary)   /* check if the addition above didn't overflow 
*/
++              max_seg_size = min(max_seg_size, max_seg_boundary);
+ 
+       while (nents > 0) {
+ 
+@@ -139,14 +143,11 @@ iommu_coalesce_chunks(struct ioc *ioc, struct device 
*dev,
+ 
+                       /*
+                       ** First make sure current dma stream won't
+-                      ** exceed DMA_CHUNK_SIZE if we coalesce the
++                      ** exceed max_seg_size if we coalesce the
+                       ** next entry.
+                       */   
+-                      if(unlikely(ALIGN(dma_len + dma_offset + 
startsg->length,
+-                                          IOVP_SIZE) > DMA_CHUNK_SIZE))
+-                              break;
+-
+-                      if (startsg->length + dma_len > max_seg_size)
++                      if (unlikely(ALIGN(dma_len + dma_offset + 
startsg->length, IOVP_SIZE) >
++                                   max_seg_size))
+                               break;
+ 
+                       /*
+diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
+index 3d98a3a82c79..dfcf0a3527b8 100644
+--- a/drivers/usb/host/xhci.c
++++ b/drivers/usb/host/xhci.c
+@@ -4696,8 +4696,16 @@ int xhci_update_hub_device(struct usb_hcd *hcd, struct 
usb_device *hdev,
+       ctrl_ctx->add_flags |= cpu_to_le32(SLOT_FLAG);
+       slot_ctx = xhci_get_slot_ctx(xhci, config_cmd->in_ctx);
+       slot_ctx->dev_info |= cpu_to_le32(DEV_HUB);
++      /*
++       * refer to section 6.2.2: MTT should be 0 for full speed hub,
++       * but it may be already set to 1 when setup an xHCI virtual
++       * device, so clear it anyway.
++       */
+       if (tt->multi)
+               slot_ctx->dev_info |= cpu_to_le32(DEV_MTT);
++      else if (hdev->speed == USB_SPEED_FULL)
++              slot_ctx->dev_info &= cpu_to_le32(~DEV_MTT);
++
+       if (xhci->hci_version > 0x95) {
+               xhci_dbg(xhci, "xHCI version %x needs hub "
+                               "TT think time and number of ports\n",
+@@ -4856,6 +4864,9 @@ static int __init xhci_hcd_init(void)
+ {
+       int retval;
+ 
++      if (usb_disabled())
++              return -ENODEV;
++
+       retval = xhci_register_pci();
+       if (retval < 0) {
+               pr_debug("Problem registering PCI driver.\n");
+@@ -4883,6 +4894,7 @@ static int __init xhci_hcd_init(void)
+       BUILD_BUG_ON(sizeof(struct xhci_intr_reg) != 8*32/8);
+       /* xhci_run_regs has eight fields and embeds 128 xhci_intr_regs */
+       BUILD_BUG_ON(sizeof(struct xhci_run_regs) != (8+8*128)*32/8);
++
+       return 0;
+ unreg_pci:
+       xhci_unregister_pci();
+diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
+index 3597be0a5ae4..9a3c0f76db8c 100644
+--- a/drivers/usb/serial/cp210x.c
++++ b/drivers/usb/serial/cp210x.c
+@@ -160,6 +160,7 @@ static const struct usb_device_id id_table[] = {
+       { USB_DEVICE(0x17F4, 0xAAAA) }, /* Wavesense Jazz blood glucose meter */
+       { USB_DEVICE(0x1843, 0x0200) }, /* Vaisala USB Instrument Cable */
+       { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
++      { USB_DEVICE(0x18EF, 0xE025) }, /* ELV Marble Sound Board 1 */
+       { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */
+       { USB_DEVICE(0x1B1C, 0x1C00) }, /* Corsair USB Dongle */
+       { USB_DEVICE(0x1BA4, 0x0002) }, /* Silicon Labs 358x factory default */
+diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c
+index 76c9a847da5d..e03900e8c667 100644
+--- a/drivers/usb/serial/ipaq.c
++++ b/drivers/usb/serial/ipaq.c
+@@ -532,7 +532,8 @@ static int ipaq_open(struct tty_struct *tty,
+        * through. Since this has a reasonably high failure rate, we retry
+        * several times.
+        */
+-      while (retries--) {
++      while (retries) {
++              retries--;
+               result = usb_control_msg(serial->dev,
+                               usb_sndctrlpipe(serial->dev, 0), 0x22, 0x21,
+                               0x1, 0, NULL, 0, 100);
+diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
+index 02ae99e8e6d3..65856c3599b4 100644
+--- a/include/linux/compiler-gcc.h
++++ b/include/linux/compiler-gcc.h
+@@ -100,10 +100,116 @@
+ #define __maybe_unused                        __attribute__((unused))
+ #define __always_unused                       __attribute__((unused))
+ 
+-#define __gcc_header(x) #x
+-#define _gcc_header(x) __gcc_header(linux/compiler-gcc##x.h)
+-#define gcc_header(x) _gcc_header(x)
+-#include gcc_header(__GNUC__)
++/* gcc version specific checks */
++
++#if GCC_VERSION < 30200
++# error Sorry, your compiler is too old - please upgrade it.
++#endif
++
++#if GCC_VERSION < 30300
++# define __used                       __attribute__((__unused__))
++#else
++# define __used                       __attribute__((__used__))
++#endif
++
++#ifdef CONFIG_GCOV_KERNEL
++# if GCC_VERSION < 30400
++#   error "GCOV profiling support for gcc versions below 3.4 not included"
++# endif /* __GNUC_MINOR__ */
++#endif /* CONFIG_GCOV_KERNEL */
++
++#if GCC_VERSION >= 30400
++#define __must_check          __attribute__((warn_unused_result))
++#endif
++
++#if GCC_VERSION >= 40000
++
++/* GCC 4.1.[01] miscompiles __weak */
++#ifdef __KERNEL__
++# if GCC_VERSION >= 40100 &&  GCC_VERSION <= 40101
++#  error Your version of gcc miscompiles the __weak directive
++# endif
++#endif
++
++#define __used                        __attribute__((__used__))
++#define __compiler_offsetof(a, b)                                     \
++      __builtin_offsetof(a, b)
++
++#if GCC_VERSION >= 40100 && GCC_VERSION < 40600
++# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
++#endif
++
++#if GCC_VERSION >= 40300
++/* Mark functions as cold. gcc will assume any path leading to a call
++ * to them will be unlikely.  This means a lot of manual unlikely()s
++ * are unnecessary now for any paths leading to the usual suspects
++ * like BUG(), printk(), panic() etc. [but let's keep them for now for
++ * older compilers]
++ *
++ * Early snapshots of gcc 4.3 don't support this and we can't detect this
++ * in the preprocessor, but we can live with this because they're unreleased.
++ * Maketime probing would be overkill here.
++ *
++ * gcc also has a __attribute__((__hot__)) to move hot functions into
++ * a special section, but I don't see any sense in this right now in
++ * the kernel context
++ */
++#define __cold                        __attribute__((__cold__))
++
++#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), 
__COUNTER__)
++
++#ifndef __CHECKER__
++# define __compiletime_warning(message) __attribute__((warning(message)))
++# define __compiletime_error(message) __attribute__((error(message)))
++#endif /* __CHECKER__ */
++#endif /* GCC_VERSION >= 40300 */
++
++#if GCC_VERSION >= 40500
++/*
++ * Mark a position in code as unreachable.  This can be used to
++ * suppress control flow warnings after asm blocks that transfer
++ * control elsewhere.
++ *
++ * Early snapshots of gcc 4.5 don't support this and we can't detect
++ * this in the preprocessor, but we can live with this because they're
++ * unreleased.  Really, we need to have autoconf for the kernel.
++ */
++#define unreachable() __builtin_unreachable()
++
++/* Mark a function definition as prohibited from being cloned. */
++#define __noclone     __attribute__((__noclone__))
++
++#endif /* GCC_VERSION >= 40500 */
++
++#if GCC_VERSION >= 40600
++/*
++ * Tell the optimizer that something else uses this function or variable.
++ */
++#define __visible     __attribute__((externally_visible))
++#endif
++
++/*
++ * GCC 'asm goto' miscompiles certain code sequences:
++ *
++ *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
++ *
++ * Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
++ *
++ * (asm goto is automatically volatile - the naming reflects this.)
++ */
++#define asm_volatile_goto(x...)       do { asm goto(x); asm (""); } while (0)
++
++#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
++#if GCC_VERSION >= 40400
++#define __HAVE_BUILTIN_BSWAP32__
++#define __HAVE_BUILTIN_BSWAP64__
++#endif
++#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600)
++#define __HAVE_BUILTIN_BSWAP16__
++#endif
++#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
++
++#endif        /* gcc version >= 40000 specific checks */
+ 
+ #if !defined(__noclone)
+ #define __noclone     /* not needed */
+diff --git a/include/linux/compiler-gcc3.h b/include/linux/compiler-gcc3.h
+deleted file mode 100644
+index 7d89febe4d79..000000000000
+--- a/include/linux/compiler-gcc3.h
++++ /dev/null
+@@ -1,23 +0,0 @@
+-#ifndef __LINUX_COMPILER_H
+-#error "Please don't include <linux/compiler-gcc3.h> directly, include 
<linux/compiler.h> instead."
+-#endif
+-
+-#if GCC_VERSION < 30200
+-# error Sorry, your compiler is too old - please upgrade it.
+-#endif
+-
+-#if GCC_VERSION >= 30300
+-# define __used                       __attribute__((__used__))
+-#else
+-# define __used                       __attribute__((__unused__))
+-#endif
+-
+-#if GCC_VERSION >= 30400
+-#define __must_check          __attribute__((warn_unused_result))
+-#endif
+-
+-#ifdef CONFIG_GCOV_KERNEL
+-# if GCC_VERSION < 30400
+-#   error "GCOV profiling support for gcc versions below 3.4 not included"
+-# endif /* __GNUC_MINOR__ */
+-#endif /* CONFIG_GCOV_KERNEL */
+diff --git a/include/linux/compiler-gcc4.h b/include/linux/compiler-gcc4.h
+deleted file mode 100644
+index 2507fd2a1eb4..000000000000
+--- a/include/linux/compiler-gcc4.h
++++ /dev/null
+@@ -1,88 +0,0 @@
+-#ifndef __LINUX_COMPILER_H
+-#error "Please don't include <linux/compiler-gcc4.h> directly, include 
<linux/compiler.h> instead."
+-#endif
+-
+-/* GCC 4.1.[01] miscompiles __weak */
+-#ifdef __KERNEL__
+-# if GCC_VERSION >= 40100 &&  GCC_VERSION <= 40101
+-#  error Your version of gcc miscompiles the __weak directive
+-# endif
+-#endif
+-
+-#define __used                        __attribute__((__used__))
+-#define __must_check          __attribute__((warn_unused_result))
+-#define __compiler_offsetof(a,b) __builtin_offsetof(a,b)
+-
+-#if GCC_VERSION >= 40100 && GCC_VERSION < 40600
+-# define __compiletime_object_size(obj) __builtin_object_size(obj, 0)
+-#endif
+-
+-#if GCC_VERSION >= 40300
+-/* Mark functions as cold. gcc will assume any path leading to a call
+-   to them will be unlikely.  This means a lot of manual unlikely()s
+-   are unnecessary now for any paths leading to the usual suspects
+-   like BUG(), printk(), panic() etc. [but let's keep them for now for
+-   older compilers]
+-
+-   Early snapshots of gcc 4.3 don't support this and we can't detect this
+-   in the preprocessor, but we can live with this because they're unreleased.
+-   Maketime probing would be overkill here.
+-
+-   gcc also has a __attribute__((__hot__)) to move hot functions into
+-   a special section, but I don't see any sense in this right now in
+-   the kernel context */
+-#define __cold                        __attribute__((__cold__))
+-
+-#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), 
__COUNTER__)
+-
+-#ifndef __CHECKER__
+-# define __compiletime_warning(message) __attribute__((warning(message)))
+-# define __compiletime_error(message) __attribute__((error(message)))
+-#endif /* __CHECKER__ */
+-#endif /* GCC_VERSION >= 40300 */
+-
+-#if GCC_VERSION >= 40500
+-/*
+- * Mark a position in code as unreachable.  This can be used to
+- * suppress control flow warnings after asm blocks that transfer
+- * control elsewhere.
+- *
+- * Early snapshots of gcc 4.5 don't support this and we can't detect
+- * this in the preprocessor, but we can live with this because they're
+- * unreleased.  Really, we need to have autoconf for the kernel.
+- */
+-#define unreachable() __builtin_unreachable()
+-
+-/* Mark a function definition as prohibited from being cloned. */
+-#define __noclone     __attribute__((__noclone__))
+-
+-#endif /* GCC_VERSION >= 40500 */
+-
+-#if GCC_VERSION >= 40600
+-/*
+- * Tell the optimizer that something else uses this function or variable.
+- */
+-#define __visible __attribute__((externally_visible))
+-#endif
+-
+-/*
+- * GCC 'asm goto' miscompiles certain code sequences:
+- *
+- *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
+- *
+- * Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
+- * Fixed in GCC 4.8.2 and later versions.
+- *
+- * (asm goto is automatically volatile - the naming reflects this.)
+- */
+-#define asm_volatile_goto(x...)       do { asm goto(x); asm (""); } while (0)
+-
+-#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
+-#if GCC_VERSION >= 40400
+-#define __HAVE_BUILTIN_BSWAP32__
+-#define __HAVE_BUILTIN_BSWAP64__
+-#endif
+-#if GCC_VERSION >= 40800 || (defined(__powerpc__) && GCC_VERSION >= 40600)
+-#define __HAVE_BUILTIN_BSWAP16__
+-#endif
+-#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
+diff --git a/include/linux/compiler-gcc5.h b/include/linux/compiler-gcc5.h
+deleted file mode 100644
+index cdd1cc202d51..000000000000
+--- a/include/linux/compiler-gcc5.h
++++ /dev/null
+@@ -1,66 +0,0 @@
+-#ifndef __LINUX_COMPILER_H
+-#error "Please don't include <linux/compiler-gcc5.h> directly, include 
<linux/compiler.h> instead."
+-#endif
+-
+-#define __used                                __attribute__((__used__))
+-#define __must_check                  __attribute__((warn_unused_result))
+-#define __compiler_offsetof(a, b)     __builtin_offsetof(a, b)
+-
+-/* Mark functions as cold. gcc will assume any path leading to a call
+-   to them will be unlikely.  This means a lot of manual unlikely()s
+-   are unnecessary now for any paths leading to the usual suspects
+-   like BUG(), printk(), panic() etc. [but let's keep them for now for
+-   older compilers]
+-
+-   Early snapshots of gcc 4.3 don't support this and we can't detect this
+-   in the preprocessor, but we can live with this because they're unreleased.
+-   Maketime probing would be overkill here.
+-
+-   gcc also has a __attribute__((__hot__)) to move hot functions into
+-   a special section, but I don't see any sense in this right now in
+-   the kernel context */
+-#define __cold                        __attribute__((__cold__))
+-
+-#define __UNIQUE_ID(prefix) __PASTE(__PASTE(__UNIQUE_ID_, prefix), 
__COUNTER__)
+-
+-#ifndef __CHECKER__
+-# define __compiletime_warning(message) __attribute__((warning(message)))
+-# define __compiletime_error(message) __attribute__((error(message)))
+-#endif /* __CHECKER__ */
+-
+-/*
+- * Mark a position in code as unreachable.  This can be used to
+- * suppress control flow warnings after asm blocks that transfer
+- * control elsewhere.
+- *
+- * Early snapshots of gcc 4.5 don't support this and we can't detect
+- * this in the preprocessor, but we can live with this because they're
+- * unreleased.  Really, we need to have autoconf for the kernel.
+- */
+-#define unreachable() __builtin_unreachable()
+-
+-/* Mark a function definition as prohibited from being cloned. */
+-#define __noclone     __attribute__((__noclone__))
+-
+-/*
+- * Tell the optimizer that something else uses this function or variable.
+- */
+-#define __visible __attribute__((externally_visible))
+-
+-/*
+- * GCC 'asm goto' miscompiles certain code sequences:
+- *
+- *   http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670
+- *
+- * Work it around via a compiler barrier quirk suggested by Jakub Jelinek.
+- * Fixed in GCC 4.8.2 and later versions.
+- *
+- * (asm goto is automatically volatile - the naming reflects this.)
+- */
+-#define asm_volatile_goto(x...)       do { asm goto(x); asm (""); } while (0)
+-
+-#ifdef CONFIG_ARCH_USE_BUILTIN_BSWAP
+-#define __HAVE_BUILTIN_BSWAP32__
+-#define __HAVE_BUILTIN_BSWAP64__
+-#define __HAVE_BUILTIN_BSWAP16__
+-#endif /* CONFIG_ARCH_USE_BUILTIN_BSWAP */
+diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
+index 7fac04e7ff6e..f662a3719a1b 100644
+--- a/include/linux/syscalls.h
++++ b/include/linux/syscalls.h
+@@ -499,7 +499,7 @@ asmlinkage long sys_chown(const char __user *filename,
+ asmlinkage long sys_lchown(const char __user *filename,
+                               uid_t user, gid_t group);
+ asmlinkage long sys_fchown(unsigned int fd, uid_t user, gid_t group);
+-#ifdef CONFIG_UID16
++#ifdef CONFIG_HAVE_UID16
+ asmlinkage long sys_chown16(const char __user *filename,
+                               old_uid_t user, old_gid_t group);
+ asmlinkage long sys_lchown16(const char __user *filename,
+diff --git a/include/linux/types.h b/include/linux/types.h
+index 4d118ba11349..83db8e5974dc 100644
+--- a/include/linux/types.h
++++ b/include/linux/types.h
+@@ -35,7 +35,7 @@ typedef __kernel_gid16_t        gid16_t;
+ 
+ typedef unsigned long         uintptr_t;
+ 
+-#ifdef CONFIG_UID16
++#ifdef CONFIG_HAVE_UID16
+ /* This is defined by include/asm-{arch}/posix_types.h */
+ typedef __kernel_old_uid_t    old_uid_t;
+ typedef __kernel_old_gid_t    old_gid_t;
+diff --git a/include/net/inet_ecn.h b/include/net/inet_ecn.h
+index 3bd22795c3e2..194723c2e7bb 100644
+--- a/include/net/inet_ecn.h
++++ b/include/net/inet_ecn.h
+@@ -111,11 +111,24 @@ static inline void ipv4_copy_dscp(unsigned int dscp, 
struct iphdr *inner)
+ 
+ struct ipv6hdr;
+ 
+-static inline int IP6_ECN_set_ce(struct ipv6hdr *iph)
++/* Note:
++ * IP_ECN_set_ce() has to tweak IPV4 checksum when setting CE,
++ * meaning both changes have no effect on skb->csum if/when CHECKSUM_COMPLETE
++ * In IPv6 case, no checksum compensates the change in IPv6 header,
++ * so we have to update skb->csum.
++ */
++static inline int IP6_ECN_set_ce(struct sk_buff *skb, struct ipv6hdr *iph)
+ {
++      __be32 from, to;
++
+       if (INET_ECN_is_not_ect(ipv6_get_dsfield(iph)))
+               return 0;
+-      *(__be32*)iph |= htonl(INET_ECN_CE << 20);
++
++      from = *(__be32 *)iph;
++      to = from | htonl(INET_ECN_CE << 20);
++      *(__be32 *)iph = to;
++      if (skb->ip_summed == CHECKSUM_COMPLETE)
++              skb->csum = csum_add(csum_sub(skb->csum, from), to);
+       return 1;
+ }
+ 
+@@ -142,7 +155,7 @@ static inline int INET_ECN_set_ce(struct sk_buff *skb)
+       case cpu_to_be16(ETH_P_IPV6):
+               if (skb_network_header(skb) + sizeof(struct ipv6hdr) <=
+                   skb_tail_pointer(skb))
+-                      return IP6_ECN_set_ce(ipv6_hdr(skb));
++                      return IP6_ECN_set_ce(skb, ipv6_hdr(skb));
+               break;
+       }
+ 
+diff --git a/kernel/workqueue.c b/kernel/workqueue.c
+index bba4e426ccbc..bb5f920268d7 100644
+--- a/kernel/workqueue.c
++++ b/kernel/workqueue.c
+@@ -1468,13 +1468,13 @@ static void __queue_delayed_work(int cpu, struct 
workqueue_struct *wq,
+       timer_stats_timer_set_start_info(&dwork->timer);
+ 
+       dwork->wq = wq;
+-      /* timer isn't guaranteed to run in this cpu, record earlier */
+-      if (cpu == WORK_CPU_UNBOUND)
+-              cpu = raw_smp_processor_id();
+       dwork->cpu = cpu;
+       timer->expires = jiffies + delay;
+ 
+-      add_timer_on(timer, cpu);
++      if (unlikely(cpu != WORK_CPU_UNBOUND))
++              add_timer_on(timer, cpu);
++      else
++              add_timer(timer);
+ }
+ 
+ /**
+diff --git a/mm/vmstat.c b/mm/vmstat.c
+index f7ca04482299..1dbd89d2fb9c 100644
+--- a/mm/vmstat.c
++++ b/mm/vmstat.c
+@@ -1221,7 +1221,8 @@ int sysctl_stat_interval __read_mostly = HZ;
+ static void vmstat_update(struct work_struct *w)
+ {
+       refresh_cpu_vm_stats();
+-      schedule_delayed_work(&__get_cpu_var(vmstat_work),
++      schedule_delayed_work_on(smp_processor_id(),
++              &__get_cpu_var(vmstat_work),
+               round_jiffies_relative(sysctl_stat_interval));
+ }
+ 
+diff --git a/net/bridge/br_stp_if.c b/net/bridge/br_stp_if.c
+index 886f6d6dc48a..3995a66c3e4e 100644
+--- a/net/bridge/br_stp_if.c
++++ b/net/bridge/br_stp_if.c
+@@ -128,7 +128,10 @@ static void br_stp_start(struct net_bridge *br)
+       char *argv[] = { BR_STP_PROG, br->dev->name, "start", NULL };
+       char *envp[] = { NULL };
+ 
+-      r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC);
++      if (net_eq(dev_net(br->dev), &init_net))
++              r = call_usermodehelper(BR_STP_PROG, argv, envp, UMH_WAIT_PROC);
++      else
++              r = -ENOENT;
+ 
+       spin_lock_bh(&br->lock);
+ 
+diff --git a/net/ipv4/tcp_yeah.c b/net/ipv4/tcp_yeah.c
+index 05c3b6f0e8e1..bf8321d6f2ef 100644
+--- a/net/ipv4/tcp_yeah.c
++++ b/net/ipv4/tcp_yeah.c
+@@ -222,7 +222,7 @@ static u32 tcp_yeah_ssthresh(struct sock *sk) {
+       yeah->fast_count = 0;
+       yeah->reno_count = max(yeah->reno_count>>1, 2U);
+ 
+-      return tp->snd_cwnd - reduction;
++      return max_t(int, tp->snd_cwnd - reduction, 2);
+ }
+ 
+ static struct tcp_congestion_ops tcp_yeah __read_mostly = {
+diff --git a/net/ipv4/xfrm4_policy.c b/net/ipv4/xfrm4_policy.c
+index adf998322bd2..bb201660bd8a 100644
+--- a/net/ipv4/xfrm4_policy.c
++++ b/net/ipv4/xfrm4_policy.c
+@@ -230,7 +230,7 @@ static void xfrm4_dst_ifdown(struct dst_entry *dst, struct 
net_device *dev,
+       xfrm_dst_ifdown(dst, dev);
+ }
+ 
+-static struct dst_ops xfrm4_dst_ops = {
++static struct dst_ops xfrm4_dst_ops_template = {
+       .family =               AF_INET,
+       .protocol =             cpu_to_be16(ETH_P_IP),
+       .gc =                   xfrm4_garbage_collect,
+@@ -245,7 +245,7 @@ static struct dst_ops xfrm4_dst_ops = {
+ 
+ static struct xfrm_policy_afinfo xfrm4_policy_afinfo = {
+       .family =               AF_INET,
+-      .dst_ops =              &xfrm4_dst_ops,
++      .dst_ops =              &xfrm4_dst_ops_template,
+       .dst_lookup =           xfrm4_dst_lookup,
+       .get_saddr =            xfrm4_get_saddr,
+       .decode_session =       _decode_session4,
+@@ -267,7 +267,7 @@ static struct ctl_table xfrm4_policy_table[] = {
+       { }
+ };
+ 
+-static int __net_init xfrm4_net_init(struct net *net)
++static int __net_init xfrm4_net_sysctl_init(struct net *net)
+ {
+       struct ctl_table *table;
+       struct ctl_table_header *hdr;
+@@ -295,7 +295,7 @@ err_alloc:
+       return -ENOMEM;
+ }
+ 
+-static void __net_exit xfrm4_net_exit(struct net *net)
++static void __net_exit xfrm4_net_sysctl_exit(struct net *net)
+ {
+       struct ctl_table *table;
+ 
+@@ -307,12 +307,44 @@ static void __net_exit xfrm4_net_exit(struct net *net)
+       if (!net_eq(net, &init_net))
+               kfree(table);
+ }
++#else /* CONFIG_SYSCTL */
++static int inline xfrm4_net_sysctl_init(struct net *net)
++{
++      return 0;
++}
++
++static void inline xfrm4_net_sysctl_exit(struct net *net)
++{
++}
++#endif
++
++static int __net_init xfrm4_net_init(struct net *net)
++{
++      int ret;
++
++      memcpy(&net->xfrm.xfrm4_dst_ops, &xfrm4_dst_ops_template,
++             sizeof(xfrm4_dst_ops_template));
++      ret = dst_entries_init(&net->xfrm.xfrm4_dst_ops);
++      if (ret)
++              return ret;
++
++      ret = xfrm4_net_sysctl_init(net);
++      if (ret)
++              dst_entries_destroy(&net->xfrm.xfrm4_dst_ops);
++
++      return ret;
++}
++
++static void __net_exit xfrm4_net_exit(struct net *net)
++{
++      xfrm4_net_sysctl_exit(net);
++      dst_entries_destroy(&net->xfrm.xfrm4_dst_ops);
++}
+ 
+ static struct pernet_operations __net_initdata xfrm4_net_ops = {
+       .init   = xfrm4_net_init,
+       .exit   = xfrm4_net_exit,
+ };
+-#endif
+ 
+ static void __init xfrm4_policy_init(void)
+ {
+@@ -321,12 +353,8 @@ static void __init xfrm4_policy_init(void)
+ 
+ void __init xfrm4_init(void)
+ {
+-      dst_entries_init(&xfrm4_dst_ops);
+-
+       xfrm4_state_init();
+       xfrm4_policy_init();
+-#ifdef CONFIG_SYSCTL
+       register_pernet_subsys(&xfrm4_net_ops);
+-#endif
+ }
+ 
+diff --git a/net/ipv6/addrlabel.c b/net/ipv6/addrlabel.c
+index b30ad3741b46..d5c918975c8c 100644
+--- a/net/ipv6/addrlabel.c
++++ b/net/ipv6/addrlabel.c
+@@ -558,7 +558,7 @@ static int ip6addrlbl_get(struct sk_buff *in_skb, struct 
nlmsghdr* nlh)
+ 
+       rcu_read_lock();
+       p = __ipv6_addr_label(net, addr, ipv6_addr_type(addr), 
ifal->ifal_index);
+-      if (p && ip6addrlbl_hold(p))
++      if (p && !ip6addrlbl_hold(p))
+               p = NULL;
+       lseq = ip6addrlbl_table.seq;
+       rcu_read_unlock();
+diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
+index 90004c6e3bff..7138ee87e07c 100644
+--- a/net/ipv6/tcp_ipv6.c
++++ b/net/ipv6/tcp_ipv6.c
+@@ -484,8 +484,10 @@ static int tcp_v6_send_synack(struct sock *sk, struct 
dst_entry *dst,
+ 
+               fl6->daddr = treq->rmt_addr;
+               skb_set_queue_mapping(skb, queue_mapping);
++              rcu_read_lock();
+               err = ip6_xmit(sk, skb, fl6, rcu_dereference(np->opt),
+                              np->tclass);
++              rcu_read_unlock();
+               err = net_xmit_eval(err);
+       }
+ 
+diff --git a/net/ipv6/xfrm6_mode_tunnel.c b/net/ipv6/xfrm6_mode_tunnel.c
+index 4770d515c2c8..d43c9babc2b0 100644
+--- a/net/ipv6/xfrm6_mode_tunnel.c
++++ b/net/ipv6/xfrm6_mode_tunnel.c
+@@ -24,7 +24,7 @@ static inline void ipip6_ecn_decapsulate(struct sk_buff *skb)
+       struct ipv6hdr *inner_iph = ipipv6_hdr(skb);
+ 
+       if (INET_ECN_is_ce(ipv6_get_dsfield(outer_iph)))
+-              IP6_ECN_set_ce(inner_iph);
++              IP6_ECN_set_ce(skb, inner_iph);
+ }
+ 
+ /* Add encapsulation header.
+diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c
+index 550b195bb2fc..b2ea43167633 100644
+--- a/net/ipv6/xfrm6_policy.c
++++ b/net/ipv6/xfrm6_policy.c
+@@ -279,7 +279,7 @@ static void xfrm6_dst_ifdown(struct dst_entry *dst, struct 
net_device *dev,
+       xfrm_dst_ifdown(dst, dev);
+ }
+ 
+-static struct dst_ops xfrm6_dst_ops = {
++static struct dst_ops xfrm6_dst_ops_template = {
+       .family =               AF_INET6,
+       .protocol =             cpu_to_be16(ETH_P_IPV6),
+       .gc =                   xfrm6_garbage_collect,
+@@ -294,7 +294,7 @@ static struct dst_ops xfrm6_dst_ops = {
+ 
+ static struct xfrm_policy_afinfo xfrm6_policy_afinfo = {
+       .family =               AF_INET6,
+-      .dst_ops =              &xfrm6_dst_ops,
++      .dst_ops =              &xfrm6_dst_ops_template,
+       .dst_lookup =           xfrm6_dst_lookup,
+       .get_saddr =            xfrm6_get_saddr,
+       .decode_session =       _decode_session6,
+@@ -327,7 +327,7 @@ static struct ctl_table xfrm6_policy_table[] = {
+       { }
+ };
+ 
+-static int __net_init xfrm6_net_init(struct net *net)
++static int __net_init xfrm6_net_sysctl_init(struct net *net)
+ {
+       struct ctl_table *table;
+       struct ctl_table_header *hdr;
+@@ -355,7 +355,7 @@ err_alloc:
+       return -ENOMEM;
+ }
+ 
+-static void __net_exit xfrm6_net_exit(struct net *net)
++static void __net_exit xfrm6_net_sysctl_exit(struct net *net)
+ {
+       struct ctl_table *table;
+ 
+@@ -367,31 +367,57 @@ static void __net_exit xfrm6_net_exit(struct net *net)
+       if (!net_eq(net, &init_net))
+               kfree(table);
+ }
++#else /* CONFIG_SYSCTL */
++static int inline xfrm6_net_sysctl_init(struct net *net)
++{
++      return 0;
++}
++
++static void inline xfrm6_net_sysctl_exit(struct net *net)
++{
++}
++#endif
++
++static int __net_init xfrm6_net_init(struct net *net)
++{
++      int ret;
++
++      memcpy(&net->xfrm.xfrm6_dst_ops, &xfrm6_dst_ops_template,
++             sizeof(xfrm6_dst_ops_template));
++      ret = dst_entries_init(&net->xfrm.xfrm6_dst_ops);
++      if (ret)
++              return ret;
++
++      ret = xfrm6_net_sysctl_init(net);
++      if (ret)
++              dst_entries_destroy(&net->xfrm.xfrm6_dst_ops);
++
++      return ret;
++}
++
++static void __net_exit xfrm6_net_exit(struct net *net)
++{
++      xfrm6_net_sysctl_exit(net);
++      dst_entries_destroy(&net->xfrm.xfrm6_dst_ops);
++}
+ 
+ static struct pernet_operations xfrm6_net_ops = {
+       .init   = xfrm6_net_init,
+       .exit   = xfrm6_net_exit,
+ };
+-#endif
+ 
+ int __init xfrm6_init(void)
+ {
+       int ret;
+ 
+-      dst_entries_init(&xfrm6_dst_ops);
+-
+       ret = xfrm6_policy_init();
+-      if (ret) {
+-              dst_entries_destroy(&xfrm6_dst_ops);
++      if (ret)
+               goto out;
+-      }
+       ret = xfrm6_state_init();
+       if (ret)
+               goto out_policy;
+ 
+-#ifdef CONFIG_SYSCTL
+       register_pernet_subsys(&xfrm6_net_ops);
+-#endif
+ out:
+       return ret;
+ out_policy:
+@@ -401,10 +427,7 @@ out_policy:
+ 
+ void xfrm6_fini(void)
+ {
+-#ifdef CONFIG_SYSCTL
+       unregister_pernet_subsys(&xfrm6_net_ops);
+-#endif
+       xfrm6_policy_fini();
+       xfrm6_state_fini();
+-      dst_entries_destroy(&xfrm6_dst_ops);
+ }
+diff --git a/net/phonet/af_phonet.c b/net/phonet/af_phonet.c
+index 5a940dbd74a3..f0229223bf91 100644
+--- a/net/phonet/af_phonet.c
++++ b/net/phonet/af_phonet.c
+@@ -377,6 +377,10 @@ static int phonet_rcv(struct sk_buff *skb, struct 
net_device *dev,
+       struct sockaddr_pn sa;
+       u16 len;
+ 
++      skb = skb_share_check(skb, GFP_ATOMIC);
++      if (!skb)
++              return NET_RX_DROP;
++
+       /* check we have at least a full Phonet header */
+       if (!pskb_pull(skb, sizeof(struct phonethdr)))
+               goto out;
+diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
+index bf12098bbe1c..63a116c31a8b 100644
+--- a/net/sctp/sm_statefuns.c
++++ b/net/sctp/sm_statefuns.c
+@@ -4835,7 +4835,8 @@ sctp_disposition_t sctp_sf_do_9_1_prm_abort(
+ 
+       retval = SCTP_DISPOSITION_CONSUME;
+ 
+-      sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
++      if (abort)
++              sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
+ 
+       /* Even if we can't send the ABORT due to low memory delete the
+        * TCB.  This is a departure from our typical NOMEM handling.
+@@ -4972,7 +4973,8 @@ sctp_disposition_t sctp_sf_cookie_wait_prm_abort(
+                       SCTP_TO(SCTP_EVENT_TIMEOUT_T1_INIT));
+       retval = SCTP_DISPOSITION_CONSUME;
+ 
+-      sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
++      if (abort)
++              sctp_add_cmd_sf(commands, SCTP_CMD_REPLY, SCTP_CHUNK(abort));
+ 
+       sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
+                       SCTP_STATE(SCTP_STATE_CLOSED));
+diff --git a/net/sctp/socket.c b/net/sctp/socket.c
+index e2b1da09dc79..9c47fbc5de0c 100644
+--- a/net/sctp/socket.c
++++ b/net/sctp/socket.c
+@@ -1518,8 +1518,7 @@ static void sctp_close(struct sock *sk, long timeout)
+                       struct sctp_chunk *chunk;
+ 
+                       chunk = sctp_make_abort_user(asoc, NULL, 0);
+-                      if (chunk)
+-                              sctp_primitive_ABORT(net, asoc, chunk);
++                      sctp_primitive_ABORT(net, asoc, chunk);
+               } else
+                       sctp_primitive_SHUTDOWN(net, asoc, NULL);
+       }
+diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c
+index 968355f0de60..596aa3c5321c 100644
+--- a/net/sctp/sysctl.c
++++ b/net/sctp/sysctl.c
+@@ -306,7 +306,7 @@ static int proc_sctp_do_hmac_alg(struct ctl_table *ctl,
+       struct ctl_table tbl;
+       bool changed = false;
+       char *none = "none";
+-      char tmp[8];
++      char tmp[8] = {0};
+       int ret;
+ 
+       memset(&tbl, 0, sizeof(struct ctl_table));
+diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
+index 57674ddc683d..5606e994f56e 100644
+--- a/net/xfrm/xfrm_policy.c
++++ b/net/xfrm/xfrm_policy.c
+@@ -2724,7 +2724,6 @@ static struct neighbour *xfrm_neigh_lookup(const struct 
dst_entry *dst,
+ 
+ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo)
+ {
+-      struct net *net;
+       int err = 0;
+       if (unlikely(afinfo == NULL))
+               return -EINVAL;
+@@ -2755,26 +2754,6 @@ int xfrm_policy_register_afinfo(struct 
xfrm_policy_afinfo *afinfo)
+       }
+       spin_unlock(&xfrm_policy_afinfo_lock);
+ 
+-      rtnl_lock();
+-      for_each_net(net) {
+-              struct dst_ops *xfrm_dst_ops;
+-
+-              switch (afinfo->family) {
+-              case AF_INET:
+-                      xfrm_dst_ops = &net->xfrm.xfrm4_dst_ops;
+-                      break;
+-#if IS_ENABLED(CONFIG_IPV6)
+-              case AF_INET6:
+-                      xfrm_dst_ops = &net->xfrm.xfrm6_dst_ops;
+-                      break;
+-#endif
+-              default:
+-                      BUG();
+-              }
+-              *xfrm_dst_ops = *afinfo->dst_ops;
+-      }
+-      rtnl_unlock();
+-
+       return err;
+ }
+ EXPORT_SYMBOL(xfrm_policy_register_afinfo);
+@@ -2810,22 +2789,6 @@ int xfrm_policy_unregister_afinfo(struct 
xfrm_policy_afinfo *afinfo)
+ }
+ EXPORT_SYMBOL(xfrm_policy_unregister_afinfo);
+ 
+-static void __net_init xfrm_dst_ops_init(struct net *net)
+-{
+-      struct xfrm_policy_afinfo *afinfo;
+-
+-      rcu_read_lock();
+-      afinfo = rcu_dereference(xfrm_policy_afinfo[AF_INET]);
+-      if (afinfo)
+-              net->xfrm.xfrm4_dst_ops = *afinfo->dst_ops;
+-#if IS_ENABLED(CONFIG_IPV6)
+-      afinfo = rcu_dereference(xfrm_policy_afinfo[AF_INET6]);
+-      if (afinfo)
+-              net->xfrm.xfrm6_dst_ops = *afinfo->dst_ops;
+-#endif
+-      rcu_read_unlock();
+-}
+-
+ static int xfrm_dev_event(struct notifier_block *this, unsigned long event, 
void *ptr)
+ {
+       struct net_device *dev = netdev_notifier_info_to_dev(ptr);
+@@ -2971,7 +2934,6 @@ static int __net_init xfrm_net_init(struct net *net)
+       rv = xfrm_policy_init(net);
+       if (rv < 0)
+               goto out_policy;
+-      xfrm_dst_ops_init(net);
+       rv = xfrm_sysctl_init(net);
+       if (rv < 0)
+               goto out_sysctl;
+diff --git a/scripts/recordmcount.h b/scripts/recordmcount.h
+index 49b582a225b0..b9897e2be404 100644
+--- a/scripts/recordmcount.h
++++ b/scripts/recordmcount.h
+@@ -377,7 +377,7 @@ static void nop_mcount(Elf_Shdr const *const relhdr,
+ 
+               if (mcountsym == Elf_r_sym(relp) && !is_fake_mcount(relp)) {
+                       if (make_nop)
+-                              ret = make_nop((void *)ehdr, shdr->sh_offset + 
relp->r_offset);
++                              ret = make_nop((void *)ehdr, 
_w(shdr->sh_offset) + _w(relp->r_offset));
+                       if (warn_on_notrace_sect && !once) {
+                               printf("Section %s has mcount callers being 
ignored\n",
+                                      txtname);
+diff --git a/scripts/recordmcount.pl b/scripts/recordmcount.pl
+index a27134fc3f76..efe7567d6225 100755
+--- a/scripts/recordmcount.pl
++++ b/scripts/recordmcount.pl
+@@ -265,7 +265,8 @@ if ($arch eq "x86_64") {
+ 
+ } elsif ($arch eq "powerpc") {
+     $local_regex = "^[0-9a-fA-F]+\\s+t\\s+(\\.?\\S+)";
+-    $function_regex = "^([0-9a-fA-F]+)\\s+<(\\.?.*?)>:";
++    # See comment in the sparc64 section for why we use '\w'.
++    $function_regex = "^([0-9a-fA-F]+)\\s+<(\\.?\\w*?)>:";
+     $mcount_regex = "^\\s*([0-9a-fA-F]+):.*\\s\\.?_mcount\$";
+ 
+     if ($bits == 64) {
+diff --git a/sound/core/control.c b/sound/core/control.c
+index f2082a35b890..3fcead61f0ef 100644
+--- a/sound/core/control.c
++++ b/sound/core/control.c
+@@ -1325,6 +1325,8 @@ static int snd_ctl_tlv_ioctl(struct snd_ctl_file *file,
+               return -EFAULT;
+       if (tlv.length < sizeof(unsigned int) * 2)
+               return -EINVAL;
++      if (!tlv.numid)
++              return -EINVAL;
+       down_read(&card->controls_rwsem);
+       kctl = snd_ctl_find_numid(card, tlv.numid);
+       if (kctl == NULL) {
+diff --git a/sound/core/hrtimer.c b/sound/core/hrtimer.c
+index b8b31c433d64..14d483d6b3b0 100644
+--- a/sound/core/hrtimer.c
++++ b/sound/core/hrtimer.c
+@@ -90,7 +90,7 @@ static int snd_hrtimer_start(struct snd_timer *t)
+       struct snd_hrtimer *stime = t->private_data;
+ 
+       atomic_set(&stime->running, 0);
+-      hrtimer_cancel(&stime->hrt);
++      hrtimer_try_to_cancel(&stime->hrt);
+       hrtimer_start(&stime->hrt, ns_to_ktime(t->sticks * resolution),
+                     HRTIMER_MODE_REL);
+       atomic_set(&stime->running, 1);
+@@ -101,6 +101,7 @@ static int snd_hrtimer_stop(struct snd_timer *t)
+ {
+       struct snd_hrtimer *stime = t->private_data;
+       atomic_set(&stime->running, 0);
++      hrtimer_try_to_cancel(&stime->hrt);
+       return 0;
+ }
+ 
+diff --git a/sound/core/pcm_compat.c b/sound/core/pcm_compat.c
+index c4ac3c1e19af..1bb1a43c7d03 100644
+--- a/sound/core/pcm_compat.c
++++ b/sound/core/pcm_compat.c
+@@ -236,10 +236,15 @@ static int snd_pcm_ioctl_hw_params_compat(struct 
snd_pcm_substream *substream,
+       if (! (runtime = substream->runtime))
+               return -ENOTTY;
+ 
+-      /* only fifo_size is different, so just copy all */
+-      data = memdup_user(data32, sizeof(*data32));
+-      if (IS_ERR(data))
+-              return PTR_ERR(data);
++      data = kmalloc(sizeof(*data), GFP_KERNEL);
++      if (!data)
++              return -ENOMEM;
++
++      /* only fifo_size (RO from userspace) is different, so just copy all */
++      if (copy_from_user(data, data32, sizeof(*data32))) {
++              err = -EFAULT;
++              goto error;
++      }
+ 
+       if (refine)
+               err = snd_pcm_hw_refine(substream, data);
+diff --git a/sound/core/seq/seq_clientmgr.c b/sound/core/seq/seq_clientmgr.c
+index 4dc6bae80e15..ecfbf5f39d38 100644
+--- a/sound/core/seq/seq_clientmgr.c
++++ b/sound/core/seq/seq_clientmgr.c
+@@ -1950,7 +1950,7 @@ static int snd_seq_ioctl_remove_events(struct 
snd_seq_client *client,
+                * No restrictions so for a user client we can clear
+                * the whole fifo
+                */
+-              if (client->type == USER_CLIENT)
++              if (client->type == USER_CLIENT && client->data.user.fifo)
+                       snd_seq_fifo_clear(client->data.user.fifo);
+       }
+ 
+diff --git a/sound/core/seq/seq_compat.c b/sound/core/seq/seq_compat.c
+index 81f7c109dc46..65175902a68a 100644
+--- a/sound/core/seq/seq_compat.c
++++ b/sound/core/seq/seq_compat.c
+@@ -49,11 +49,12 @@ static int snd_seq_call_port_info_ioctl(struct 
snd_seq_client *client, unsigned
+       struct snd_seq_port_info *data;
+       mm_segment_t fs;
+ 
+-      data = memdup_user(data32, sizeof(*data32));
+-      if (IS_ERR(data))
+-              return PTR_ERR(data);
++      data = kmalloc(sizeof(*data), GFP_KERNEL);
++      if (!data)
++              return -ENOMEM;
+ 
+-      if (get_user(data->flags, &data32->flags) ||
++      if (copy_from_user(data, data32, sizeof(*data32)) ||
++          get_user(data->flags, &data32->flags) ||
+           get_user(data->time_queue, &data32->time_queue))
+               goto error;
+       data->kernel = NULL;
+diff --git a/sound/core/seq/seq_queue.c b/sound/core/seq/seq_queue.c
+index f9077361c119..4c9aa462de9b 100644
+--- a/sound/core/seq/seq_queue.c
++++ b/sound/core/seq/seq_queue.c
+@@ -144,8 +144,10 @@ static struct snd_seq_queue *queue_new(int owner, int 
locked)
+ static void queue_delete(struct snd_seq_queue *q)
+ {
+       /* stop and release the timer */
++      mutex_lock(&q->timer_mutex);
+       snd_seq_timer_stop(q->timer);
+       snd_seq_timer_close(q);
++      mutex_unlock(&q->timer_mutex);
+       /* wait until access free */
+       snd_use_lock_sync(&q->use_lock);
+       /* release resources... */
+diff --git a/sound/core/timer.c b/sound/core/timer.c
+index 6ddcf06f52f9..4e436fe53afa 100644
+--- a/sound/core/timer.c
++++ b/sound/core/timer.c
+@@ -73,7 +73,7 @@ struct snd_timer_user {
+       struct timespec tstamp;         /* trigger tstamp */
+       wait_queue_head_t qchange_sleep;
+       struct fasync_struct *fasync;
+-      struct mutex tread_sem;
++      struct mutex ioctl_lock;
+ };
+ 
+ /* list of timers */
+@@ -215,11 +215,13 @@ static void snd_timer_check_master(struct 
snd_timer_instance *master)
+                   slave->slave_id == master->slave_id) {
+                       list_move_tail(&slave->open_list, 
&master->slave_list_head);
+                       spin_lock_irq(&slave_active_lock);
++                      spin_lock(&master->timer->lock);
+                       slave->master = master;
+                       slave->timer = master->timer;
+                       if (slave->flags & SNDRV_TIMER_IFLG_RUNNING)
+                               list_add_tail(&slave->active_list,
+                                             &master->slave_active_head);
++                      spin_unlock(&master->timer->lock);
+                       spin_unlock_irq(&slave_active_lock);
+               }
+       }
+@@ -345,15 +347,18 @@ int snd_timer_close(struct snd_timer_instance *timeri)
+                   timer->hw.close)
+                       timer->hw.close(timer);
+               /* remove slave links */
++              spin_lock_irq(&slave_active_lock);
++              spin_lock(&timer->lock);
+               list_for_each_entry_safe(slave, tmp, &timeri->slave_list_head,
+                                        open_list) {
+-                      spin_lock_irq(&slave_active_lock);
+-                      _snd_timer_stop(slave, 1, SNDRV_TIMER_EVENT_RESOLUTION);
+                       list_move_tail(&slave->open_list, 
&snd_timer_slave_list);
+                       slave->master = NULL;
+                       slave->timer = NULL;
+-                      spin_unlock_irq(&slave_active_lock);
++                      list_del_init(&slave->ack_list);
++                      list_del_init(&slave->active_list);
+               }
++              spin_unlock(&timer->lock);
++              spin_unlock_irq(&slave_active_lock);
+               mutex_unlock(&register_mutex);
+       }
+  out:
+@@ -440,9 +445,12 @@ static int snd_timer_start_slave(struct 
snd_timer_instance *timeri)
+ 
+       spin_lock_irqsave(&slave_active_lock, flags);
+       timeri->flags |= SNDRV_TIMER_IFLG_RUNNING;
+-      if (timeri->master)
++      if (timeri->master && timeri->timer) {
++              spin_lock(&timeri->timer->lock);
+               list_add_tail(&timeri->active_list,
+                             &timeri->master->slave_active_head);
++              spin_unlock(&timeri->timer->lock);
++      }
+       spin_unlock_irqrestore(&slave_active_lock, flags);
+       return 1; /* delayed start */
+ }
+@@ -488,6 +496,8 @@ static int _snd_timer_stop(struct snd_timer_instance * 
timeri,
+               if (!keep_flag) {
+                       spin_lock_irqsave(&slave_active_lock, flags);
+                       timeri->flags &= ~SNDRV_TIMER_IFLG_RUNNING;
++                      list_del_init(&timeri->ack_list);
++                      list_del_init(&timeri->active_list);
+                       spin_unlock_irqrestore(&slave_active_lock, flags);
+               }
+               goto __end;
+@@ -693,7 +703,7 @@ void snd_timer_interrupt(struct snd_timer * timer, 
unsigned long ticks_left)
+               } else {
+                       ti->flags &= ~SNDRV_TIMER_IFLG_RUNNING;
+                       if (--timer->running)
+-                              list_del(&ti->active_list);
++                              list_del_init(&ti->active_list);
+               }
+               if ((timer->hw.flags & SNDRV_TIMER_HW_TASKLET) ||
+                   (ti->flags & SNDRV_TIMER_IFLG_FAST))
+@@ -1256,7 +1266,7 @@ static int snd_timer_user_open(struct inode *inode, 
struct file *file)
+               return -ENOMEM;
+       spin_lock_init(&tu->qlock);
+       init_waitqueue_head(&tu->qchange_sleep);
+-      mutex_init(&tu->tread_sem);
++      mutex_init(&tu->ioctl_lock);
+       tu->ticks = 1;
+       tu->queue_size = 128;
+       tu->queue = kmalloc(tu->queue_size * sizeof(struct snd_timer_read),
+@@ -1276,8 +1286,10 @@ static int snd_timer_user_release(struct inode *inode, 
struct file *file)
+       if (file->private_data) {
+               tu = file->private_data;
+               file->private_data = NULL;
++              mutex_lock(&tu->ioctl_lock);
+               if (tu->timeri)
+                       snd_timer_close(tu->timeri);
++              mutex_unlock(&tu->ioctl_lock);
+               kfree(tu->queue);
+               kfree(tu->tqueue);
+               kfree(tu);
+@@ -1515,7 +1527,6 @@ static int snd_timer_user_tselect(struct file *file,
+       int err = 0;
+ 
+       tu = file->private_data;
+-      mutex_lock(&tu->tread_sem);
+       if (tu->timeri) {
+               snd_timer_close(tu->timeri);
+               tu->timeri = NULL;
+@@ -1559,7 +1570,6 @@ static int snd_timer_user_tselect(struct file *file,
+       }
+ 
+       __err:
+-              mutex_unlock(&tu->tread_sem);
+       return err;
+ }
+ 
+@@ -1772,7 +1782,7 @@ enum {
+       SNDRV_TIMER_IOCTL_PAUSE_OLD = _IO('T', 0x23),
+ };
+ 
+-static long snd_timer_user_ioctl(struct file *file, unsigned int cmd,
++static long __snd_timer_user_ioctl(struct file *file, unsigned int cmd,
+                                unsigned long arg)
+ {
+       struct snd_timer_user *tu;
+@@ -1789,17 +1799,11 @@ static long snd_timer_user_ioctl(struct file *file, 
unsigned int cmd,
+       {
+               int xarg;
+ 
+-              mutex_lock(&tu->tread_sem);
+-              if (tu->timeri) {       /* too late */
+-                      mutex_unlock(&tu->tread_sem);
++              if (tu->timeri) /* too late */
+                       return -EBUSY;
+-              }
+-              if (get_user(xarg, p)) {
+-                      mutex_unlock(&tu->tread_sem);
++              if (get_user(xarg, p))
+                       return -EFAULT;
+-              }
+               tu->tread = xarg ? 1 : 0;
+-              mutex_unlock(&tu->tread_sem);
+               return 0;
+       }
+       case SNDRV_TIMER_IOCTL_GINFO:
+@@ -1832,6 +1836,18 @@ static long snd_timer_user_ioctl(struct file *file, 
unsigned int cmd,
+       return -ENOTTY;
+ }
+ 
++static long snd_timer_user_ioctl(struct file *file, unsigned int cmd,
++                               unsigned long arg)
++{
++      struct snd_timer_user *tu = file->private_data;
++      long ret;
++
++      mutex_lock(&tu->ioctl_lock);
++      ret = __snd_timer_user_ioctl(file, cmd, arg);
++      mutex_unlock(&tu->ioctl_lock);
++      return ret;
++}
++
+ static int snd_timer_user_fasync(int fd, struct file * file, int on)
+ {
+       struct snd_timer_user *tu;
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
+index baf12f1a2820..6a5e36dc23e5 100644
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -1180,6 +1180,36 @@ static unsigned int azx_get_response(struct hda_bus 
*bus,
+               return azx_rirb_get_response(bus, addr);
+ }
+ 
++#ifdef CONFIG_PM_SLEEP
++/* put codec down to D3 at hibernation for Intel SKL+;
++ * otherwise BIOS may still access the codec and screw up the driver
++ */
++#define IS_SKL(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0xa170)
++#define IS_SKL_LP(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x9d70)
++#define IS_BXT(pci) ((pci)->vendor == 0x8086 && (pci)->device == 0x5a98)
++#define IS_SKL_PLUS(pci) (IS_SKL(pci) || IS_SKL_LP(pci) || IS_BXT(pci))
++
++static int azx_freeze_noirq(struct device *dev)
++{
++      struct pci_dev *pci = to_pci_dev(dev);
++
++      if (IS_SKL_PLUS(pci))
++              pci_set_power_state(pci, PCI_D3hot);
++
++      return 0;
++}
++
++static int azx_thaw_noirq(struct device *dev)
++{
++      struct pci_dev *pci = to_pci_dev(dev);
++
++      if (IS_SKL_PLUS(pci))
++              pci_set_power_state(pci, PCI_D0);
++
++      return 0;
++}
++#endif /* CONFIG_PM_SLEEP */
++
+ #ifdef CONFIG_PM
+ static void azx_power_notify(struct hda_bus *bus, bool power_up);
+ #endif
+@@ -3139,6 +3169,10 @@ static int azx_runtime_idle(struct device *dev)
+ #ifdef CONFIG_PM
+ static const struct dev_pm_ops azx_pm = {
+       SET_SYSTEM_SLEEP_PM_OPS(azx_suspend, azx_resume)
++#ifdef CONFIG_PM_SLEEP
++      .freeze_noirq = azx_freeze_noirq,
++      .thaw_noirq = azx_thaw_noirq,
++#endif
+       SET_RUNTIME_PM_OPS(azx_runtime_suspend, azx_runtime_resume, 
azx_runtime_idle)
+ };
+ 
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 1ec93efc8253..1dc0702ff818 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -1775,6 +1775,7 @@ enum {
+       ALC889_FIXUP_MBA11_VREF,
+       ALC889_FIXUP_MBA21_VREF,
+       ALC889_FIXUP_MP11_VREF,
++      ALC889_FIXUP_MP41_VREF,
+       ALC882_FIXUP_INV_DMIC,
+       ALC882_FIXUP_NO_PRIMARY_HP,
+       ALC887_FIXUP_ASUS_BASS,
+@@ -1861,7 +1862,7 @@ static void alc889_fixup_mbp_vref(struct hda_codec 
*codec,
+                                 const struct hda_fixup *fix, int action)
+ {
+       struct alc_spec *spec = codec->spec;
+-      static hda_nid_t nids[2] = { 0x14, 0x15 };
++      static hda_nid_t nids[3] = { 0x14, 0x15, 0x19 };
+       int i;
+ 
+       if (action != HDA_FIXUP_ACT_INIT)
+@@ -2137,6 +2138,12 @@ static const struct hda_fixup alc882_fixups[] = {
+               .chained = true,
+               .chain_id = ALC885_FIXUP_MACPRO_GPIO,
+       },
++      [ALC889_FIXUP_MP41_VREF] = {
++              .type = HDA_FIXUP_FUNC,
++              .v.func = alc889_fixup_mbp_vref,
++              .chained = true,
++              .chain_id = ALC885_FIXUP_MACPRO_GPIO,
++      },
+       [ALC882_FIXUP_INV_DMIC] = {
+               .type = HDA_FIXUP_FUNC,
+               .v.func = alc_fixup_inv_dmic_0x12,
+@@ -2209,7 +2216,7 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x106b, 0x3f00, "Macbook 5,1", ALC889_FIXUP_IMAC91_VREF),
+       SND_PCI_QUIRK(0x106b, 0x4000, "MacbookPro 5,1", 
ALC889_FIXUP_IMAC91_VREF),
+       SND_PCI_QUIRK(0x106b, 0x4100, "Macmini 3,1", ALC889_FIXUP_IMAC91_VREF),
+-      SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 5,1", ALC885_FIXUP_MACPRO_GPIO),
++      SND_PCI_QUIRK(0x106b, 0x4200, "Mac Pro 4,1/5,1", 
ALC889_FIXUP_MP41_VREF),
+       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),
+@@ -4956,6 +4963,7 @@ static const struct hda_fixup alc662_fixups[] = {
+ static const struct snd_pci_quirk alc662_fixup_tbl[] = {
+       SND_PCI_QUIRK(0x1019, 0x9087, "ECS", ALC662_FIXUP_ASUS_MODE2),
+       SND_PCI_QUIRK(0x1025, 0x022f, "Acer Aspire One", ALC662_FIXUP_INV_DMIC),
++      SND_PCI_QUIRK(0x1025, 0x0241, "Packard Bell DOTS", 
ALC662_FIXUP_INV_DMIC),
+       SND_PCI_QUIRK(0x1025, 0x0308, "Acer Aspire 8942G", ALC662_FIXUP_ASPIRE),
+       SND_PCI_QUIRK(0x1025, 0x031c, "Gateway NV79", ALC662_FIXUP_SKU_IGNORE),
+       SND_PCI_QUIRK(0x1025, 0x0349, "eMachines eM250", ALC662_FIXUP_INV_DMIC),
+diff --git a/sound/pci/rme96.c b/sound/pci/rme96.c
+index bb9ebc5543d7..2da24272e6a5 100644
+--- a/sound/pci/rme96.c
++++ b/sound/pci/rme96.c
+@@ -744,10 +744,11 @@ snd_rme96_playback_setrate(struct rme96 *rme96,
+       {
+               /* change to/from double-speed: reset the DAC (if available) */
+               snd_rme96_reset_dac(rme96);
++              return 1; /* need to restore volume */
+       } else {
+               writel(rme96->wcreg, rme96->iobase + RME96_IO_CONTROL_REGISTER);
++              return 0;
+       }
+-      return 0;
+ }
+ 
+ static int
+@@ -985,6 +986,7 @@ snd_rme96_playback_hw_params(struct snd_pcm_substream 
*substream,
+       struct rme96 *rme96 = snd_pcm_substream_chip(substream);
+       struct snd_pcm_runtime *runtime = substream->runtime;
+       int err, rate, dummy;
++      bool apply_dac_volume = false;
+ 
+       runtime->dma_area = (void __force *)(rme96->iobase +
+                                            RME96_IO_PLAY_BUFFER);
+@@ -998,24 +1000,26 @@ snd_rme96_playback_hw_params(struct snd_pcm_substream 
*substream,
+       {
+                 /* slave clock */
+                 if ((int)params_rate(params) != rate) {
+-                      spin_unlock_irq(&rme96->lock);
+-                      return -EIO;                    
+-                }
+-      } else if ((err = snd_rme96_playback_setrate(rme96, 
params_rate(params))) < 0) {
+-              spin_unlock_irq(&rme96->lock);
+-              return err;
+-      }
+-      if ((err = snd_rme96_playback_setformat(rme96, params_format(params))) 
< 0) {
+-              spin_unlock_irq(&rme96->lock);
+-              return err;
++                      err = -EIO;
++                      goto error;
++              }
++      } else {
++              err = snd_rme96_playback_setrate(rme96, params_rate(params));
++              if (err < 0)
++                      goto error;
++              apply_dac_volume = err > 0; /* need to restore volume later? */
+       }
++
++      err = snd_rme96_playback_setformat(rme96, params_format(params));
++      if (err < 0)
++              goto error;
+       snd_rme96_setframelog(rme96, params_channels(params), 1);
+       if (rme96->capture_periodsize != 0) {
+               if (params_period_size(params) << rme96->playback_frlog !=
+                   rme96->capture_periodsize)
+               {
+-                      spin_unlock_irq(&rme96->lock);
+-                      return -EBUSY;
++                      err = -EBUSY;
++                      goto error;
+               }
+       }
+       rme96->playback_periodsize =
+@@ -1026,9 +1030,16 @@ snd_rme96_playback_hw_params(struct snd_pcm_substream 
*substream,
+               rme96->wcreg &= ~(RME96_WCR_PRO | RME96_WCR_DOLBY | 
RME96_WCR_EMP);
+               writel(rme96->wcreg |= rme96->wcreg_spdif_stream, rme96->iobase 
+ RME96_IO_CONTROL_REGISTER);
+       }
++
++      err = 0;
++ error:
+       spin_unlock_irq(&rme96->lock);
+-              
+-      return 0;
++      if (apply_dac_volume) {
++              usleep_range(3000, 10000);
++              snd_rme96_apply_dac_volume(rme96);
++      }
++
++      return err;
+ }
+ 
+ static int
+diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c
+index f38ed4d225ca..26a5925b5c51 100644
+--- a/sound/soc/codecs/arizona.c
++++ b/sound/soc/codecs/arizona.c
+@@ -1120,7 +1120,7 @@ static int arizona_hw_params(struct snd_pcm_substream 
*substream,
+       int chan_limit = arizona->pdata.max_channels_clocked[dai->id - 1];
+       int bclk, lrclk, wl, frame, bclk_target;
+ 
+-      if (params_rate(params) % 8000)
++      if (params_rate(params) % 4000)
+               rates = &arizona_44k1_bclk_rates[0];
+       else
+               rates = &arizona_48k_bclk_rates[0];
+diff --git a/sound/soc/codecs/wm8962.c b/sound/soc/codecs/wm8962.c
+index ea16dc456352..c2cd83d8ed97 100644
+--- a/sound/soc/codecs/wm8962.c
++++ b/sound/soc/codecs/wm8962.c
+@@ -364,8 +364,8 @@ static struct reg_default wm8962_reg[] = {
+       { 16924, 0x0059 },   /* R16924 - HDBASS_PG_1 */
+       { 16925, 0x999A },   /* R16925 - HDBASS_PG_0 */
+ 
+-      { 17048, 0x0083 },   /* R17408 - HPF_C_1 */
+-      { 17049, 0x98AD },   /* R17409 - HPF_C_0 */
++      { 17408, 0x0083 },   /* R17408 - HPF_C_1 */
++      { 17409, 0x98AD },   /* R17409 - HPF_C_0 */
+ 
+       { 17920, 0x007F },   /* R17920 - ADCL_RETUNE_C1_1 */
+       { 17921, 0xFFFF },   /* R17921 - ADCL_RETUNE_C1_0 */
+diff --git a/sound/soc/soc-compress.c b/sound/soc/soc-compress.c
+index 53c9ecdd119f..2868a17ff9a8 100644
+--- a/sound/soc/soc-compress.c
++++ b/sound/soc/soc-compress.c
+@@ -385,17 +385,34 @@ int soc_new_compress(struct snd_soc_pcm_runtime *rtd, 
int num)
+       struct snd_compr *compr;
+       char new_name[64];
+       int ret = 0, direction = 0;
++      int playback = 0, capture = 0;
+ 
+       /* check client and interface hw capabilities */
+       snprintf(new_name, sizeof(new_name), "%s %s-%d",
+                       rtd->dai_link->stream_name, codec_dai->name, num);
+ 
+       if (codec_dai->driver->playback.channels_min)
++              playback = 1;
++      if (codec_dai->driver->capture.channels_min)
++              capture = 1;
++
++      capture = capture && cpu_dai->driver->capture.channels_min;
++      playback = playback && cpu_dai->driver->playback.channels_min;
++
++      /*
++       * Compress devices are unidirectional so only one of the directions
++       * should be set, check for that (xor)
++       */
++      if (playback + capture != 1) {
++              dev_err(rtd->card->dev, "Invalid direction for compress P %d, C 
%d\n",
++                              playback, capture);
++              return -EINVAL;
++      }
++
++      if(playback)
+               direction = SND_COMPRESS_PLAYBACK;
+-      else if (codec_dai->driver->capture.channels_min)
+-              direction = SND_COMPRESS_CAPTURE;
+       else
+-              return -EINVAL;
++              direction = SND_COMPRESS_CAPTURE;
+ 
+       compr = kzalloc(sizeof(*compr), GFP_KERNEL);
+       if (compr == NULL) {

Reply via email to