commit:     19310fab2a1e398244a80a13bf0f323ebc210d22
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Thu May 12 11:31:30 2022 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Thu May 12 11:31:30 2022 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=19310fab

Linux patch 4.14.278

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README               |    4 +
 1277_linux-4.14.278.patch | 2263 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 2267 insertions(+)

diff --git a/0000_README b/0000_README
index 46d6c89f..108646a6 100644
--- a/0000_README
+++ b/0000_README
@@ -1155,6 +1155,10 @@ Patch:  1276_linux-4.14.277.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.14.277
 
+Patch:  1277_linux-4.14.278.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.14.278
+
 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/1277_linux-4.14.278.patch b/1277_linux-4.14.278.patch
new file mode 100644
index 00000000..bce722a7
--- /dev/null
+++ b/1277_linux-4.14.278.patch
@@ -0,0 +1,2263 @@
+diff --git a/Makefile b/Makefile
+index ef5240c915f45..9e6373f02d6c5 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 14
+-SUBLEVEL = 277
++SUBLEVEL = 278
+ EXTRAVERSION =
+ NAME = Petit Gorille
+ 
+diff --git a/arch/arm/boot/dts/imx6qdl-apalis.dtsi 
b/arch/arm/boot/dts/imx6qdl-apalis.dtsi
+index ea339fa58f4a5..2477883c0efb0 100644
+--- a/arch/arm/boot/dts/imx6qdl-apalis.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-apalis.dtsi
+@@ -316,6 +316,8 @@
+       codec: sgtl5000@0a {
+               compatible = "fsl,sgtl5000";
+               reg = <0x0a>;
++              pinctrl-names = "default";
++              pinctrl-0 = <&pinctrl_sgtl5000>;
+               clocks = <&clks IMX6QDL_CLK_CKO>;
+               VDDA-supply = <&reg_2p5v>;
+               VDDIO-supply = <&reg_3p3v>;
+@@ -543,8 +545,6 @@
+                       MX6QDL_PAD_DISP0_DAT21__AUD4_TXD        0x130b0
+                       MX6QDL_PAD_DISP0_DAT22__AUD4_TXFS       0x130b0
+                       MX6QDL_PAD_DISP0_DAT23__AUD4_RXD        0x130b0
+-                      /* SGTL5000 sys_mclk */
+-                      MX6QDL_PAD_GPIO_5__CCM_CLKO1            0x130b0
+               >;
+       };
+ 
+@@ -810,6 +810,12 @@
+               >;
+       };
+ 
++      pinctrl_sgtl5000: sgtl5000grp {
++              fsl,pins = <
++                      MX6QDL_PAD_GPIO_5__CCM_CLKO1    0x130b0
++              >;
++      };
++
+       pinctrl_spdif: spdifgrp {
+               fsl,pins = <
+                       MX6QDL_PAD_GPIO_16__SPDIF_IN  0x1b0b0
+diff --git a/arch/arm/boot/dts/omap3-gta04.dtsi 
b/arch/arm/boot/dts/omap3-gta04.dtsi
+index ee028aa663fa6..312267724033a 100644
+--- a/arch/arm/boot/dts/omap3-gta04.dtsi
++++ b/arch/arm/boot/dts/omap3-gta04.dtsi
+@@ -29,6 +29,8 @@
+       aliases {
+               display0 = &lcd;
+               display1 = &tv0;
++              /delete-property/ mmc2;
++              /delete-property/ mmc3;
+       };
+ 
+       gpio-keys {
+diff --git a/arch/arm/mach-omap2/omap4-common.c 
b/arch/arm/mach-omap2/omap4-common.c
+index e5dcbda20129d..7fff67ea7bcd3 100644
+--- a/arch/arm/mach-omap2/omap4-common.c
++++ b/arch/arm/mach-omap2/omap4-common.c
+@@ -342,10 +342,12 @@ void __init omap_gic_of_init(void)
+ 
+       np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-gic");
+       gic_dist_base_addr = of_iomap(np, 0);
++      of_node_put(np);
+       WARN_ON(!gic_dist_base_addr);
+ 
+       np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-twd-timer");
+       twd_base = of_iomap(np, 0);
++      of_node_put(np);
+       WARN_ON(!twd_base);
+ 
+ skip_errata_init:
+diff --git a/arch/mips/include/asm/timex.h b/arch/mips/include/asm/timex.h
+index b05bb70a2e46f..8026baf46e729 100644
+--- a/arch/mips/include/asm/timex.h
++++ b/arch/mips/include/asm/timex.h
+@@ -40,9 +40,9 @@
+ typedef unsigned int cycles_t;
+ 
+ /*
+- * On R4000/R4400 before version 5.0 an erratum exists such that if the
+- * cycle counter is read in the exact moment that it is matching the
+- * compare register, no interrupt will be generated.
++ * On R4000/R4400 an erratum exists such that if the cycle counter is
++ * read in the exact moment that it is matching the compare register,
++ * no interrupt will be generated.
+  *
+  * There is a suggested workaround and also the erratum can't strike if
+  * the compare interrupt isn't being used as the clock source device.
+@@ -63,7 +63,7 @@ static inline int can_use_mips_counter(unsigned int prid)
+       if (!__builtin_constant_p(cpu_has_counter))
+               asm volatile("" : "=m" (cpu_data[0].options));
+       if (likely(cpu_has_counter &&
+-                 prid >= (PRID_IMP_R4000 | PRID_REV_ENCODE_44(5, 0))))
++                 prid > (PRID_IMP_R4000 | PRID_REV_ENCODE_44(15, 15))))
+               return 1;
+       else
+               return 0;
+diff --git a/arch/mips/kernel/time.c b/arch/mips/kernel/time.c
+index 79ebf349aab4a..060a03702b5a4 100644
+--- a/arch/mips/kernel/time.c
++++ b/arch/mips/kernel/time.c
+@@ -155,15 +155,10 @@ static __init int cpu_has_mfc0_count_bug(void)
+       case CPU_R4400MC:
+               /*
+                * The published errata for the R4400 up to 3.0 say the CPU
+-               * has the mfc0 from count bug.
++               * has the mfc0 from count bug.  This seems the last version
++               * produced.
+                */
+-              if ((current_cpu_data.processor_id & 0xff) <= 0x30)
+-                      return 1;
+-
+-              /*
+-               * we assume newer revisions are ok
+-               */
+-              return 0;
++              return 1;
+       }
+ 
+       return 0;
+diff --git a/arch/parisc/kernel/processor.c b/arch/parisc/kernel/processor.c
+index e120d63c1b285..58ece781a1767 100644
+--- a/arch/parisc/kernel/processor.c
++++ b/arch/parisc/kernel/processor.c
+@@ -408,8 +408,7 @@ show_cpuinfo (struct seq_file *m, void *v)
+               }
+               seq_printf(m, " (0x%02lx)\n", boot_cpu_data.pdc.capabilities);
+ 
+-              seq_printf(m, "model\t\t: %s\n"
+-                              "model name\t: %s\n",
++              seq_printf(m, "model\t\t: %s - %s\n",
+                                boot_cpu_data.pdc.sys_model_name,
+                                cpuinfo->dev ?
+                                cpuinfo->dev->name : "Unknown");
+diff --git a/arch/x86/include/asm/microcode.h 
b/arch/x86/include/asm/microcode.h
+index 6cf0e4cb7b976..c11755bddea2a 100644
+--- a/arch/x86/include/asm/microcode.h
++++ b/arch/x86/include/asm/microcode.h
+@@ -147,11 +147,13 @@ extern void load_ucode_ap(void);
+ void reload_early_microcode(void);
+ extern bool get_builtin_firmware(struct cpio_data *cd, const char *name);
+ extern bool initrd_gone;
++void microcode_bsp_resume(void);
+ #else
+ static inline int __init microcode_init(void)                 { return 0; };
+ static inline void __init load_ucode_bsp(void)                        { }
+ static inline void load_ucode_ap(void)                                { }
+ static inline void reload_early_microcode(void)                       { }
++static inline void microcode_bsp_resume(void)                 { }
+ static inline bool
+ get_builtin_firmware(struct cpio_data *cd, const char *name)  { return false; 
}
+ #endif
+diff --git a/arch/x86/kernel/cpu/microcode/core.c 
b/arch/x86/kernel/cpu/microcode/core.c
+index 51583a5d656d2..78ac8c33a16e4 100644
+--- a/arch/x86/kernel/cpu/microcode/core.c
++++ b/arch/x86/kernel/cpu/microcode/core.c
+@@ -773,9 +773,9 @@ static struct subsys_interface mc_cpu_interface = {
+ };
+ 
+ /**
+- * mc_bp_resume - Update boot CPU microcode during resume.
++ * microcode_bsp_resume - Update boot CPU microcode during resume.
+  */
+-static void mc_bp_resume(void)
++void microcode_bsp_resume(void)
+ {
+       int cpu = smp_processor_id();
+       struct ucode_cpu_info *uci = ucode_cpu_info + cpu;
+@@ -787,7 +787,7 @@ static void mc_bp_resume(void)
+ }
+ 
+ static struct syscore_ops mc_syscore_ops = {
+-      .resume                 = mc_bp_resume,
++      .resume                 = microcode_bsp_resume,
+ };
+ 
+ static int mc_cpu_starting(unsigned int cpu)
+diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
+index 7e1ab0e0f3f2f..fd1eb8600ccf6 100644
+--- a/arch/x86/kvm/cpuid.c
++++ b/arch/x86/kvm/cpuid.c
+@@ -517,6 +517,11 @@ static inline int __do_cpuid_ent(struct kvm_cpuid_entry2 
*entry, u32 function,
+               union cpuid10_eax eax;
+               union cpuid10_edx edx;
+ 
++              if (!static_cpu_has(X86_FEATURE_ARCH_PERFMON)) {
++                      entry->eax = entry->ebx = entry->ecx = entry->edx = 0;
++                      break;
++              }
++
+               perf_get_x86_pmu_capability(&cap);
+ 
+               /*
+diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c
+index 2c3b4bcbe8f21..0650b440b389f 100644
+--- a/arch/x86/lib/usercopy_64.c
++++ b/arch/x86/lib/usercopy_64.c
+@@ -140,7 +140,7 @@ void memcpy_flushcache(void *_dst, const void *_src, 
size_t size)
+ 
+       /* cache copy and flush to align dest */
+       if (!IS_ALIGNED(dest, 8)) {
+-              unsigned len = min_t(unsigned, size, ALIGN(dest, 8) - dest);
++              size_t len = min_t(size_t, size, ALIGN(dest, 8) - dest);
+ 
+               memcpy((void *) dest, (void *) source, len);
+               clean_cache_range((void *) dest, len);
+diff --git a/arch/x86/power/cpu.c b/arch/x86/power/cpu.c
+index e00b8c36ab721..7948249482637 100644
+--- a/arch/x86/power/cpu.c
++++ b/arch/x86/power/cpu.c
+@@ -26,6 +26,7 @@
+ #include <asm/cpu.h>
+ #include <asm/mmu_context.h>
+ #include <asm/cpu_device_id.h>
++#include <asm/microcode.h>
+ 
+ #ifdef CONFIG_X86_32
+ __visible unsigned long saved_context_ebx;
+@@ -268,6 +269,13 @@ static void notrace __restore_processor_state(struct 
saved_context *ctxt)
+       x86_platform.restore_sched_clock_state();
+       mtrr_bp_restore();
+       perf_restore_debug_store();
++
++      microcode_bsp_resume();
++
++      /*
++       * This needs to happen after the microcode has been updated upon resume
++       * because some of the MSRs are "emulated" in microcode.
++       */
+       msr_restore_context(ctxt);
+ }
+ 
+diff --git a/drivers/block/Kconfig b/drivers/block/Kconfig
+index ef702fdb2f92a..6c60b1a63cc61 100644
+--- a/drivers/block/Kconfig
++++ b/drivers/block/Kconfig
+@@ -35,6 +35,22 @@ config BLK_DEV_FD
+         To compile this driver as a module, choose M here: the
+         module will be called floppy.
+ 
++config BLK_DEV_FD_RAWCMD
++      bool "Support for raw floppy disk commands (DEPRECATED)"
++      depends on BLK_DEV_FD
++      help
++        If you want to use actual physical floppies and expect to do
++        special low-level hardware accesses to them (access and use
++        non-standard formats, for example), then enable this.
++
++        Note that the code enabled by this option is rarely used and
++        might be unstable or insecure, and distros should not enable it.
++
++        Note: FDRAWCMD is deprecated and will be removed from the kernel
++        in the near future.
++
++        If unsure, say N.
++
+ config AMIGA_FLOPPY
+       tristate "Amiga floppy support"
+       depends on AMIGA
+diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
+index 057bedeaacab5..77f84e906326e 100644
+--- a/drivers/block/floppy.c
++++ b/drivers/block/floppy.c
+@@ -3018,6 +3018,8 @@ static const char *drive_name(int type, int drive)
+               return "(null)";
+ }
+ 
++#ifdef CONFIG_BLK_DEV_FD_RAWCMD
++
+ /* raw commands */
+ static void raw_cmd_done(int flag)
+ {
+@@ -3229,6 +3231,35 @@ static int raw_cmd_ioctl(int cmd, void __user *param)
+       return ret;
+ }
+ 
++static int floppy_raw_cmd_ioctl(int type, int drive, int cmd,
++                              void __user *param)
++{
++      int ret;
++
++      pr_warn_once("Note: FDRAWCMD is deprecated and will be removed from the 
kernel in the near future.\n");
++
++      if (type)
++              return -EINVAL;
++      if (lock_fdc(drive))
++              return -EINTR;
++      set_floppy(drive);
++      ret = raw_cmd_ioctl(cmd, param);
++      if (ret == -EINTR)
++              return -EINTR;
++      process_fd_request();
++      return ret;
++}
++
++#else /* CONFIG_BLK_DEV_FD_RAWCMD */
++
++static int floppy_raw_cmd_ioctl(int type, int drive, int cmd,
++                              void __user *param)
++{
++      return -EOPNOTSUPP;
++}
++
++#endif
++
+ static int invalidate_drive(struct block_device *bdev)
+ {
+       /* invalidate the buffer track to force a reread */
+@@ -3416,7 +3447,6 @@ static int fd_locked_ioctl(struct block_device *bdev, 
fmode_t mode, unsigned int
+ {
+       int drive = (long)bdev->bd_disk->private_data;
+       int type = ITYPE(UDRS->fd_device);
+-      int i;
+       int ret;
+       int size;
+       union inparam {
+@@ -3567,16 +3597,7 @@ static int fd_locked_ioctl(struct block_device *bdev, 
fmode_t mode, unsigned int
+               outparam = UDRWE;
+               break;
+       case FDRAWCMD:
+-              if (type)
+-                      return -EINVAL;
+-              if (lock_fdc(drive))
+-                      return -EINTR;
+-              set_floppy(drive);
+-              i = raw_cmd_ioctl(cmd, (void __user *)param);
+-              if (i == -EINTR)
+-                      return -EINTR;
+-              process_fd_request();
+-              return i;
++              return floppy_raw_cmd_ioctl(type, drive, cmd, (void __user 
*)param);
+       case FDTWADDLE:
+               if (lock_fdc(drive))
+                       return -EINTR;
+diff --git a/drivers/bus/sunxi-rsb.c b/drivers/bus/sunxi-rsb.c
+index 2ca2cc56bcef6..b85d013a9185f 100644
+--- a/drivers/bus/sunxi-rsb.c
++++ b/drivers/bus/sunxi-rsb.c
+@@ -224,6 +224,8 @@ static struct sunxi_rsb_device 
*sunxi_rsb_device_create(struct sunxi_rsb *rsb,
+ 
+       dev_dbg(&rdev->dev, "device %s registered\n", dev_name(&rdev->dev));
+ 
++      return rdev;
++
+ err_device_add:
+       put_device(&rdev->dev);
+ 
+diff --git a/drivers/clk/sunxi/clk-sun9i-mmc.c 
b/drivers/clk/sunxi/clk-sun9i-mmc.c
+index f69f9e8c6f380..7e9d1624032fe 100644
+--- a/drivers/clk/sunxi/clk-sun9i-mmc.c
++++ b/drivers/clk/sunxi/clk-sun9i-mmc.c
+@@ -117,6 +117,8 @@ static int sun9i_a80_mmc_config_clk_probe(struct 
platform_device *pdev)
+       spin_lock_init(&data->lock);
+ 
+       r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
++      if (!r)
++              return -EINVAL;
+       /* one clock/reset pair per word */
+       count = DIV_ROUND_UP((resource_size(r)), SUN9I_MMC_WIDTH);
+       data->membase = devm_ioremap_resource(&pdev->dev, r);
+diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c
+index 57ea7f4641787..11c634125c7df 100644
+--- a/drivers/firewire/core-card.c
++++ b/drivers/firewire/core-card.c
+@@ -681,6 +681,7 @@ EXPORT_SYMBOL_GPL(fw_card_release);
+ void fw_core_remove_card(struct fw_card *card)
+ {
+       struct fw_card_driver dummy_driver = dummy_driver_template;
++      unsigned long flags;
+ 
+       card->driver->update_phy_reg(card, 4,
+                                    PHY_LINK_ACTIVE | PHY_CONTENDER, 0);
+@@ -695,7 +696,9 @@ void fw_core_remove_card(struct fw_card *card)
+       dummy_driver.stop_iso           = card->driver->stop_iso;
+       card->driver = &dummy_driver;
+ 
++      spin_lock_irqsave(&card->lock, flags);
+       fw_destroy_nodes(card);
++      spin_unlock_irqrestore(&card->lock, flags);
+ 
+       /* Wait for all users, especially device workqueue jobs, to finish. */
+       fw_card_put(card);
+diff --git a/drivers/firewire/core-cdev.c b/drivers/firewire/core-cdev.c
+index a301fcf46e882..00cea6cb5ef7d 100644
+--- a/drivers/firewire/core-cdev.c
++++ b/drivers/firewire/core-cdev.c
+@@ -1495,6 +1495,7 @@ static void outbound_phy_packet_callback(struct 
fw_packet *packet,
+ {
+       struct outbound_phy_packet_event *e =
+               container_of(packet, struct outbound_phy_packet_event, p);
++      struct client *e_client;
+ 
+       switch (status) {
+       /* expected: */
+@@ -1511,9 +1512,10 @@ static void outbound_phy_packet_callback(struct 
fw_packet *packet,
+       }
+       e->phy_packet.data[0] = packet->timestamp;
+ 
++      e_client = e->client;
+       queue_event(e->client, &e->event, &e->phy_packet,
+                   sizeof(e->phy_packet) + e->phy_packet.length, NULL, 0);
+-      client_put(e->client);
++      client_put(e_client);
+ }
+ 
+ static int ioctl_send_phy_packet(struct client *client, union ioctl_arg *arg)
+diff --git a/drivers/firewire/core-topology.c 
b/drivers/firewire/core-topology.c
+index 939d259ddf191..ea9c032d784c9 100644
+--- a/drivers/firewire/core-topology.c
++++ b/drivers/firewire/core-topology.c
+@@ -387,16 +387,13 @@ static void report_found_node(struct fw_card *card,
+       card->bm_retries = 0;
+ }
+ 
++/* Must be called with card->lock held */
+ void fw_destroy_nodes(struct fw_card *card)
+ {
+-      unsigned long flags;
+-
+-      spin_lock_irqsave(&card->lock, flags);
+       card->color++;
+       if (card->local_node != NULL)
+               for_each_fw_node(card, card->local_node, report_lost_node);
+       card->local_node = NULL;
+-      spin_unlock_irqrestore(&card->lock, flags);
+ }
+ 
+ static void move_tree(struct fw_node *node0, struct fw_node *node1, int port)
+@@ -522,6 +519,8 @@ void fw_core_handle_bus_reset(struct fw_card *card, int 
node_id, int generation,
+       struct fw_node *local_node;
+       unsigned long flags;
+ 
++      spin_lock_irqsave(&card->lock, flags);
++
+       /*
+        * If the selfID buffer is not the immediate successor of the
+        * previously processed one, we cannot reliably compare the
+@@ -533,8 +532,6 @@ void fw_core_handle_bus_reset(struct fw_card *card, int 
node_id, int generation,
+               card->bm_retries = 0;
+       }
+ 
+-      spin_lock_irqsave(&card->lock, flags);
+-
+       card->broadcast_channel_allocated = 
card->broadcast_channel_auto_allocated;
+       card->node_id = node_id;
+       /*
+diff --git a/drivers/firewire/core-transaction.c 
b/drivers/firewire/core-transaction.c
+index d6a09b9cd8cca..0446221d7d2e3 100644
+--- a/drivers/firewire/core-transaction.c
++++ b/drivers/firewire/core-transaction.c
+@@ -86,24 +86,25 @@ static int try_cancel_split_timeout(struct fw_transaction 
*t)
+ static int close_transaction(struct fw_transaction *transaction,
+                            struct fw_card *card, int rcode)
+ {
+-      struct fw_transaction *t;
++      struct fw_transaction *t = NULL, *iter;
+       unsigned long flags;
+ 
+       spin_lock_irqsave(&card->lock, flags);
+-      list_for_each_entry(t, &card->transaction_list, link) {
+-              if (t == transaction) {
+-                      if (!try_cancel_split_timeout(t)) {
++      list_for_each_entry(iter, &card->transaction_list, link) {
++              if (iter == transaction) {
++                      if (!try_cancel_split_timeout(iter)) {
+                               spin_unlock_irqrestore(&card->lock, flags);
+                               goto timed_out;
+                       }
+-                      list_del_init(&t->link);
+-                      card->tlabel_mask &= ~(1ULL << t->tlabel);
++                      list_del_init(&iter->link);
++                      card->tlabel_mask &= ~(1ULL << iter->tlabel);
++                      t = iter;
+                       break;
+               }
+       }
+       spin_unlock_irqrestore(&card->lock, flags);
+ 
+-      if (&t->link != &card->transaction_list) {
++      if (t) {
+               t->callback(card, rcode, NULL, 0, t->callback_data);
+               return 0;
+       }
+@@ -938,7 +939,7 @@ EXPORT_SYMBOL(fw_core_handle_request);
+ 
+ void fw_core_handle_response(struct fw_card *card, struct fw_packet *p)
+ {
+-      struct fw_transaction *t;
++      struct fw_transaction *t = NULL, *iter;
+       unsigned long flags;
+       u32 *data;
+       size_t data_length;
+@@ -950,20 +951,21 @@ void fw_core_handle_response(struct fw_card *card, 
struct fw_packet *p)
+       rcode   = HEADER_GET_RCODE(p->header[1]);
+ 
+       spin_lock_irqsave(&card->lock, flags);
+-      list_for_each_entry(t, &card->transaction_list, link) {
+-              if (t->node_id == source && t->tlabel == tlabel) {
+-                      if (!try_cancel_split_timeout(t)) {
++      list_for_each_entry(iter, &card->transaction_list, link) {
++              if (iter->node_id == source && iter->tlabel == tlabel) {
++                      if (!try_cancel_split_timeout(iter)) {
+                               spin_unlock_irqrestore(&card->lock, flags);
+                               goto timed_out;
+                       }
+-                      list_del_init(&t->link);
+-                      card->tlabel_mask &= ~(1ULL << t->tlabel);
++                      list_del_init(&iter->link);
++                      card->tlabel_mask &= ~(1ULL << iter->tlabel);
++                      t = iter;
+                       break;
+               }
+       }
+       spin_unlock_irqrestore(&card->lock, flags);
+ 
+-      if (&t->link == &card->transaction_list) {
++      if (!t) {
+  timed_out:
+               fw_notice(card, "unsolicited response (source %x, tlabel %x)\n",
+                         source, tlabel);
+diff --git a/drivers/firewire/sbp2.c b/drivers/firewire/sbp2.c
+index 6bac03999fd49..d418a71faf0b1 100644
+--- a/drivers/firewire/sbp2.c
++++ b/drivers/firewire/sbp2.c
+@@ -421,7 +421,7 @@ static void sbp2_status_write(struct fw_card *card, struct 
fw_request *request,
+                             void *payload, size_t length, void *callback_data)
+ {
+       struct sbp2_logical_unit *lu = callback_data;
+-      struct sbp2_orb *orb;
++      struct sbp2_orb *orb = NULL, *iter;
+       struct sbp2_status status;
+       unsigned long flags;
+ 
+@@ -446,17 +446,18 @@ static void sbp2_status_write(struct fw_card *card, 
struct fw_request *request,
+ 
+       /* Lookup the orb corresponding to this status write. */
+       spin_lock_irqsave(&lu->tgt->lock, flags);
+-      list_for_each_entry(orb, &lu->orb_list, link) {
++      list_for_each_entry(iter, &lu->orb_list, link) {
+               if (STATUS_GET_ORB_HIGH(status) == 0 &&
+-                  STATUS_GET_ORB_LOW(status) == orb->request_bus) {
+-                      orb->rcode = RCODE_COMPLETE;
+-                      list_del(&orb->link);
++                  STATUS_GET_ORB_LOW(status) == iter->request_bus) {
++                      iter->rcode = RCODE_COMPLETE;
++                      list_del(&iter->link);
++                      orb = iter;
+                       break;
+               }
+       }
+       spin_unlock_irqrestore(&lu->tgt->lock, flags);
+ 
+-      if (&orb->link != &lu->orb_list) {
++      if (orb) {
+               orb->callback(orb, &status);
+               kref_put(&orb->kref, free_orb); /* orb callback reference */
+       } else {
+diff --git a/drivers/gpu/drm/vgem/vgem_drv.c b/drivers/gpu/drm/vgem/vgem_drv.c
+index 67037eb9a80ee..a1f976270a895 100644
+--- a/drivers/gpu/drm/vgem/vgem_drv.c
++++ b/drivers/gpu/drm/vgem/vgem_drv.c
+@@ -190,9 +190,10 @@ static struct drm_gem_object *vgem_gem_create(struct 
drm_device *dev,
+               return ERR_CAST(obj);
+ 
+       ret = drm_gem_handle_create(file, &obj->base, handle);
+-      drm_gem_object_put_unlocked(&obj->base);
+-      if (ret)
++      if (ret) {
++              drm_gem_object_put_unlocked(&obj->base);
+               return ERR_PTR(ret);
++      }
+ 
+       return &obj->base;
+ }
+@@ -215,7 +216,9 @@ static int vgem_gem_dumb_create(struct drm_file *file, 
struct drm_device *dev,
+       args->size = gem_object->size;
+       args->pitch = pitch;
+ 
+-      DRM_DEBUG_DRIVER("Created object of size %lld\n", size);
++      drm_gem_object_put_unlocked(gem_object);
++
++      DRM_DEBUG_DRIVER("Created object of size %llu\n", args->size);
+ 
+       return 0;
+ }
+diff --git a/drivers/hwmon/adt7470.c b/drivers/hwmon/adt7470.c
+index 2cd920751441d..6876e3817850d 100644
+--- a/drivers/hwmon/adt7470.c
++++ b/drivers/hwmon/adt7470.c
+@@ -33,6 +33,7 @@
+ #include <linux/kthread.h>
+ #include <linux/slab.h>
+ #include <linux/util_macros.h>
++#include <linux/sched.h>
+ 
+ /* Addresses to scan */
+ static const unsigned short normal_i2c[] = { 0x2C, 0x2E, 0x2F, I2C_CLIENT_END 
};
+@@ -273,11 +274,10 @@ static int adt7470_update_thread(void *p)
+               adt7470_read_temperatures(client, data);
+               mutex_unlock(&data->lock);
+ 
+-              set_current_state(TASK_INTERRUPTIBLE);
+               if (kthread_should_stop())
+                       break;
+ 
+-              schedule_timeout(msecs_to_jiffies(data->auto_update_interval));
++              
schedule_timeout_interruptible(msecs_to_jiffies(data->auto_update_interval));
+       }
+ 
+       return 0;
+diff --git a/drivers/iio/dac/ad5446.c b/drivers/iio/dac/ad5446.c
+index d3a3d62869d83..86de972f41b11 100644
+--- a/drivers/iio/dac/ad5446.c
++++ b/drivers/iio/dac/ad5446.c
+@@ -171,7 +171,7 @@ static int ad5446_read_raw(struct iio_dev *indio_dev,
+ 
+       switch (m) {
+       case IIO_CHAN_INFO_RAW:
+-              *val = st->cached_val;
++              *val = st->cached_val >> chan->scan_type.shift;
+               return IIO_VAL_INT;
+       case IIO_CHAN_INFO_SCALE:
+               *val = st->vref_mv;
+diff --git a/drivers/iio/dac/ad5592r-base.c b/drivers/iio/dac/ad5592r-base.c
+index 5c998ac8c840b..126bb8349363c 100644
+--- a/drivers/iio/dac/ad5592r-base.c
++++ b/drivers/iio/dac/ad5592r-base.c
+@@ -532,7 +532,7 @@ static int ad5592r_alloc_channels(struct ad5592r_state *st)
+               if (!ret)
+                       st->channel_modes[reg] = tmp;
+ 
+-              fwnode_property_read_u32(child, "adi,off-state", &tmp);
++              ret = fwnode_property_read_u32(child, "adi,off-state", &tmp);
+               if (!ret)
+                       st->channel_offstate[reg] = tmp;
+       }
+diff --git a/drivers/iio/magnetometer/ak8975.c 
b/drivers/iio/magnetometer/ak8975.c
+index b08bd99295699..4b0f0a0801a3a 100644
+--- a/drivers/iio/magnetometer/ak8975.c
++++ b/drivers/iio/magnetometer/ak8975.c
+@@ -404,6 +404,7 @@ static int ak8975_power_on(const struct ak8975_data *data)
+       if (ret) {
+               dev_warn(&data->client->dev,
+                        "Failed to enable specified Vid supply\n");
++              regulator_disable(data->vdd);
+               return ret;
+       }
+       /*
+diff --git a/drivers/lightnvm/Kconfig b/drivers/lightnvm/Kconfig
+index ead61a93cb4eb..d8473d408b17f 100644
+--- a/drivers/lightnvm/Kconfig
++++ b/drivers/lightnvm/Kconfig
+@@ -4,7 +4,7 @@
+ 
+ menuconfig NVM
+       bool "Open-Channel SSD target support"
+-      depends on BLOCK && HAS_DMA
++      depends on BLOCK && HAS_DMA && BROKEN
+       help
+         Say Y here to get to enable Open-channel SSDs.
+ 
+diff --git a/drivers/md/dm.c b/drivers/md/dm.c
+index 0e06432c958f7..94018613b43b5 100644
+--- a/drivers/md/dm.c
++++ b/drivers/md/dm.c
+@@ -528,20 +528,19 @@ static void start_io_acct(struct dm_io *io)
+                                   false, 0, &io->stats_aux);
+ }
+ 
+-static void end_io_acct(struct dm_io *io)
++static void end_io_acct(struct mapped_device *md, struct bio *bio,
++                      unsigned long start_time, struct dm_stats_aux 
*stats_aux)
+ {
+-      struct mapped_device *md = io->md;
+-      struct bio *bio = io->bio;
+-      unsigned long duration = jiffies - io->start_time;
++      unsigned long duration = jiffies - start_time;
+       int pending;
+       int rw = bio_data_dir(bio);
+ 
+-      generic_end_io_acct(md->queue, rw, &dm_disk(md)->part0, io->start_time);
++      generic_end_io_acct(md->queue, rw, &dm_disk(md)->part0, start_time);
+ 
+       if (unlikely(dm_stats_used(&md->stats)))
+               dm_stats_account_io(&md->stats, bio_data_dir(bio),
+                                   bio->bi_iter.bi_sector, bio_sectors(bio),
+-                                  true, duration, &io->stats_aux);
++                                  true, duration, stats_aux);
+ 
+       /*
+        * After this is decremented the bio must not be touched if it is
+@@ -775,6 +774,8 @@ static void dec_pending(struct dm_io *io, blk_status_t 
error)
+       blk_status_t io_error;
+       struct bio *bio;
+       struct mapped_device *md = io->md;
++      unsigned long start_time = 0;
++      struct dm_stats_aux stats_aux;
+ 
+       /* Push-back supersedes any I/O errors */
+       if (unlikely(error)) {
+@@ -801,8 +802,10 @@ static void dec_pending(struct dm_io *io, blk_status_t 
error)
+ 
+               io_error = io->status;
+               bio = io->bio;
+-              end_io_acct(io);
++              start_time = io->start_time;
++              stats_aux = io->stats_aux;
+               free_io(md, io);
++              end_io_acct(md, bio, start_time, &stats_aux);
+ 
+               if (io_error == BLK_STS_DM_REQUEUE)
+                       return;
+@@ -2227,6 +2230,8 @@ static int dm_wait_for_completion(struct mapped_device 
*md, long task_state)
+       }
+       finish_wait(&md->wait, &wait);
+ 
++      smp_rmb(); /* paired with atomic_dec_return in end_io_acct */
++
+       return r;
+ }
+ 
+diff --git a/drivers/mtd/nand/sh_flctl.c b/drivers/mtd/nand/sh_flctl.c
+index f2ed03ee30355..eac65aff54019 100644
+--- a/drivers/mtd/nand/sh_flctl.c
++++ b/drivers/mtd/nand/sh_flctl.c
+@@ -399,7 +399,8 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl 
*flctl, unsigned long *buf,
+       dma_addr_t dma_addr;
+       dma_cookie_t cookie;
+       uint32_t reg;
+-      int ret;
++      int ret = 0;
++      unsigned long time_left;
+ 
+       if (dir == DMA_FROM_DEVICE) {
+               chan = flctl->chan_fifo0_rx;
+@@ -440,13 +441,14 @@ static int flctl_dma_fifo0_transfer(struct sh_flctl 
*flctl, unsigned long *buf,
+               goto out;
+       }
+ 
+-      ret =
++      time_left =
+       wait_for_completion_timeout(&flctl->dma_complete,
+                               msecs_to_jiffies(3000));
+ 
+-      if (ret <= 0) {
++      if (time_left == 0) {
+               dmaengine_terminate_all(chan);
+               dev_err(&flctl->pdev->dev, "wait_for_completion_timeout\n");
++              ret = -ETIMEDOUT;
+       }
+ 
+ out:
+@@ -456,7 +458,7 @@ out:
+ 
+       dma_unmap_single(chan->device->dev, dma_addr, len, dir);
+ 
+-      /* ret > 0 is success */
++      /* ret == 0 is success */
+       return ret;
+ }
+ 
+@@ -480,7 +482,7 @@ static void read_fiforeg(struct sh_flctl *flctl, int rlen, 
int offset)
+ 
+       /* initiate DMA transfer */
+       if (flctl->chan_fifo0_rx && rlen >= 32 &&
+-              flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_FROM_DEVICE) > 0)
++              !flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_FROM_DEVICE))
+                       goto convert;   /* DMA success */
+ 
+       /* do polling transfer */
+@@ -539,7 +541,7 @@ static void write_ec_fiforeg(struct sh_flctl *flctl, int 
rlen,
+ 
+       /* initiate DMA transfer */
+       if (flctl->chan_fifo0_tx && rlen >= 32 &&
+-              flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_TO_DEVICE) > 0)
++              !flctl_dma_fifo0_transfer(flctl, buf, rlen, DMA_TO_DEVICE))
+                       return; /* DMA success */
+ 
+       /* do polling transfer */
+diff --git a/drivers/net/can/grcan.c b/drivers/net/can/grcan.c
+index a7be12d9a1398..05a59b9946cbe 100644
+--- a/drivers/net/can/grcan.c
++++ b/drivers/net/can/grcan.c
+@@ -252,6 +252,7 @@ struct grcan_device_config {
+ struct grcan_priv {
+       struct can_priv can;    /* must be the first member */
+       struct net_device *dev;
++      struct device *ofdev_dev;
+       struct napi_struct napi;
+ 
+       struct grcan_registers __iomem *regs;   /* ioremap'ed registers */
+@@ -928,7 +929,7 @@ static void grcan_free_dma_buffers(struct net_device *dev)
+       struct grcan_priv *priv = netdev_priv(dev);
+       struct grcan_dma *dma = &priv->dma;
+ 
+-      dma_free_coherent(&dev->dev, dma->base_size, dma->base_buf,
++      dma_free_coherent(priv->ofdev_dev, dma->base_size, dma->base_buf,
+                         dma->base_handle);
+       memset(dma, 0, sizeof(*dma));
+ }
+@@ -953,7 +954,7 @@ static int grcan_allocate_dma_buffers(struct net_device 
*dev,
+ 
+       /* Extra GRCAN_BUFFER_ALIGNMENT to allow for alignment */
+       dma->base_size = lsize + ssize + GRCAN_BUFFER_ALIGNMENT;
+-      dma->base_buf = dma_alloc_coherent(&dev->dev,
++      dma->base_buf = dma_alloc_coherent(priv->ofdev_dev,
+                                          dma->base_size,
+                                          &dma->base_handle,
+                                          GFP_KERNEL);
+@@ -1117,8 +1118,10 @@ static int grcan_close(struct net_device *dev)
+ 
+       priv->closing = true;
+       if (priv->need_txbug_workaround) {
++              spin_unlock_irqrestore(&priv->lock, flags);
+               del_timer_sync(&priv->hang_timer);
+               del_timer_sync(&priv->rr_timer);
++              spin_lock_irqsave(&priv->lock, flags);
+       }
+       netif_stop_queue(dev);
+       grcan_stop_hardware(dev);
+@@ -1604,6 +1607,7 @@ static int grcan_setup_netdev(struct platform_device 
*ofdev,
+       memcpy(&priv->config, &grcan_module_config,
+              sizeof(struct grcan_device_config));
+       priv->dev = dev;
++      priv->ofdev_dev = &ofdev->dev;
+       priv->regs = base;
+       priv->can.bittiming_const = &grcan_bittiming_const;
+       priv->can.do_set_bittiming = grcan_set_bittiming;
+diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c 
b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+index b0ada7eac652a..7925c40c00625 100644
+--- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
++++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_main.c
+@@ -14317,10 +14317,6 @@ static int bnx2x_eeh_nic_unload(struct bnx2x *bp)
+ 
+       /* Stop Tx */
+       bnx2x_tx_disable(bp);
+-      /* Delete all NAPI objects */
+-      bnx2x_del_all_napi(bp);
+-      if (CNIC_LOADED(bp))
+-              bnx2x_del_all_napi_cnic(bp);
+       netdev_reset_tc(bp->dev);
+ 
+       del_timer_sync(&bp->timer);
+@@ -14425,6 +14421,11 @@ static pci_ers_result_t bnx2x_io_slot_reset(struct 
pci_dev *pdev)
+               bnx2x_drain_tx_queues(bp);
+               bnx2x_send_unload_req(bp, UNLOAD_RECOVERY);
+               bnx2x_netif_stop(bp, 1);
++              bnx2x_del_all_napi(bp);
++
++              if (CNIC_LOADED(bp))
++                      bnx2x_del_all_napi_cnic(bp);
++
+               bnx2x_free_irq(bp);
+ 
+               /* Report UNLOAD_DONE to MCP */
+diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c 
b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+index b819a9bde6cc3..9bb398d058379 100644
+--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+@@ -1522,6 +1522,11 @@ static struct sk_buff *bcmgenet_put_tx_csum(struct 
net_device *dev,
+       return skb;
+ }
+ 
++static void bcmgenet_hide_tsb(struct sk_buff *skb)
++{
++      __skb_pull(skb, sizeof(struct status_64));
++}
++
+ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, struct net_device *dev)
+ {
+       struct bcmgenet_priv *priv = netdev_priv(dev);
+@@ -1632,6 +1637,8 @@ static netdev_tx_t bcmgenet_xmit(struct sk_buff *skb, 
struct net_device *dev)
+       }
+ 
+       GENET_CB(skb)->last_cb = tx_cb_ptr;
++
++      bcmgenet_hide_tsb(skb);
+       skb_tx_timestamp(skb);
+ 
+       /* Decrement total BD count and advance our write pointer */
+diff --git a/drivers/net/ethernet/smsc/smsc911x.c 
b/drivers/net/ethernet/smsc/smsc911x.c
+index ae80a223975db..f977fc59dc5ca 100644
+--- a/drivers/net/ethernet/smsc/smsc911x.c
++++ b/drivers/net/ethernet/smsc/smsc911x.c
+@@ -2446,7 +2446,7 @@ static int smsc911x_drv_probe(struct platform_device 
*pdev)
+       if (irq == -EPROBE_DEFER) {
+               retval = -EPROBE_DEFER;
+               goto out_0;
+-      } else if (irq <= 0) {
++      } else if (irq < 0) {
+               pr_warn("Could not allocate irq resource\n");
+               retval = -ENODEV;
+               goto out_0;
+diff --git a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c 
b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
+index 6ca428a702f16..6a9c954492f22 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
++++ b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.c
+@@ -68,6 +68,10 @@
+ #define TSE_PCS_USE_SGMII_ENA                         BIT(0)
+ #define TSE_PCS_IF_USE_SGMII                          0x03
+ 
++#define SGMII_ADAPTER_CTRL_REG                                0x00
++#define SGMII_ADAPTER_DISABLE                         0x0001
++#define SGMII_ADAPTER_ENABLE                          0x0000
++
+ #define AUTONEGO_LINK_TIMER                           20
+ 
+ static int tse_pcs_reset(void __iomem *base, struct tse_pcs *pcs)
+@@ -211,8 +215,12 @@ void tse_pcs_fix_mac_speed(struct tse_pcs *pcs, struct 
phy_device *phy_dev,
+                          unsigned int speed)
+ {
+       void __iomem *tse_pcs_base = pcs->tse_pcs_base;
++      void __iomem *sgmii_adapter_base = pcs->sgmii_adapter_base;
+       u32 val;
+ 
++      writew(SGMII_ADAPTER_ENABLE,
++             sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
++
+       pcs->autoneg = phy_dev->autoneg;
+ 
+       if (phy_dev->autoneg == AUTONEG_ENABLE) {
+diff --git a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h 
b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
+index 254199f2efdbf..2f5882450b06a 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
++++ b/drivers/net/ethernet/stmicro/stmmac/altr_tse_pcs.h
+@@ -21,10 +21,6 @@
+ #include <linux/phy.h>
+ #include <linux/timer.h>
+ 
+-#define SGMII_ADAPTER_CTRL_REG                0x00
+-#define SGMII_ADAPTER_ENABLE          0x0000
+-#define SGMII_ADAPTER_DISABLE         0x0001
+-
+ struct tse_pcs {
+       struct device *dev;
+       void __iomem *tse_pcs_base;
+diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c 
b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
+index 32ead4a4b4604..33407df6bea69 100644
+--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
+@@ -29,6 +29,9 @@
+ 
+ #include "altr_tse_pcs.h"
+ 
++#define SGMII_ADAPTER_CTRL_REG                          0x00
++#define SGMII_ADAPTER_DISABLE                           0x0001
++
+ #define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_GMII_MII 0x0
+ #define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RGMII 0x1
+ #define SYSMGR_EMACGRP_CTRL_PHYSEL_ENUM_RMII 0x2
+@@ -62,14 +65,16 @@ static void socfpga_dwmac_fix_mac_speed(void *priv, 
unsigned int speed)
+ {
+       struct socfpga_dwmac *dwmac = (struct socfpga_dwmac *)priv;
+       void __iomem *splitter_base = dwmac->splitter_base;
++      void __iomem *tse_pcs_base = dwmac->pcs.tse_pcs_base;
+       void __iomem *sgmii_adapter_base = dwmac->pcs.sgmii_adapter_base;
+       struct device *dev = dwmac->dev;
+       struct net_device *ndev = dev_get_drvdata(dev);
+       struct phy_device *phy_dev = ndev->phydev;
+       u32 val;
+ 
+-      writew(SGMII_ADAPTER_DISABLE,
+-             sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
++      if ((tse_pcs_base) && (sgmii_adapter_base))
++              writew(SGMII_ADAPTER_DISABLE,
++                     sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
+ 
+       if (splitter_base) {
+               val = readl(splitter_base + EMAC_SPLITTER_CTRL_REG);
+@@ -91,9 +96,7 @@ static void socfpga_dwmac_fix_mac_speed(void *priv, unsigned 
int speed)
+               writel(val, splitter_base + EMAC_SPLITTER_CTRL_REG);
+       }
+ 
+-      writew(SGMII_ADAPTER_ENABLE,
+-             sgmii_adapter_base + SGMII_ADAPTER_CTRL_REG);
+-      if (phy_dev)
++      if (tse_pcs_base && sgmii_adapter_base)
+               tse_pcs_fix_mac_speed(&dwmac->pcs, phy_dev, speed);
+ }
+ 
+diff --git a/drivers/net/ethernet/xilinx/xilinx_emaclite.c 
b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
+index d83e6743f1563..9359ca9f3aef9 100644
+--- a/drivers/net/ethernet/xilinx/xilinx_emaclite.c
++++ b/drivers/net/ethernet/xilinx/xilinx_emaclite.c
+@@ -817,10 +817,10 @@ static int xemaclite_mdio_write(struct mii_bus *bus, int 
phy_id, int reg,
+ static int xemaclite_mdio_setup(struct net_local *lp, struct device *dev)
+ {
+       struct mii_bus *bus;
+-      int rc;
+       struct resource res;
+       struct device_node *np = of_get_parent(lp->phy_node);
+       struct device_node *npp;
++      int rc, ret;
+ 
+       /* Don't register the MDIO bus if the phy_node or its parent node
+        * can't be found.
+@@ -830,8 +830,14 @@ static int xemaclite_mdio_setup(struct net_local *lp, 
struct device *dev)
+               return -ENODEV;
+       }
+       npp = of_get_parent(np);
+-
+-      of_address_to_resource(npp, 0, &res);
++      ret = of_address_to_resource(npp, 0, &res);
++      of_node_put(npp);
++      if (ret) {
++              dev_err(dev, "%s resource error!\n",
++                      dev->of_node->full_name);
++              of_node_put(np);
++              return ret;
++      }
+       if (lp->ndev->mem_start != res.start) {
+               struct phy_device *phydev;
+               phydev = of_phy_find_device(lp->phy_node);
+@@ -840,6 +846,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, 
struct device *dev)
+                                "MDIO of the phy is not registered yet\n");
+               else
+                       put_device(&phydev->mdio.dev);
++              of_node_put(np);
+               return 0;
+       }
+ 
+@@ -852,6 +859,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, 
struct device *dev)
+       bus = mdiobus_alloc();
+       if (!bus) {
+               dev_err(dev, "Failed to allocate mdiobus\n");
++              of_node_put(np);
+               return -ENOMEM;
+       }
+ 
+@@ -866,6 +874,7 @@ static int xemaclite_mdio_setup(struct net_local *lp, 
struct device *dev)
+       lp->mii_bus = bus;
+ 
+       rc = of_mdiobus_register(bus, np);
++      of_node_put(np);
+       if (rc) {
+               dev_err(dev, "Failed to register mdio bus.\n");
+               goto err_register;
+diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c
+index 3d5b2b4899ec9..2d239c014541d 100644
+--- a/drivers/net/hamradio/6pack.c
++++ b/drivers/net/hamradio/6pack.c
+@@ -311,7 +311,6 @@ static void sp_setup(struct net_device *dev)
+ {
+       /* Finish setting up the DEVICE info. */
+       dev->netdev_ops         = &sp_netdev_ops;
+-      dev->needs_free_netdev  = true;
+       dev->mtu                = SIXP_MTU;
+       dev->hard_header_len    = AX25_MAX_HEADER_LEN;
+       dev->header_ops         = &ax25_header_ops;
+@@ -690,9 +689,11 @@ static void sixpack_close(struct tty_struct *tty)
+       del_timer_sync(&sp->tx_t);
+       del_timer_sync(&sp->resync_t);
+ 
+-      /* Free all 6pack frame buffers. */
++      /* Free all 6pack frame buffers after unreg. */
+       kfree(sp->rbuff);
+       kfree(sp->xbuff);
++
++      free_netdev(sp->dev);
+ }
+ 
+ /* Perform I/O control on an active 6pack channel. */
+diff --git a/drivers/net/hippi/rrunner.c b/drivers/net/hippi/rrunner.c
+index 40ef4aeb0ef04..3a73ac03fb2b8 100644
+--- a/drivers/net/hippi/rrunner.c
++++ b/drivers/net/hippi/rrunner.c
+@@ -1354,7 +1354,9 @@ static int rr_close(struct net_device *dev)
+ 
+       rrpriv->fw_running = 0;
+ 
++      spin_unlock_irqrestore(&rrpriv->lock, flags);
+       del_timer_sync(&rrpriv->timer);
++      spin_lock_irqsave(&rrpriv->lock, flags);
+ 
+       writel(0, &regs->TxPi);
+       writel(0, &regs->IpRxPi);
+diff --git a/drivers/nfc/nfcmrvl/main.c b/drivers/nfc/nfcmrvl/main.c
+index 529be35ac1782..54d228acc0f5d 100644
+--- a/drivers/nfc/nfcmrvl/main.c
++++ b/drivers/nfc/nfcmrvl/main.c
+@@ -194,6 +194,7 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private 
*priv)
+ {
+       struct nci_dev *ndev = priv->ndev;
+ 
++      nci_unregister_device(ndev);
+       if (priv->ndev->nfc_dev->fw_download_in_progress)
+               nfcmrvl_fw_dnld_abort(priv);
+ 
+@@ -202,7 +203,6 @@ void nfcmrvl_nci_unregister_dev(struct nfcmrvl_private 
*priv)
+       if (gpio_is_valid(priv->config.reset_n_io))
+               gpio_free(priv->config.reset_n_io);
+ 
+-      nci_unregister_device(ndev);
+       nci_free_device(ndev);
+       kfree(priv);
+ }
+diff --git a/drivers/pci/host/pci-aardvark.c b/drivers/pci/host/pci-aardvark.c
+index 124fd7cb5da50..1c8c24b2188c2 100644
+--- a/drivers/pci/host/pci-aardvark.c
++++ b/drivers/pci/host/pci-aardvark.c
+@@ -104,6 +104,7 @@
+ #define PCIE_MSI_ADDR_HIGH_REG                        (CONTROL_BASE_ADDR + 
0x54)
+ #define PCIE_MSI_STATUS_REG                   (CONTROL_BASE_ADDR + 0x58)
+ #define PCIE_MSI_MASK_REG                     (CONTROL_BASE_ADDR + 0x5C)
++#define     PCIE_MSI_ALL_MASK                 GENMASK(31, 0)
+ #define PCIE_MSI_PAYLOAD_REG                  (CONTROL_BASE_ADDR + 0x9C)
+ #define     PCIE_MSI_DATA_MASK                        GENMASK(15, 0)
+ 
+@@ -490,6 +491,7 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
+       advk_writel(pcie, reg, PCIE_CORE_CTRL2_REG);
+ 
+       /* Clear all interrupts */
++      advk_writel(pcie, PCIE_MSI_ALL_MASK, PCIE_MSI_STATUS_REG);
+       advk_writel(pcie, PCIE_ISR0_ALL_MASK, PCIE_ISR0_REG);
+       advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_REG);
+       advk_writel(pcie, PCIE_IRQ_ALL_MASK, HOST_CTRL_INT_STATUS_REG);
+@@ -502,7 +504,7 @@ static void advk_pcie_setup_hw(struct advk_pcie *pcie)
+       advk_writel(pcie, PCIE_ISR1_ALL_MASK, PCIE_ISR1_MASK_REG);
+ 
+       /* Unmask all MSI's */
+-      advk_writel(pcie, 0, PCIE_MSI_MASK_REG);
++      advk_writel(pcie, ~(u32)PCIE_MSI_ALL_MASK, PCIE_MSI_MASK_REG);
+ 
+       /* Enable summary interrupt for GIC SPI source */
+       reg = PCIE_IRQ_ALL_MASK & (~PCIE_IRQ_ENABLE_INTS_MASK);
+@@ -1034,23 +1036,19 @@ static void advk_pcie_remove_irq_domain(struct 
advk_pcie *pcie)
+ static void advk_pcie_handle_msi(struct advk_pcie *pcie)
+ {
+       u32 msi_val, msi_mask, msi_status, msi_idx;
+-      u16 msi_data;
++      int virq;
+ 
+       msi_mask = advk_readl(pcie, PCIE_MSI_MASK_REG);
+       msi_val = advk_readl(pcie, PCIE_MSI_STATUS_REG);
+-      msi_status = msi_val & ~msi_mask;
++      msi_status = msi_val & ((~msi_mask) & PCIE_MSI_ALL_MASK);
+ 
+       for (msi_idx = 0; msi_idx < MSI_IRQ_NUM; msi_idx++) {
+               if (!(BIT(msi_idx) & msi_status))
+                       continue;
+ 
+-              /*
+-               * msi_idx contains bits [4:0] of the msi_data and msi_data
+-               * contains 16bit MSI interrupt number
+-               */
+               advk_writel(pcie, BIT(msi_idx), PCIE_MSI_STATUS_REG);
+-              msi_data = advk_readl(pcie, PCIE_MSI_PAYLOAD_REG) & 
PCIE_MSI_DATA_MASK;
+-              generic_handle_irq(msi_data);
++              virq = irq_find_mapping(pcie->msi_inner_domain, msi_idx);
++              generic_handle_irq(virq);
+       }
+ 
+       advk_writel(pcie, PCIE_ISR0_MSI_INT_PENDING,
+diff --git a/drivers/phy/samsung/phy-exynos5250-sata.c 
b/drivers/phy/samsung/phy-exynos5250-sata.c
+index 60e13afcd9b84..2c39d2fd3cd80 100644
+--- a/drivers/phy/samsung/phy-exynos5250-sata.c
++++ b/drivers/phy/samsung/phy-exynos5250-sata.c
+@@ -193,6 +193,7 @@ static int exynos_sata_phy_probe(struct platform_device 
*pdev)
+               return -EINVAL;
+ 
+       sata_phy->client = of_find_i2c_device_by_node(node);
++      of_node_put(node);
+       if (!sata_phy->client)
+               return -EPROBE_DEFER;
+ 
+@@ -201,20 +202,21 @@ static int exynos_sata_phy_probe(struct platform_device 
*pdev)
+       sata_phy->phyclk = devm_clk_get(dev, "sata_phyctrl");
+       if (IS_ERR(sata_phy->phyclk)) {
+               dev_err(dev, "failed to get clk for PHY\n");
+-              return PTR_ERR(sata_phy->phyclk);
++              ret = PTR_ERR(sata_phy->phyclk);
++              goto put_dev;
+       }
+ 
+       ret = clk_prepare_enable(sata_phy->phyclk);
+       if (ret < 0) {
+               dev_err(dev, "failed to enable source clk\n");
+-              return ret;
++              goto put_dev;
+       }
+ 
+       sata_phy->phy = devm_phy_create(dev, NULL, &exynos_sata_phy_ops);
+       if (IS_ERR(sata_phy->phy)) {
+-              clk_disable_unprepare(sata_phy->phyclk);
+               dev_err(dev, "failed to create PHY\n");
+-              return PTR_ERR(sata_phy->phy);
++              ret = PTR_ERR(sata_phy->phy);
++              goto clk_disable;
+       }
+ 
+       phy_set_drvdata(sata_phy->phy, sata_phy);
+@@ -222,11 +224,18 @@ static int exynos_sata_phy_probe(struct platform_device 
*pdev)
+       phy_provider = devm_of_phy_provider_register(dev,
+                                       of_phy_simple_xlate);
+       if (IS_ERR(phy_provider)) {
+-              clk_disable_unprepare(sata_phy->phyclk);
+-              return PTR_ERR(phy_provider);
++              ret = PTR_ERR(phy_provider);
++              goto clk_disable;
+       }
+ 
+       return 0;
++
++clk_disable:
++      clk_disable_unprepare(sata_phy->phyclk);
++put_dev:
++      put_device(&sata_phy->client->dev);
++
++      return ret;
+ }
+ 
+ static const struct of_device_id exynos_sata_phy_of_match[] = {
+diff --git a/drivers/pinctrl/pinctrl-pistachio.c 
b/drivers/pinctrl/pinctrl-pistachio.c
+index b2b7e238bda97..fc8c57527fb78 100644
+--- a/drivers/pinctrl/pinctrl-pistachio.c
++++ b/drivers/pinctrl/pinctrl-pistachio.c
+@@ -1374,10 +1374,10 @@ static int pistachio_gpio_register(struct 
pistachio_pinctrl *pctl)
+               }
+ 
+               irq = irq_of_parse_and_map(child, 0);
+-              if (irq < 0) {
+-                      dev_err(pctl->dev, "No IRQ for bank %u: %d\n", i, irq);
++              if (!irq) {
++                      dev_err(pctl->dev, "No IRQ for bank %u\n", i);
+                       of_node_put(child);
+-                      ret = irq;
++                      ret = -EINVAL;
+                       goto err;
+               }
+ 
+diff --git a/drivers/tty/n_gsm.c b/drivers/tty/n_gsm.c
+index 28133a8e3169b..c6cb185a5bdff 100644
+--- a/drivers/tty/n_gsm.c
++++ b/drivers/tty/n_gsm.c
+@@ -84,6 +84,8 @@ module_param(debug, int, 0600);
+  */
+ #define MAX_MRU 1500
+ #define MAX_MTU 1500
++/* SOF, ADDR, CTRL, LEN1, LEN2, ..., FCS, EOF */
++#define PROT_OVERHEAD 7
+ #define       GSM_NET_TX_TIMEOUT (HZ*10)
+ 
+ /**
+@@ -835,7 +837,7 @@ static int gsm_dlci_data_output(struct gsm_mux *gsm, 
struct gsm_dlci *dlci)
+                       break;
+               case 2: /* Unstructed with modem bits.
+               Always one byte as we never send inline break data */
+-                      *dp++ = gsm_encode_modem(dlci);
++                      *dp++ = (gsm_encode_modem(dlci) << 1) | EA;
+                       break;
+               }
+               WARN_ON(kfifo_out_locked(dlci->fifo, dp , len, &dlci->lock) != 
len);
+@@ -1312,11 +1314,12 @@ static void gsm_control_response(struct gsm_mux *gsm, 
unsigned int command,
+ 
+ static void gsm_control_transmit(struct gsm_mux *gsm, struct gsm_control 
*ctrl)
+ {
+-      struct gsm_msg *msg = gsm_data_alloc(gsm, 0, ctrl->len + 1, gsm->ftype);
++      struct gsm_msg *msg = gsm_data_alloc(gsm, 0, ctrl->len + 2, gsm->ftype);
+       if (msg == NULL)
+               return;
+-      msg->data[0] = (ctrl->cmd << 1) | 2 | EA;       /* command */
+-      memcpy(msg->data + 1, ctrl->data, ctrl->len);
++      msg->data[0] = (ctrl->cmd << 1) | CR | EA;      /* command */
++      msg->data[1] = (ctrl->len << 1) | EA;
++      memcpy(msg->data + 2, ctrl->data, ctrl->len);
+       gsm_data_queue(gsm->dlci[0], msg);
+ }
+ 
+@@ -1339,7 +1342,6 @@ static void gsm_control_retransmit(unsigned long data)
+       spin_lock_irqsave(&gsm->control_lock, flags);
+       ctrl = gsm->pending_cmd;
+       if (ctrl) {
+-              gsm->cretries--;
+               if (gsm->cretries == 0) {
+                       gsm->pending_cmd = NULL;
+                       ctrl->error = -ETIMEDOUT;
+@@ -1348,6 +1350,7 @@ static void gsm_control_retransmit(unsigned long data)
+                       wake_up(&gsm->event);
+                       return;
+               }
++              gsm->cretries--;
+               gsm_control_transmit(gsm, ctrl);
+               mod_timer(&gsm->t2_timer, jiffies + gsm->t2 * HZ / 100);
+       }
+@@ -1388,7 +1391,7 @@ retry:
+ 
+       /* If DLCI0 is in ADM mode skip retries, it won't respond */
+       if (gsm->dlci[0]->mode == DLCI_MODE_ADM)
+-              gsm->cretries = 1;
++              gsm->cretries = 0;
+       else
+               gsm->cretries = gsm->n2;
+ 
+@@ -1822,7 +1825,6 @@ static void gsm_queue(struct gsm_mux *gsm)
+               gsm_response(gsm, address, UA);
+               gsm_dlci_close(dlci);
+               break;
+-      case UA:
+       case UA|PF:
+               if (cr == 0 || dlci == NULL)
+                       break;
+@@ -1973,7 +1975,8 @@ static void gsm1_receive(struct gsm_mux *gsm, unsigned 
char c)
+               }
+               /* Any partial frame was a runt so go back to start */
+               if (gsm->state != GSM_START) {
+-                      gsm->malformed++;
++                      if (gsm->state != GSM_SEARCH)
++                              gsm->malformed++;
+                       gsm->state = GSM_START;
+               }
+               /* A SOF in GSM_START means we are still reading idling or
+@@ -2110,6 +2113,7 @@ static void gsm_cleanup_mux(struct gsm_mux *gsm)
+                       gsm_dlci_release(gsm->dlci[i]);
+       mutex_unlock(&gsm->mutex);
+       /* Now wipe the queues */
++      tty_ldisc_flush(gsm->tty);
+       list_for_each_entry_safe(txq, ntxq, &gsm->tx_list, list)
+               kfree(txq);
+       INIT_LIST_HEAD(&gsm->tx_list);
+@@ -2210,7 +2214,7 @@ static struct gsm_mux *gsm_alloc_mux(void)
+               kfree(gsm);
+               return NULL;
+       }
+-      gsm->txframe = kmalloc(2 * MAX_MRU + 2, GFP_KERNEL);
++      gsm->txframe = kmalloc(2 * (MAX_MTU + PROT_OVERHEAD - 1), GFP_KERNEL);
+       if (gsm->txframe == NULL) {
+               kfree(gsm->buf);
+               kfree(gsm);
+@@ -2527,7 +2531,7 @@ static int gsmld_config(struct tty_struct *tty, struct 
gsm_mux *gsm,
+       /* Check the MRU/MTU range looks sane */
+       if (c->mru > MAX_MRU || c->mtu > MAX_MTU || c->mru < 8 || c->mtu < 8)
+               return -EINVAL;
+-      if (c->n2 < 3)
++      if (c->n2 > 255)
+               return -EINVAL;
+       if (c->encapsulation > 1)       /* Basic, advanced, no I */
+               return -EINVAL;
+@@ -2870,19 +2874,17 @@ static struct tty_ldisc_ops tty_ldisc_packet = {
+ 
+ static int gsmtty_modem_update(struct gsm_dlci *dlci, u8 brk)
+ {
+-      u8 modembits[5];
++      u8 modembits[3];
+       struct gsm_control *ctrl;
+       int len = 2;
+ 
+-      if (brk)
++      modembits[0] = (dlci->addr << 2) | 2 | EA;  /* DLCI, Valid, EA */
++      modembits[1] = (gsm_encode_modem(dlci) << 1) | EA;
++      if (brk) {
++              modembits[2] = (brk << 4) | 2 | EA; /* Length, Break, EA */
+               len++;
+-
+-      modembits[0] = len << 1 | EA;           /* Data bytes */
+-      modembits[1] = dlci->addr << 2 | 3;     /* DLCI, EA, 1 */
+-      modembits[2] = gsm_encode_modem(dlci) << 1 | EA;
+-      if (brk)
+-              modembits[3] = brk << 4 | 2 | EA;       /* Valid, EA */
+-      ctrl = gsm_control_send(dlci->gsm, CMD_MSC, modembits, len + 1);
++      }
++      ctrl = gsm_control_send(dlci->gsm, CMD_MSC, modembits, len);
+       if (ctrl == NULL)
+               return -ENOMEM;
+       return gsm_control_wait(dlci->gsm, ctrl);
+diff --git a/drivers/tty/serial/8250/8250_pci.c 
b/drivers/tty/serial/8250/8250_pci.c
+index 527b394efb971..a22a0ed905d74 100644
+--- a/drivers/tty/serial/8250/8250_pci.c
++++ b/drivers/tty/serial/8250/8250_pci.c
+@@ -2668,7 +2668,7 @@ enum pci_board_num_t {
+       pbn_panacom2,
+       pbn_panacom4,
+       pbn_plx_romulus,
+-      pbn_endrun_2_4000000,
++      pbn_endrun_2_3906250,
+       pbn_oxsemi,
+       pbn_oxsemi_1_4000000,
+       pbn_oxsemi_2_4000000,
+@@ -3184,10 +3184,10 @@ static struct pciserial_board pci_boards[] = {
+       * signal now many ports are available
+       * 2 port 952 Uart support
+       */
+-      [pbn_endrun_2_4000000] = {
++      [pbn_endrun_2_3906250] = {
+               .flags          = FL_BASE0,
+               .num_ports      = 2,
+-              .base_baud      = 4000000,
++              .base_baud      = 3906250,
+               .uart_offset    = 0x200,
+               .first_offset   = 0x1000,
+       },
+@@ -4039,7 +4039,7 @@ static const struct pci_device_id serial_pci_tbl[] = {
+       */
+       {       PCI_VENDOR_ID_ENDRUN, PCI_DEVICE_ID_ENDRUN_1588,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+-              pbn_endrun_2_4000000 },
++              pbn_endrun_2_3906250 },
+       /*
+        * Quatech cards. These actually have configurable clocks but for
+        * now we just use the default.
+diff --git a/drivers/tty/serial/8250/8250_port.c 
b/drivers/tty/serial/8250/8250_port.c
+index 9758d3b0c9fc4..bbfcb220e1eb9 100644
+--- a/drivers/tty/serial/8250/8250_port.c
++++ b/drivers/tty/serial/8250/8250_port.c
+@@ -3240,7 +3240,7 @@ static void serial8250_console_restore(struct 
uart_8250_port *up)
+ 
+       serial8250_set_divisor(port, baud, quot, frac);
+       serial_port_out(port, UART_LCR, up->lcr);
+-      serial8250_out_MCR(up, UART_MCR_DTR | UART_MCR_RTS);
++      serial8250_out_MCR(up, up->mcr | UART_MCR_DTR | UART_MCR_RTS);
+ }
+ 
+ /*
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index 2ca6ed207e26e..bba74e9b7da0f 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -243,6 +243,9 @@ static const struct usb_device_id usb_quirk_list[] = {
+       { USB_DEVICE(0x0b05, 0x17e0), .driver_info =
+                       USB_QUIRK_IGNORE_REMOTE_WAKEUP },
+ 
++      /* Realtek Semiconductor Corp. Mass Storage Device (Multicard Reader)*/
++      { USB_DEVICE(0x0bda, 0x0151), .driver_info = 
USB_QUIRK_CONFIG_INTF_STRINGS },
++
+       /* Realtek hub in Dell WD19 (Type-C) */
+       { USB_DEVICE(0x0bda, 0x0487), .driver_info = USB_QUIRK_NO_LPM },
+       { USB_DEVICE(0x0bda, 0x5487), .driver_info = USB_QUIRK_RESET_RESUME },
+@@ -325,6 +328,9 @@ static const struct usb_device_id usb_quirk_list[] = {
+       /* DJI CineSSD */
+       { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
+ 
++      /* VCOM device */
++      { USB_DEVICE(0x4296, 0x7570), .driver_info = 
USB_QUIRK_CONFIG_INTF_STRINGS },
++
+       /* INTEL VALUE SSD */
+       { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
+diff --git a/drivers/usb/gadget/configfs.c b/drivers/usb/gadget/configfs.c
+index 8209e035e52f4..2ecb1cfa42066 100644
+--- a/drivers/usb/gadget/configfs.c
++++ b/drivers/usb/gadget/configfs.c
+@@ -1411,6 +1411,8 @@ static void configfs_composite_unbind(struct usb_gadget 
*gadget)
+       usb_ep_autoconfig_reset(cdev->gadget);
+       spin_lock_irqsave(&gi->spinlock, flags);
+       cdev->gadget = NULL;
++      cdev->deactivations = 0;
++      gadget->deactivated = false;
+       set_gadget_data(gadget, NULL);
+       spin_unlock_irqrestore(&gi->spinlock, flags);
+ }
+diff --git a/drivers/usb/gadget/function/uvc_queue.c 
b/drivers/usb/gadget/function/uvc_queue.c
+index 6377e9fee6e59..dadf6e5073801 100644
+--- a/drivers/usb/gadget/function/uvc_queue.c
++++ b/drivers/usb/gadget/function/uvc_queue.c
+@@ -246,6 +246,8 @@ void uvcg_queue_cancel(struct uvc_video_queue *queue, int 
disconnect)
+               buf->state = UVC_BUF_STATE_ERROR;
+               vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_ERROR);
+       }
++      queue->buf_used = 0;
++
+       /* This must be protected by the irqlock spinlock to avoid race
+        * conditions between uvc_queue_buffer and the disconnection event that
+        * could result in an interruptible wait in uvc_dequeue_buffer. Do not
+diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
+index 681d5bb99d997..9f49649f1df53 100644
+--- a/drivers/usb/host/xhci-ring.c
++++ b/drivers/usb/host/xhci-ring.c
+@@ -2921,6 +2921,8 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd)
+               if (event_loop++ < TRBS_PER_SEGMENT / 2)
+                       continue;
+               xhci_update_erst_dequeue(xhci, event_ring_deq);
++              event_ring_deq = xhci->event_ring->dequeue;
++
+               event_loop = 0;
+       }
+ 
+diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
+index 98fbf396c10ec..9724888196e3b 100644
+--- a/drivers/usb/host/xhci.c
++++ b/drivers/usb/host/xhci.c
+@@ -724,6 +724,17 @@ void xhci_shutdown(struct usb_hcd *hcd)
+       if (xhci->quirks & XHCI_SPURIOUS_REBOOT)
+               usb_disable_xhci_ports(to_pci_dev(hcd->self.sysdev));
+ 
++      /* Don't poll the roothubs after shutdown. */
++      xhci_dbg(xhci, "%s: stopping usb%d port polling.\n",
++                      __func__, hcd->self.busnum);
++      clear_bit(HCD_FLAG_POLL_RH, &hcd->flags);
++      del_timer_sync(&hcd->rh_timer);
++
++      if (xhci->shared_hcd) {
++              clear_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags);
++              del_timer_sync(&xhci->shared_hcd->rh_timer);
++      }
++
+       spin_lock_irq(&xhci->lock);
+       xhci_halt(xhci);
+       /* Workaround for spurious wakeups at shutdown with HSW */
+diff --git a/drivers/usb/misc/uss720.c b/drivers/usb/misc/uss720.c
+index 61866759bcff8..de73f33dc739f 100644
+--- a/drivers/usb/misc/uss720.c
++++ b/drivers/usb/misc/uss720.c
+@@ -84,6 +84,7 @@ static void destroy_priv(struct kref *kref)
+ 
+       dev_dbg(&priv->usbdev->dev, "destroying priv datastructure\n");
+       usb_put_dev(priv->usbdev);
++      priv->usbdev = NULL;
+       kfree(priv);
+ }
+ 
+@@ -749,7 +750,6 @@ static int uss720_probe(struct usb_interface *intf,
+       parport_announce_port(pp);
+ 
+       usb_set_intfdata(intf, pp);
+-      usb_put_dev(usbdev);
+       return 0;
+ 
+ probe_abort:
+@@ -769,7 +769,6 @@ static void uss720_disconnect(struct usb_interface *intf)
+       if (pp) {
+               priv = pp->private_data;
+               usbdev = priv->usbdev;
+-              priv->usbdev = NULL;
+               priv->pp = NULL;
+               dev_dbg(&intf->dev, "parport_remove_port\n");
+               parport_remove_port(pp);
+diff --git a/drivers/usb/mtu3/mtu3_dr.c b/drivers/usb/mtu3/mtu3_dr.c
+index 560256115b239..6ef2c7cbb9a7e 100644
+--- a/drivers/usb/mtu3/mtu3_dr.c
++++ b/drivers/usb/mtu3/mtu3_dr.c
+@@ -39,10 +39,8 @@ enum mtu3_vbus_id_state {
+ 
+ static void toggle_opstate(struct ssusb_mtk *ssusb)
+ {
+-      if (!ssusb->otg_switch.is_u3_drd) {
+-              mtu3_setbits(ssusb->mac_base, U3D_DEVICE_CONTROL, DC_SESSION);
+-              mtu3_setbits(ssusb->mac_base, U3D_POWER_MANAGEMENT, SOFT_CONN);
+-      }
++      mtu3_setbits(ssusb->mac_base, U3D_DEVICE_CONTROL, DC_SESSION);
++      mtu3_setbits(ssusb->mac_base, U3D_POWER_MANAGEMENT, SOFT_CONN);
+ }
+ 
+ /* only port0 supports dual-role mode */
+diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
+index e3e711953a8a0..2f5874b055413 100644
+--- a/drivers/usb/serial/cp210x.c
++++ b/drivers/usb/serial/cp210x.c
+@@ -198,6 +198,8 @@ static const struct usb_device_id id_table[] = {
+       { USB_DEVICE(0x16DC, 0x0015) }, /* W-IE-NE-R Plein & Baus GmbH CML 
Control, Monitoring and Data Logger */
+       { USB_DEVICE(0x17A8, 0x0001) }, /* Kamstrup Optical Eye/3-wire */
+       { USB_DEVICE(0x17A8, 0x0005) }, /* Kamstrup M-Bus Master MultiPort 250D 
*/
++      { USB_DEVICE(0x17A8, 0x0101) }, /* Kamstrup 868 MHz wM-Bus C-Mode Meter 
Reader (Int Ant) */
++      { USB_DEVICE(0x17A8, 0x0102) }, /* Kamstrup 868 MHz wM-Bus C-Mode Meter 
Reader (Ext Ant) */
+       { 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 */
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index a45d3502bd95c..56564006f7380 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -435,6 +435,8 @@ static void option_instat_callback(struct urb *urb);
+ #define CINTERION_PRODUCT_CLS8                        0x00b0
+ #define CINTERION_PRODUCT_MV31_MBIM           0x00b3
+ #define CINTERION_PRODUCT_MV31_RMNET          0x00b7
++#define CINTERION_PRODUCT_MV32_WA             0x00f1
++#define CINTERION_PRODUCT_MV32_WB             0x00f2
+ 
+ /* Olivetti products */
+ #define OLIVETTI_VENDOR_ID                    0x0b3c
+@@ -1220,6 +1222,10 @@ static const struct usb_device_id option_ids[] = {
+         .driver_info = NCTRL(0) | RSVD(1) },
+       { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1056, 0xff),    /* 
Telit FD980 */
+         .driver_info = NCTRL(2) | RSVD(3) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1057, 0xff),    /* 
Telit FN980 */
++        .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1058, 0xff),    /* 
Telit FN980 (PCIe) */
++        .driver_info = NCTRL(0) | RSVD(1) },
+       { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1060, 0xff),    /* 
Telit LN920 (rmnet) */
+         .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) },
+       { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1061, 0xff),    /* 
Telit LN920 (MBIM) */
+@@ -1236,6 +1242,8 @@ static const struct usb_device_id option_ids[] = {
+         .driver_info = NCTRL(2) | RSVD(3) },
+       { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1073, 0xff),    /* 
Telit FN990 (ECM) */
+         .driver_info = NCTRL(0) | RSVD(1) },
++      { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1075, 0xff),    /* 
Telit FN990 (PCIe) */
++        .driver_info = RSVD(0) },
+       { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910),
+         .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) },
+       { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM),
+@@ -1972,6 +1980,10 @@ static const struct usb_device_id option_ids[] = {
+         .driver_info = RSVD(3)},
+       { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, 
CINTERION_PRODUCT_MV31_RMNET, 0xff),
+         .driver_info = RSVD(0)},
++      { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, 
CINTERION_PRODUCT_MV32_WA, 0xff),
++        .driver_info = RSVD(3)},
++      { USB_DEVICE_INTERFACE_CLASS(CINTERION_VENDOR_ID, 
CINTERION_PRODUCT_MV32_WB, 0xff),
++        .driver_info = RSVD(3)},
+       { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD100),
+         .driver_info = RSVD(4) },
+       { USB_DEVICE(OLIVETTI_VENDOR_ID, OLIVETTI_PRODUCT_OLICARD120),
+diff --git a/drivers/usb/serial/whiteheat.c b/drivers/usb/serial/whiteheat.c
+index 163ede42af204..b617a8fa96187 100644
+--- a/drivers/usb/serial/whiteheat.c
++++ b/drivers/usb/serial/whiteheat.c
+@@ -615,9 +615,8 @@ static int firm_send_command(struct usb_serial_port *port, 
__u8 command,
+               switch (command) {
+               case WHITEHEAT_GET_DTR_RTS:
+                       info = usb_get_serial_port_data(port);
+-                      memcpy(&info->mcr, command_info->result_buffer,
+-                                      sizeof(struct whiteheat_dr_info));
+-                              break;
++                      info->mcr = command_info->result_buffer[0];
++                      break;
+               }
+       }
+ exit:
+diff --git a/fs/btrfs/tree-log.c b/fs/btrfs/tree-log.c
+index 8f2c7aa2e91a1..22b86440cfa54 100644
+--- a/fs/btrfs/tree-log.c
++++ b/fs/btrfs/tree-log.c
+@@ -4868,6 +4868,18 @@ static int btrfs_log_inode(struct btrfs_trans_handle 
*trans,
+               mutex_lock(&inode->log_mutex);
+       }
+ 
++      /*
++       * For symlinks, we must always log their content, which is stored in an
++       * inline extent, otherwise we could end up with an empty symlink after
++       * log replay, which is invalid on linux (symlink(2) returns -ENOENT if
++       * one attempts to create an empty symlink).
++       * We don't need to worry about flushing delalloc, because when we 
create
++       * the inline extent when the symlink is created (we never have delalloc
++       * for symlinks).
++       */
++      if (S_ISLNK(inode->vfs_inode.i_mode))
++              inode_only = LOG_INODE_ALL;
++
+       /*
+        * a brute force approach to making sure we get the most uptodate
+        * copies of everything.
+@@ -5430,7 +5442,7 @@ process_leaf:
+                       }
+ 
+                       ctx->log_new_dentries = false;
+-                      if (type == BTRFS_FT_DIR || type == BTRFS_FT_SYMLINK)
++                      if (type == BTRFS_FT_DIR)
+                               log_mode = LOG_INODE_ALL;
+                       ret = btrfs_log_inode(trans, root, BTRFS_I(di_inode),
+                                             log_mode, 0, LLONG_MAX, ctx);
+diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
+index ba56c00f26500..3280a801b1d7c 100644
+--- a/fs/cifs/smb2ops.c
++++ b/fs/cifs/smb2ops.c
+@@ -855,9 +855,17 @@ smb2_copychunk_range(const unsigned int xid,
+       int chunks_copied = 0;
+       bool chunk_sizes_updated = false;
+       ssize_t bytes_written, total_bytes_written = 0;
++      struct inode *inode;
+ 
+       pcchunk = kmalloc(sizeof(struct copychunk_ioctl), GFP_KERNEL);
+ 
++      /*
++       * We need to flush all unwritten data before we can send the
++       * copychunk ioctl to the server.
++       */
++      inode = d_inode(trgtfile->dentry);
++      filemap_write_and_wait(inode->i_mapping);
++
+       if (pcchunk == NULL)
+               return -ENOMEM;
+ 
+diff --git a/include/linux/kernel.h b/include/linux/kernel.h
+index bb7baecef0028..22b9146655958 100644
+--- a/include/linux/kernel.h
++++ b/include/linux/kernel.h
+@@ -582,7 +582,7 @@ static inline char *hex_byte_pack_upper(char *buf, u8 byte)
+       return buf;
+ }
+ 
+-extern int hex_to_bin(char ch);
++extern int hex_to_bin(unsigned char ch);
+ extern int __must_check hex2bin(u8 *dst, const char *src, size_t count);
+ extern char *bin2hex(char *dst, const void *src, size_t count);
+ 
+diff --git a/include/net/tcp.h b/include/net/tcp.h
+index 4602959b58a12..181db7dab176d 100644
+--- a/include/net/tcp.h
++++ b/include/net/tcp.h
+@@ -585,6 +585,7 @@ void tcp_synack_rtt_meas(struct sock *sk, struct 
request_sock *req);
+ void tcp_reset(struct sock *sk);
+ void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, struct sk_buff 
*skb);
+ void tcp_fin(struct sock *sk);
++void tcp_check_space(struct sock *sk);
+ 
+ /* tcp_timer.c */
+ void tcp_init_xmit_timers(struct sock *);
+diff --git a/lib/hexdump.c b/lib/hexdump.c
+index 81b70ed372096..fa2fab854f74d 100644
+--- a/lib/hexdump.c
++++ b/lib/hexdump.c
+@@ -25,15 +25,33 @@ EXPORT_SYMBOL(hex_asc_upper);
+  *
+  * hex_to_bin() converts one hex digit to its actual value or -1 in case of 
bad
+  * input.
++ *
++ * This function is used to load cryptographic keys, so it is coded in such a
++ * way that there are no conditions or memory accesses that depend on data.
++ *
++ * Explanation of the logic:
++ * (ch - '9' - 1) is negative if ch <= '9'
++ * ('0' - 1 - ch) is negative if ch >= '0'
++ * we "and" these two values, so the result is negative if ch is in the range
++ *    '0' ... '9'
++ * we are only interested in the sign, so we do a shift ">> 8"; note that 
right
++ *    shift of a negative value is implementation-defined, so we cast the
++ *    value to (unsigned) before the shift --- we have 0xffffff if ch is in
++ *    the range '0' ... '9', 0 otherwise
++ * we "and" this value with (ch - '0' + 1) --- we have a value 1 ... 10 if ch 
is
++ *    in the range '0' ... '9', 0 otherwise
++ * we add this value to -1 --- we have a value 0 ... 9 if ch is in the range 
'0'
++ *    ... '9', -1 otherwise
++ * the next line is similar to the previous one, but we need to decode both
++ *    uppercase and lowercase letters, so we use (ch & 0xdf), which converts
++ *    lowercase to uppercase
+  */
+-int hex_to_bin(char ch)
++int hex_to_bin(unsigned char ch)
+ {
+-      if ((ch >= '0') && (ch <= '9'))
+-              return ch - '0';
+-      ch = tolower(ch);
+-      if ((ch >= 'a') && (ch <= 'f'))
+-              return ch - 'a' + 10;
+-      return -1;
++      unsigned char cu = ch & 0xdf;
++      return -1 +
++              ((ch - '0' +  1) & (unsigned)((ch - '9' - 1) & ('0' - 1 - ch)) 
>> 8) +
++              ((cu - 'A' + 11) & (unsigned)((cu - 'F' - 1) & ('A' - 1 - cu)) 
>> 8);
+ }
+ EXPORT_SYMBOL(hex_to_bin);
+ 
+@@ -48,10 +66,13 @@ EXPORT_SYMBOL(hex_to_bin);
+ int hex2bin(u8 *dst, const char *src, size_t count)
+ {
+       while (count--) {
+-              int hi = hex_to_bin(*src++);
+-              int lo = hex_to_bin(*src++);
++              int hi, lo;
+ 
+-              if ((hi < 0) || (lo < 0))
++              hi = hex_to_bin(*src++);
++              if (unlikely(hi < 0))
++                      return -EINVAL;
++              lo = hex_to_bin(*src++);
++              if (unlikely(lo < 0))
+                       return -EINVAL;
+ 
+               *dst++ = (hi << 4) | lo;
+diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c
+index eac0013809c9b..16255dd0abf4c 100644
+--- a/net/ipv4/igmp.c
++++ b/net/ipv4/igmp.c
+@@ -2368,9 +2368,10 @@ int ip_mc_source(int add, int omode, struct sock *sk, 
struct
+                               newpsl->sl_addr[i] = psl->sl_addr[i];
+                       /* decrease mem now to avoid the memleak warning */
+                       atomic_sub(IP_SFLSIZE(psl->sl_max), &sk->sk_omem_alloc);
+-                      kfree_rcu(psl, rcu);
+               }
+               rcu_assign_pointer(pmc->sflist, newpsl);
++              if (psl)
++                      kfree_rcu(psl, rcu);
+               psl = newpsl;
+       }
+       rv = 1; /* > 0 for insert logic below if sl_count is 0 */
+@@ -2468,11 +2469,13 @@ int ip_mc_msfilter(struct sock *sk, struct ip_msfilter 
*msf, int ifindex)
+                       psl->sl_count, psl->sl_addr, 0);
+               /* decrease mem now to avoid the memleak warning */
+               atomic_sub(IP_SFLSIZE(psl->sl_max), &sk->sk_omem_alloc);
+-              kfree_rcu(psl, rcu);
+-      } else
++      } else {
+               (void) ip_mc_del_src(in_dev, &msf->imsf_multiaddr, pmc->sfmode,
+                       0, NULL, 0);
++      }
+       rcu_assign_pointer(pmc->sflist, newpsl);
++      if (psl)
++              kfree_rcu(psl, rcu);
+       pmc->sfmode = msf->imsf_fmode;
+       err = 0;
+ done:
+diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
+index 1a4d89f8361cb..d916accd97831 100644
+--- a/net/ipv4/ip_gre.c
++++ b/net/ipv4/ip_gre.c
+@@ -429,14 +429,12 @@ static void __gre_xmit(struct sk_buff *skb, struct 
net_device *dev,
+                      __be16 proto)
+ {
+       struct ip_tunnel *tunnel = netdev_priv(dev);
+-
+-      if (tunnel->parms.o_flags & TUNNEL_SEQ)
+-              tunnel->o_seqno++;
++      __be16 flags = tunnel->parms.o_flags;
+ 
+       /* Push GRE header. */
+       gre_build_header(skb, tunnel->tun_hlen,
+-                       tunnel->parms.o_flags, proto, tunnel->parms.o_key,
+-                       htonl(tunnel->o_seqno));
++                       flags, proto, tunnel->parms.o_key,
++                       (flags & TUNNEL_SEQ) ? htonl(tunnel->o_seqno++) : 0);
+ 
+       ip_tunnel_xmit(skb, dev, tnl_params, tnl_params->protocol);
+ }
+diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
+index 9382caeb721a8..f5cc025003cd6 100644
+--- a/net/ipv4/tcp_input.c
++++ b/net/ipv4/tcp_input.c
+@@ -5114,7 +5114,17 @@ static void tcp_new_space(struct sock *sk)
+       sk->sk_write_space(sk);
+ }
+ 
+-static void tcp_check_space(struct sock *sk)
++/* Caller made space either from:
++ * 1) Freeing skbs in rtx queues (after tp->snd_una has advanced)
++ * 2) Sent skbs from output queue (and thus advancing tp->snd_nxt)
++ *
++ * We might be able to generate EPOLLOUT to the application if:
++ * 1) Space consumed in output/rtx queues is below sk->sk_sndbuf/2
++ * 2) notsent amount (tp->write_seq - tp->snd_nxt) became
++ *    small enough that tcp_stream_memory_free() decides it
++ *    is time to generate EPOLLOUT.
++ */
++void tcp_check_space(struct sock *sk)
+ {
+       if (sock_flag(sk, SOCK_QUEUE_SHRUNK)) {
+               sock_reset_flag(sk, SOCK_QUEUE_SHRUNK);
+diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
+index 83c0e859bb337..1a5c42c67d42c 100644
+--- a/net/ipv4/tcp_output.c
++++ b/net/ipv4/tcp_output.c
+@@ -81,6 +81,7 @@ static void tcp_event_new_data_sent(struct sock *sk, const 
struct sk_buff *skb)
+ 
+       NET_ADD_STATS(sock_net(sk), LINUX_MIB_TCPORIGDATASENT,
+                     tcp_skb_pcount(skb));
++      tcp_check_space(sk);
+ }
+ 
+ /* SND.NXT, if window was not shrunk or the amount of shrunk was less than one
+diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
+index 178a3b26f9d2c..09807202bd1c5 100644
+--- a/net/ipv6/addrconf.c
++++ b/net/ipv6/addrconf.c
+@@ -3580,6 +3580,7 @@ static int addrconf_ifdown(struct net_device *dev, int 
how)
+       struct list_head del_list;
+       int _keep_addr;
+       bool keep_addr;
++      bool was_ready;
+       int state, i;
+ 
+       ASSERT_RTNL();
+@@ -3643,7 +3644,10 @@ restart:
+ 
+       addrconf_del_rs_timer(idev);
+ 
+-      /* Step 2: clear flags for stateless addrconf */
++      /* Step 2: clear flags for stateless addrconf, repeated down
++       *         detection
++       */
++      was_ready = idev->if_flags & IF_READY;
+       if (!how)
+               idev->if_flags &= ~(IF_RS_SENT|IF_RA_RCVD|IF_READY);
+ 
+@@ -3730,7 +3734,7 @@ restart:
+       if (how) {
+               ipv6_ac_destroy_dev(idev);
+               ipv6_mc_destroy_dev(idev);
+-      } else {
++      } else if (was_ready) {
+               ipv6_mc_down(idev);
+       }
+ 
+diff --git a/net/netfilter/ipvs/ip_vs_conn.c b/net/netfilter/ipvs/ip_vs_conn.c
+index 620c865c230b5..1ecce76bc266c 100644
+--- a/net/netfilter/ipvs/ip_vs_conn.c
++++ b/net/netfilter/ipvs/ip_vs_conn.c
+@@ -1432,7 +1432,7 @@ int __init ip_vs_conn_init(void)
+       pr_info("Connection hash table configured "
+               "(size=%d, memory=%ldKbytes)\n",
+               ip_vs_conn_tab_size,
+-              (long)(ip_vs_conn_tab_size*sizeof(struct list_head))/1024);
++              (long)(ip_vs_conn_tab_size*sizeof(*ip_vs_conn_tab))/1024);
+       IP_VS_DBG(0, "Each connection entry needs %zd bytes at least\n",
+                 sizeof(struct ip_vs_conn));
+ 
+diff --git a/net/nfc/core.c b/net/nfc/core.c
+index 32a2dfc08f480..8c38a21fb0c69 100644
+--- a/net/nfc/core.c
++++ b/net/nfc/core.c
+@@ -50,7 +50,7 @@ int nfc_fw_download(struct nfc_dev *dev, const char 
*firmware_name)
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               goto error;
+       }
+@@ -106,7 +106,7 @@ int nfc_dev_up(struct nfc_dev *dev)
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               goto error;
+       }
+@@ -154,7 +154,7 @@ int nfc_dev_down(struct nfc_dev *dev)
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               goto error;
+       }
+@@ -218,7 +218,7 @@ int nfc_start_poll(struct nfc_dev *dev, u32 im_protocols, 
u32 tm_protocols)
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               goto error;
+       }
+@@ -257,7 +257,7 @@ int nfc_stop_poll(struct nfc_dev *dev)
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               goto error;
+       }
+@@ -302,7 +302,7 @@ int nfc_dep_link_up(struct nfc_dev *dev, int target_index, 
u8 comm_mode)
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               goto error;
+       }
+@@ -346,7 +346,7 @@ int nfc_dep_link_down(struct nfc_dev *dev)
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               goto error;
+       }
+@@ -412,7 +412,7 @@ int nfc_activate_target(struct nfc_dev *dev, u32 
target_idx, u32 protocol)
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               goto error;
+       }
+@@ -458,7 +458,7 @@ int nfc_deactivate_target(struct nfc_dev *dev, u32 
target_idx, u8 mode)
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               goto error;
+       }
+@@ -505,7 +505,7 @@ int nfc_data_exchange(struct nfc_dev *dev, u32 target_idx, 
struct sk_buff *skb,
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               kfree_skb(skb);
+               goto error;
+@@ -562,7 +562,7 @@ int nfc_enable_se(struct nfc_dev *dev, u32 se_idx)
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               goto error;
+       }
+@@ -611,7 +611,7 @@ int nfc_disable_se(struct nfc_dev *dev, u32 se_idx)
+ 
+       device_lock(&dev->dev);
+ 
+-      if (!device_is_registered(&dev->dev)) {
++      if (dev->shutting_down) {
+               rc = -ENODEV;
+               goto error;
+       }
+@@ -1142,6 +1142,7 @@ int nfc_register_device(struct nfc_dev *dev)
+                       dev->rfkill = NULL;
+               }
+       }
++      dev->shutting_down = false;
+       device_unlock(&dev->dev);
+ 
+       rc = nfc_genl_device_added(dev);
+@@ -1174,12 +1175,10 @@ void nfc_unregister_device(struct nfc_dev *dev)
+               rfkill_unregister(dev->rfkill);
+               rfkill_destroy(dev->rfkill);
+       }
++      dev->shutting_down = true;
+       device_unlock(&dev->dev);
+ 
+       if (dev->ops->check_presence) {
+-              device_lock(&dev->dev);
+-              dev->shutting_down = true;
+-              device_unlock(&dev->dev);
+               del_timer_sync(&dev->check_pres_timer);
+               cancel_work_sync(&dev->check_pres_work);
+       }
+diff --git a/net/nfc/netlink.c b/net/nfc/netlink.c
+index ff5995624146a..0320ae7560ad7 100644
+--- a/net/nfc/netlink.c
++++ b/net/nfc/netlink.c
+@@ -1251,7 +1251,7 @@ int nfc_genl_fw_download_done(struct nfc_dev *dev, const 
char *firmware_name,
+       struct sk_buff *msg;
+       void *hdr;
+ 
+-      msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL);
++      msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC);
+       if (!msg)
+               return -ENOMEM;
+ 
+@@ -1267,7 +1267,7 @@ int nfc_genl_fw_download_done(struct nfc_dev *dev, const 
char *firmware_name,
+ 
+       genlmsg_end(msg, hdr);
+ 
+-      genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL);
++      genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC);
+ 
+       return 0;
+ 
+diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
+index 0c9bc29dcf97a..fdbdcba44917e 100644
+--- a/net/sched/cls_u32.c
++++ b/net/sched/cls_u32.c
+@@ -395,15 +395,20 @@ static int u32_init(struct tcf_proto *tp)
+       return 0;
+ }
+ 
+-static int u32_destroy_key(struct tcf_proto *tp, struct tc_u_knode *n,
+-                         bool free_pf)
++static void __u32_destroy_key(struct tc_u_knode *n)
+ {
+       struct tc_u_hnode *ht = rtnl_dereference(n->ht_down);
+ 
+       tcf_exts_destroy(&n->exts);
+-      tcf_exts_put_net(&n->exts);
+       if (ht && --ht->refcnt == 0)
+               kfree(ht);
++      kfree(n);
++}
++
++static void u32_destroy_key(struct tcf_proto *tp, struct tc_u_knode *n,
++                         bool free_pf)
++{
++      tcf_exts_put_net(&n->exts);
+ #ifdef CONFIG_CLS_U32_PERF
+       if (free_pf)
+               free_percpu(n->pf);
+@@ -412,8 +417,7 @@ static int u32_destroy_key(struct tcf_proto *tp, struct 
tc_u_knode *n,
+       if (free_pf)
+               free_percpu(n->pcpu_success);
+ #endif
+-      kfree(n);
+-      return 0;
++      __u32_destroy_key(n);
+ }
+ 
+ /* u32_delete_key_rcu should be called when free'ing a copied
+@@ -942,13 +946,13 @@ static int u32_change(struct net *net, struct sk_buff 
*in_skb,
+                                   tca[TCA_RATE], ovr);
+ 
+               if (err) {
+-                      u32_destroy_key(tp, new, false);
++                      __u32_destroy_key(new);
+                       return err;
+               }
+ 
+               err = u32_replace_hw_knode(tp, new, flags);
+               if (err) {
+-                      u32_destroy_key(tp, new, false);
++                      __u32_destroy_key(new);
+                       return err;
+               }
+ 
+diff --git a/net/sctp/sm_sideeffect.c b/net/sctp/sm_sideeffect.c
+index 1a1128355d863..169819263c0bb 100644
+--- a/net/sctp/sm_sideeffect.c
++++ b/net/sctp/sm_sideeffect.c
+@@ -456,6 +456,10 @@ void sctp_generate_reconf_event(unsigned long data)
+               goto out_unlock;
+       }
+ 
++      /* This happens when the response arrives after the timer is triggered. 
*/
++      if (!asoc->strreset_chunk)
++              goto out_unlock;
++
+       error = sctp_do_sm(net, SCTP_EVENT_T_TIMEOUT,
+                          SCTP_ST_TIMEOUT(SCTP_EVENT_TIMEOUT_RECONF),
+                          asoc->state, asoc->ep, asoc,
+diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
+index 5124a21ecfa39..1fd2939eb05d7 100644
+--- a/net/sunrpc/xprtsock.c
++++ b/net/sunrpc/xprtsock.c
+@@ -2941,9 +2941,6 @@ static struct rpc_xprt *xs_setup_local(struct 
xprt_create *args)
+               }
+               xprt_set_bound(xprt);
+               xs_format_peer_addresses(xprt, "local", RPCBIND_NETID_LOCAL);
+-              ret = ERR_PTR(xs_local_setup_socket(transport));
+-              if (ret)
+-                      goto out_err;
+               break;
+       default:
+               ret = ERR_PTR(-EAFNOSUPPORT);
+diff --git a/sound/firewire/fireworks/fireworks_hwdep.c 
b/sound/firewire/fireworks/fireworks_hwdep.c
+index a3a3a16f5e08f..4d8302c083a07 100644
+--- a/sound/firewire/fireworks/fireworks_hwdep.c
++++ b/sound/firewire/fireworks/fireworks_hwdep.c
+@@ -35,6 +35,7 @@ hwdep_read_resp_buf(struct snd_efw *efw, char __user *buf, 
long remained,
+       type = SNDRV_FIREWIRE_EVENT_EFW_RESPONSE;
+       if (copy_to_user(buf, &type, sizeof(type)))
+               return -EFAULT;
++      count += sizeof(type);
+       remained -= sizeof(type);
+       buf += sizeof(type);
+ 
+diff --git a/sound/soc/codecs/wm8731.c b/sound/soc/codecs/wm8731.c
+index 4f9a1eb281204..abe5e77ba171b 100644
+--- a/sound/soc/codecs/wm8731.c
++++ b/sound/soc/codecs/wm8731.c
+@@ -604,7 +604,7 @@ static int wm8731_hw_init(struct device *dev, struct 
wm8731_priv *wm8731)
+       ret = wm8731_reset(wm8731->regmap);
+       if (ret < 0) {
+               dev_err(dev, "Failed to issue reset: %d\n", ret);
+-              goto err_regulator_enable;
++              goto err;
+       }
+ 
+       /* Clear POWEROFF, keep everything else disabled */
+@@ -621,10 +621,7 @@ static int wm8731_hw_init(struct device *dev, struct 
wm8731_priv *wm8731)
+ 
+       regcache_mark_dirty(wm8731->regmap);
+ 
+-err_regulator_enable:
+-      /* Regulators will be enabled by bias management */
+-      regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
+-
++err:
+       return ret;
+ }
+ 
+@@ -768,21 +765,27 @@ static int wm8731_i2c_probe(struct i2c_client *i2c,
+               ret = PTR_ERR(wm8731->regmap);
+               dev_err(&i2c->dev, "Failed to allocate register map: %d\n",
+                       ret);
+-              return ret;
++              goto err_regulator_enable;
+       }
+ 
+       ret = wm8731_hw_init(&i2c->dev, wm8731);
+       if (ret != 0)
+-              return ret;
++              goto err_regulator_enable;
+ 
+       ret = snd_soc_register_codec(&i2c->dev,
+                       &soc_codec_dev_wm8731, &wm8731_dai, 1);
+       if (ret != 0) {
+               dev_err(&i2c->dev, "Failed to register CODEC: %d\n", ret);
+-              return ret;
++              goto err_regulator_enable;
+       }
+ 
+       return 0;
++
++err_regulator_enable:
++      /* Regulators will be enabled by bias management */
++      regulator_bulk_disable(ARRAY_SIZE(wm8731->supplies), wm8731->supplies);
++
++      return ret;
+ }
+ 
+ static int wm8731_i2c_remove(struct i2c_client *client)
+diff --git a/sound/soc/codecs/wm8958-dsp2.c b/sound/soc/codecs/wm8958-dsp2.c
+index 6b864c0fc2b67..fa803cef23245 100644
+--- a/sound/soc/codecs/wm8958-dsp2.c
++++ b/sound/soc/codecs/wm8958-dsp2.c
+@@ -533,7 +533,7 @@ static int wm8958_mbc_put(struct snd_kcontrol *kcontrol,
+ 
+       wm8958_dsp_apply(codec, mbc, wm8994->mbc_ena[mbc]);
+ 
+-      return 0;
++      return 1;
+ }
+ 
+ #define WM8958_MBC_SWITCH(xname, xval) {\
+@@ -659,7 +659,7 @@ static int wm8958_vss_put(struct snd_kcontrol *kcontrol,
+ 
+       wm8958_dsp_apply(codec, vss, wm8994->vss_ena[vss]);
+ 
+-      return 0;
++      return 1;
+ }
+ 
+ 
+@@ -733,7 +733,7 @@ static int wm8958_hpf_put(struct snd_kcontrol *kcontrol,
+ 
+       wm8958_dsp_apply(codec, hpf % 3, ucontrol->value.integer.value[0]);
+ 
+-      return 0;
++      return 1;
+ }
+ 
+ #define WM8958_HPF_SWITCH(xname, xval) {\
+@@ -827,7 +827,7 @@ static int wm8958_enh_eq_put(struct snd_kcontrol *kcontrol,
+ 
+       wm8958_dsp_apply(codec, eq, ucontrol->value.integer.value[0]);
+ 
+-      return 0;
++      return 1;
+ }
+ 
+ #define WM8958_ENH_EQ_SWITCH(xname, xval) {\
+diff --git a/sound/soc/soc-generic-dmaengine-pcm.c 
b/sound/soc/soc-generic-dmaengine-pcm.c
+index 5362ceccbd45b..052778c6afad6 100644
+--- a/sound/soc/soc-generic-dmaengine-pcm.c
++++ b/sound/soc/soc-generic-dmaengine-pcm.c
+@@ -98,10 +98,10 @@ static int dmaengine_pcm_hw_params(struct 
snd_pcm_substream *substream,
+ 
+       memset(&slave_config, 0, sizeof(slave_config));
+ 
+-      if (pcm->config && pcm->config->prepare_slave_config)
+-              prepare_slave_config = pcm->config->prepare_slave_config;
+-      else
++      if (!pcm->config)
+               prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config;
++      else
++              prepare_slave_config = pcm->config->prepare_slave_config;
+ 
+       if (prepare_slave_config) {
+               ret = prepare_slave_config(substream, params, &slave_config);

Reply via email to