commit:     b50d7b32ca97171e460c5352fae378d0e1701bc7
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Wed Sep 23 12:03:06 2020 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed Sep 23 12:03:06 2020 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=b50d7b32

Linux patch 4.14.199

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

 0000_README               |    4 +
 1198_linux-4.14.199.patch | 3572 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3576 insertions(+)

diff --git a/0000_README b/0000_README
index eaa0c57..ef7571a 100644
--- a/0000_README
+++ b/0000_README
@@ -835,6 +835,10 @@ Patch:  1197_linux-4.14.198.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.14.198
 
+Patch:  1198_linux-4.14.199.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.14.199
+
 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/1198_linux-4.14.199.patch b/1198_linux-4.14.199.patch
new file mode 100644
index 0000000..7ca6c23
--- /dev/null
+++ b/1198_linux-4.14.199.patch
@@ -0,0 +1,3572 @@
+diff --git a/Makefile b/Makefile
+index d503d041b5267..aaba1a2b45833 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 14
+-SUBLEVEL = 198
++SUBLEVEL = 199
+ EXTRAVERSION =
+ NAME = Petit Gorille
+ 
+diff --git a/arch/arc/boot/dts/hsdk.dts b/arch/arc/boot/dts/hsdk.dts
+index 57d81c6aa379d..75aa3a8f9fdc9 100644
+--- a/arch/arc/boot/dts/hsdk.dts
++++ b/arch/arc/boot/dts/hsdk.dts
+@@ -79,6 +79,8 @@
+ 
+       arcpct: pct {
+               compatible = "snps,archs-pct";
++              interrupt-parent = <&cpu_intc>;
++              interrupts = <20>;
+       };
+ 
+       /* TIMER0 with interrupt for clockevent */
+@@ -161,7 +163,7 @@
+                       reg = <0x8000 0x2000>;
+                       interrupts = <10>;
+                       interrupt-names = "macirq";
+-                      phy-mode = "rgmii";
++                      phy-mode = "rgmii-id";
+                       snps,pbl = <32>;
+                       snps,multicast-filter-bins = <256>;
+                       clocks = <&gmacclk>;
+@@ -177,7 +179,7 @@
+                               #address-cells = <1>;
+                               #size-cells = <0>;
+                               compatible = "snps,dwmac-mdio";
+-                              phy0: ethernet-phy@0 {
++                              phy0: ethernet-phy@0 { /* Micrel KSZ9031 */
+                                       reg = <0>;
+                                       ti,rx-internal-delay = 
<DP83867_RGMIIDCTL_2_00_NS>;
+                                       ti,tx-internal-delay = 
<DP83867_RGMIIDCTL_2_00_NS>;
+diff --git a/arch/arc/plat-eznps/include/plat/ctop.h 
b/arch/arc/plat-eznps/include/plat/ctop.h
+index 4f6a1673b3a6e..ddfca2c3357a0 100644
+--- a/arch/arc/plat-eznps/include/plat/ctop.h
++++ b/arch/arc/plat-eznps/include/plat/ctop.h
+@@ -43,7 +43,6 @@
+ #define CTOP_AUX_DPC                          (CTOP_AUX_BASE + 0x02C)
+ #define CTOP_AUX_LPC                          (CTOP_AUX_BASE + 0x030)
+ #define CTOP_AUX_EFLAGS                               (CTOP_AUX_BASE + 0x080)
+-#define CTOP_AUX_IACK                         (CTOP_AUX_BASE + 0x088)
+ #define CTOP_AUX_GPA1                         (CTOP_AUX_BASE + 0x08C)
+ #define CTOP_AUX_UDMC                         (CTOP_AUX_BASE + 0x300)
+ 
+diff --git a/arch/arm/boot/dts/bcm5301x.dtsi b/arch/arm/boot/dts/bcm5301x.dtsi
+index 501877e87a5b8..dffa8b9bd536d 100644
+--- a/arch/arm/boot/dts/bcm5301x.dtsi
++++ b/arch/arm/boot/dts/bcm5301x.dtsi
+@@ -426,7 +426,7 @@
+       };
+ 
+       spi@18029200 {
+-              compatible = "brcm,spi-bcm-qspi", "brcm,spi-nsp-qspi";
++              compatible = "brcm,spi-nsp-qspi", "brcm,spi-bcm-qspi";
+               reg = <0x18029200 0x184>,
+                     <0x18029000 0x124>,
+                     <0x1811b408 0x004>,
+diff --git a/arch/arm/boot/dts/socfpga_arria10.dtsi 
b/arch/arm/boot/dts/socfpga_arria10.dtsi
+index 672e73e35228c..64f30676b285d 100644
+--- a/arch/arm/boot/dts/socfpga_arria10.dtsi
++++ b/arch/arm/boot/dts/socfpga_arria10.dtsi
+@@ -779,7 +779,7 @@
+               timer3: timer3@ffd00100 {
+                       compatible = "snps,dw-apb-timer";
+                       interrupts = <0 118 IRQ_TYPE_LEVEL_HIGH>;
+-                      reg = <0xffd01000 0x100>;
++                      reg = <0xffd00100 0x100>;
+                       clocks = <&l4_sys_free_clk>;
+                       clock-names = "timer";
+               };
+diff --git a/arch/arm/boot/dts/vfxxx.dtsi b/arch/arm/boot/dts/vfxxx.dtsi
+index 5d654b5b4ce64..53142ae1dba56 100644
+--- a/arch/arm/boot/dts/vfxxx.dtsi
++++ b/arch/arm/boot/dts/vfxxx.dtsi
+@@ -527,7 +527,7 @@
+                       };
+ 
+                       ocotp: ocotp@400a5000 {
+-                              compatible = "fsl,vf610-ocotp";
++                              compatible = "fsl,vf610-ocotp", "syscon";
+                               reg = <0x400a5000 0x1000>;
+                               clocks = <&clks VF610_CLK_OCOTP>;
+                       };
+diff --git a/arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi 
b/arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi
+index 0b72094bcf5a2..05f82819ae2d1 100644
+--- a/arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi
++++ b/arch/arm64/boot/dts/broadcom/northstar2/ns2.dtsi
+@@ -745,7 +745,7 @@
+               };
+ 
+               qspi: spi@66470200 {
+-                      compatible = "brcm,spi-bcm-qspi", "brcm,spi-ns2-qspi";
++                      compatible = "brcm,spi-ns2-qspi", "brcm,spi-bcm-qspi";
+                       reg = <0x66470200 0x184>,
+                               <0x66470000 0x124>,
+                               <0x67017408 0x004>,
+diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
+index 7e267d657c561..49c540790fd2d 100644
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -856,6 +856,7 @@ config SNI_RM
+       select I8253
+       select I8259
+       select ISA
++      select MIPS_L1_CACHE_SHIFT_6
+       select SWAP_IO_SPACE if CPU_BIG_ENDIAN
+       select SYS_HAS_CPU_R4X00
+       select SYS_HAS_CPU_R5000
+diff --git a/arch/mips/kvm/mips.c b/arch/mips/kvm/mips.c
+index aa6c365f25591..8614225e92eb5 100644
+--- a/arch/mips/kvm/mips.c
++++ b/arch/mips/kvm/mips.c
+@@ -131,6 +131,8 @@ void kvm_arch_check_processor_compat(void *rtn)
+ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
+ {
+       switch (type) {
++      case KVM_VM_MIPS_AUTO:
++              break;
+ #ifdef CONFIG_KVM_MIPS_VZ
+       case KVM_VM_MIPS_VZ:
+ #else
+diff --git a/arch/mips/sni/a20r.c b/arch/mips/sni/a20r.c
+index f9407e1704762..c6af7047eb0d2 100644
+--- a/arch/mips/sni/a20r.c
++++ b/arch/mips/sni/a20r.c
+@@ -143,7 +143,10 @@ static struct platform_device sc26xx_pdev = {
+       },
+ };
+ 
+-static u32 a20r_ack_hwint(void)
++/*
++ * Trigger chipset to update CPU's CAUSE IP field
++ */
++static u32 a20r_update_cause_ip(void)
+ {
+       u32 status = read_c0_status();
+ 
+@@ -205,12 +208,14 @@ static void a20r_hwint(void)
+       int irq;
+ 
+       clear_c0_status(IE_IRQ0);
+-      status = a20r_ack_hwint();
++      status = a20r_update_cause_ip();
+       cause = read_c0_cause();
+ 
+       irq = ffs(((cause & status) >> 8) & 0xf8);
+       if (likely(irq > 0))
+               do_IRQ(SNI_A20R_IRQ_BASE + irq - 1);
++
++      a20r_update_cause_ip();
+       set_c0_status(IE_IRQ0);
+ }
+ 
+diff --git a/arch/powerpc/configs/pasemi_defconfig 
b/arch/powerpc/configs/pasemi_defconfig
+index 6daa56f8895cb..5f743db4c9f8c 100644
+--- a/arch/powerpc/configs/pasemi_defconfig
++++ b/arch/powerpc/configs/pasemi_defconfig
+@@ -111,7 +111,6 @@ CONFIG_FB_NVIDIA=y
+ CONFIG_FB_NVIDIA_I2C=y
+ CONFIG_FB_RADEON=y
+ # CONFIG_LCD_CLASS_DEVICE is not set
+-CONFIG_VGACON_SOFT_SCROLLBACK=y
+ CONFIG_LOGO=y
+ CONFIG_SOUND=y
+ CONFIG_SND=y
+diff --git a/arch/powerpc/configs/ppc6xx_defconfig 
b/arch/powerpc/configs/ppc6xx_defconfig
+index da0e8d535eb88..b1b072a3f7898 100644
+--- a/arch/powerpc/configs/ppc6xx_defconfig
++++ b/arch/powerpc/configs/ppc6xx_defconfig
+@@ -781,7 +781,6 @@ CONFIG_FB_TRIDENT=m
+ CONFIG_FB_SM501=m
+ CONFIG_FB_IBM_GXT4500=y
+ CONFIG_LCD_PLATFORM=m
+-CONFIG_VGACON_SOFT_SCROLLBACK=y
+ CONFIG_FRAMEBUFFER_CONSOLE=y
+ CONFIG_FRAMEBUFFER_CONSOLE_ROTATION=y
+ CONFIG_LOGO=y
+diff --git a/arch/powerpc/kernel/dma-iommu.c b/arch/powerpc/kernel/dma-iommu.c
+index 66f33e7f8d404..a39a1a0d844e7 100644
+--- a/arch/powerpc/kernel/dma-iommu.c
++++ b/arch/powerpc/kernel/dma-iommu.c
+@@ -100,7 +100,8 @@ static u64 dma_iommu_get_required_mask(struct device *dev)
+       if (!tbl)
+               return 0;
+ 
+-      mask = 1ULL < (fls_long(tbl->it_offset + tbl->it_size) - 1);
++      mask = 1ULL << (fls_long(tbl->it_offset + tbl->it_size) +
++                      tbl->it_page_shift - 1);
+       mask += mask - 1;
+ 
+       return mask;
+diff --git a/arch/x86/configs/i386_defconfig b/arch/x86/configs/i386_defconfig
+index 0eb9f92f37179..136972a4c4541 100644
+--- a/arch/x86/configs/i386_defconfig
++++ b/arch/x86/configs/i386_defconfig
+@@ -217,7 +217,6 @@ CONFIG_FB_MODE_HELPERS=y
+ CONFIG_FB_TILEBLITTING=y
+ CONFIG_FB_EFI=y
+ # CONFIG_LCD_CLASS_DEVICE is not set
+-CONFIG_VGACON_SOFT_SCROLLBACK=y
+ CONFIG_LOGO=y
+ # CONFIG_LOGO_LINUX_MONO is not set
+ # CONFIG_LOGO_LINUX_VGA16 is not set
+@@ -247,6 +246,7 @@ CONFIG_USB_HIDDEV=y
+ CONFIG_USB=y
+ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+ CONFIG_USB_MON=y
++CONFIG_USB_XHCI_HCD=y
+ CONFIG_USB_EHCI_HCD=y
+ CONFIG_USB_EHCI_TT_NEWSCHED=y
+ CONFIG_USB_OHCI_HCD=y
+diff --git a/arch/x86/configs/x86_64_defconfig 
b/arch/x86/configs/x86_64_defconfig
+index e32fc1f274d85..d387193ef7fc3 100644
+--- a/arch/x86/configs/x86_64_defconfig
++++ b/arch/x86/configs/x86_64_defconfig
+@@ -213,7 +213,6 @@ CONFIG_FB_MODE_HELPERS=y
+ CONFIG_FB_TILEBLITTING=y
+ CONFIG_FB_EFI=y
+ # CONFIG_LCD_CLASS_DEVICE is not set
+-CONFIG_VGACON_SOFT_SCROLLBACK=y
+ CONFIG_LOGO=y
+ # CONFIG_LOGO_LINUX_MONO is not set
+ # CONFIG_LOGO_LINUX_VGA16 is not set
+@@ -243,6 +242,7 @@ CONFIG_USB_HIDDEV=y
+ CONFIG_USB=y
+ CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
+ CONFIG_USB_MON=y
++CONFIG_USB_XHCI_HCD=y
+ CONFIG_USB_EHCI_HCD=y
+ CONFIG_USB_EHCI_TT_NEWSCHED=y
+ CONFIG_USB_OHCI_HCD=y
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
+index 6876231778a96..396d41f192caf 100644
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -9144,6 +9144,7 @@ static int vmx_handle_exit(struct kvm_vcpu *vcpu)
+                       (exit_reason != EXIT_REASON_EXCEPTION_NMI &&
+                       exit_reason != EXIT_REASON_EPT_VIOLATION &&
+                       exit_reason != EXIT_REASON_PML_FULL &&
++                      exit_reason != EXIT_REASON_APIC_ACCESS &&
+                       exit_reason != EXIT_REASON_TASK_SWITCH)) {
+               vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
+               vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_DELIVERY_EV;
+diff --git a/drivers/atm/firestream.c b/drivers/atm/firestream.c
+index 0e449ee11ac7f..e7cffd0cc3616 100644
+--- a/drivers/atm/firestream.c
++++ b/drivers/atm/firestream.c
+@@ -1013,6 +1013,7 @@ static int fs_open(struct atm_vcc *atm_vcc)
+                               error = make_rate (pcr, r, &tmc0, NULL);
+                               if (error) {
+                                       kfree(tc);
++                                      kfree(vcc);
+                                       return error;
+                               }
+                       }
+diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c
+index b9b20e1fa8c88..a4725ac1d4096 100644
+--- a/drivers/block/rbd.c
++++ b/drivers/block/rbd.c
+@@ -4534,6 +4534,9 @@ static ssize_t rbd_config_info_show(struct device *dev,
+ {
+       struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
+ 
++      if (!capable(CAP_SYS_ADMIN))
++              return -EPERM;
++
+       return sprintf(buf, "%s\n", rbd_dev->config_info);
+ }
+ 
+@@ -4635,6 +4638,9 @@ static ssize_t rbd_image_refresh(struct device *dev,
+       struct rbd_device *rbd_dev = dev_to_rbd_dev(dev);
+       int ret;
+ 
++      if (!capable(CAP_SYS_ADMIN))
++              return -EPERM;
++
+       ret = rbd_dev_refresh(rbd_dev);
+       if (ret)
+               return ret;
+@@ -6159,6 +6165,9 @@ static ssize_t do_rbd_add(struct bus_type *bus,
+       bool read_only;
+       int rc;
+ 
++      if (!capable(CAP_SYS_ADMIN))
++              return -EPERM;
++
+       if (!try_module_get(THIS_MODULE))
+               return -ENODEV;
+ 
+@@ -6311,6 +6320,9 @@ static ssize_t do_rbd_remove(struct bus_type *bus,
+       bool force = false;
+       int ret;
+ 
++      if (!capable(CAP_SYS_ADMIN))
++              return -EPERM;
++
+       dev_id = -1;
+       opt_buf[0] = '\0';
+       sscanf(buf, "%d %5s", &dev_id, opt_buf);
+diff --git a/drivers/clk/rockchip/clk-rk3228.c 
b/drivers/clk/rockchip/clk-rk3228.c
+index 04f4f3739e3be..8d11d76e1db7c 100644
+--- a/drivers/clk/rockchip/clk-rk3228.c
++++ b/drivers/clk/rockchip/clk-rk3228.c
+@@ -144,7 +144,7 @@ PNAME(mux_usb480m_p)               = { "usb480m_phy", 
"xin24m" };
+ PNAME(mux_hdmiphy_p)          = { "hdmiphy_phy", "xin24m" };
+ PNAME(mux_aclk_cpu_src_p)     = { "cpll_aclk_cpu", "gpll_aclk_cpu", 
"hdmiphy_aclk_cpu" };
+ 
+-PNAME(mux_pll_src_4plls_p)    = { "cpll", "gpll", "hdmiphy" "usb480m" };
++PNAME(mux_pll_src_4plls_p)    = { "cpll", "gpll", "hdmiphy", "usb480m" };
+ PNAME(mux_pll_src_3plls_p)    = { "cpll", "gpll", "hdmiphy" };
+ PNAME(mux_pll_src_2plls_p)    = { "cpll", "gpll" };
+ PNAME(mux_sclk_hdmi_cec_p)    = { "cpll", "gpll", "xin24m" };
+diff --git a/drivers/cpufreq/intel_pstate.c b/drivers/cpufreq/intel_pstate.c
+index 5c41dc9aaa46d..be1a7bb0b4011 100644
+--- a/drivers/cpufreq/intel_pstate.c
++++ b/drivers/cpufreq/intel_pstate.c
+@@ -2098,9 +2098,15 @@ static int intel_pstate_update_status(const char *buf, 
size_t size)
+ {
+       int ret;
+ 
+-      if (size == 3 && !strncmp(buf, "off", size))
+-              return intel_pstate_driver ?
+-                      intel_pstate_unregister_driver() : -EINVAL;
++      if (size == 3 && !strncmp(buf, "off", size)) {
++              if (!intel_pstate_driver)
++                      return -EINVAL;
++
++              if (hwp_active)
++                      return -EBUSY;
++
++              return intel_pstate_unregister_driver();
++      }
+ 
+       if (size == 6 && !strncmp(buf, "active", size)) {
+               if (intel_pstate_driver) {
+diff --git a/drivers/dma/acpi-dma.c b/drivers/dma/acpi-dma.c
+index 4a748c3435d7d..8d99c84361cbb 100644
+--- a/drivers/dma/acpi-dma.c
++++ b/drivers/dma/acpi-dma.c
+@@ -131,11 +131,13 @@ static void acpi_dma_parse_csrt(struct acpi_device 
*adev, struct acpi_dma *adma)
+               if (ret < 0) {
+                       dev_warn(&adev->dev,
+                                "error in parsing resource group\n");
+-                      return;
++                      break;
+               }
+ 
+               grp = (struct acpi_csrt_group *)((void *)grp + grp->length);
+       }
++
++      acpi_put_table((struct acpi_table_header *)csrt);
+ }
+ 
+ /**
+diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c 
b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+index 670662128edd2..f32645a33cc90 100644
+--- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
++++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
+@@ -538,8 +538,13 @@ err_pm:
+       pm_runtime_disable(dev);
+ err_node:
+       of_node_put(private->mutex_node);
+-      for (i = 0; i < DDP_COMPONENT_ID_MAX; i++)
++      for (i = 0; i < DDP_COMPONENT_ID_MAX; i++) {
+               of_node_put(private->comp_node[i]);
++              if (private->ddp_comp[i]) {
++                      put_device(private->ddp_comp[i]->larb_dev);
++                      private->ddp_comp[i] = NULL;
++              }
++      }
+       return ret;
+ }
+ 
+diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c 
b/drivers/gpu/drm/mediatek/mtk_hdmi.c
+index 3c69c73fbd473..f1a376c34e713 100644
+--- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
++++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
+@@ -1476,25 +1476,30 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi 
*hdmi,
+               dev_err(dev,
+                       "Failed to get system configuration registers: %d\n",
+                       ret);
+-              return ret;
++              goto put_device;
+       }
+       hdmi->sys_regmap = regmap;
+ 
+       mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       hdmi->regs = devm_ioremap_resource(dev, mem);
+-      if (IS_ERR(hdmi->regs))
+-              return PTR_ERR(hdmi->regs);
++      if (IS_ERR(hdmi->regs)) {
++              ret = PTR_ERR(hdmi->regs);
++              goto put_device;
++      }
+ 
+       remote = of_graph_get_remote_node(np, 1, 0);
+-      if (!remote)
+-              return -EINVAL;
++      if (!remote) {
++              ret = -EINVAL;
++              goto put_device;
++      }
+ 
+       if (!of_device_is_compatible(remote, "hdmi-connector")) {
+               hdmi->next_bridge = of_drm_find_bridge(remote);
+               if (!hdmi->next_bridge) {
+                       dev_err(dev, "Waiting for external bridge\n");
+                       of_node_put(remote);
+-                      return -EPROBE_DEFER;
++                      ret = -EPROBE_DEFER;
++                      goto put_device;
+               }
+       }
+ 
+@@ -1503,7 +1508,8 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi *hdmi,
+               dev_err(dev, "Failed to find ddc-i2c-bus node in %pOF\n",
+                       remote);
+               of_node_put(remote);
+-              return -EINVAL;
++              ret = -EINVAL;
++              goto put_device;
+       }
+       of_node_put(remote);
+ 
+@@ -1511,10 +1517,14 @@ static int mtk_hdmi_dt_parse_pdata(struct mtk_hdmi 
*hdmi,
+       of_node_put(i2c_np);
+       if (!hdmi->ddc_adpt) {
+               dev_err(dev, "Failed to get ddc i2c adapter by node\n");
+-              return -EINVAL;
++              ret = -EINVAL;
++              goto put_device;
+       }
+ 
+       return 0;
++put_device:
++      put_device(hdmi->cec_dev);
++      return ret;
+ }
+ 
+ /*
+diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
+index 462f7f363faab..5bf633c15cd4b 100644
+--- a/drivers/hv/channel_mgmt.c
++++ b/drivers/hv/channel_mgmt.c
+@@ -774,7 +774,7 @@ static void vmbus_wait_for_unload(void)
+       void *page_addr;
+       struct hv_message *msg;
+       struct vmbus_channel_message_header *hdr;
+-      u32 message_type;
++      u32 message_type, i;
+ 
+       /*
+        * CHANNELMSG_UNLOAD_RESPONSE is always delivered to the CPU which was
+@@ -784,8 +784,11 @@ static void vmbus_wait_for_unload(void)
+        * functional and vmbus_unload_response() will complete
+        * vmbus_connection.unload_event. If not, the last thing we can do is
+        * read message pages for all CPUs directly.
++       *
++       * Wait no more than 10 seconds so that the panic path can't get
++       * hung forever in case the response message isn't seen.
+        */
+-      while (1) {
++      for (i = 0; i < 1000; i++) {
+               if (completion_done(&vmbus_connection.unload_event))
+                       break;
+ 
+diff --git a/drivers/i2c/algos/i2c-algo-pca.c 
b/drivers/i2c/algos/i2c-algo-pca.c
+index 3a9db4626cb60..1886588b9ea3e 100644
+--- a/drivers/i2c/algos/i2c-algo-pca.c
++++ b/drivers/i2c/algos/i2c-algo-pca.c
+@@ -50,8 +50,22 @@ static void pca_reset(struct i2c_algo_pca_data *adap)
+               pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_IPRESET);
+               pca_outw(adap, I2C_PCA_IND, 0xA5);
+               pca_outw(adap, I2C_PCA_IND, 0x5A);
++
++              /*
++               * After a reset we need to re-apply any configuration
++               * (calculated in pca_init) to get the bus in a working state.
++               */
++              pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_IMODE);
++              pca_outw(adap, I2C_PCA_IND, adap->bus_settings.mode);
++              pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_ISCLL);
++              pca_outw(adap, I2C_PCA_IND, adap->bus_settings.tlow);
++              pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_ISCLH);
++              pca_outw(adap, I2C_PCA_IND, adap->bus_settings.thi);
++
++              pca_set_con(adap, I2C_PCA_CON_ENSIO);
+       } else {
+               adap->reset_chip(adap->data);
++              pca_set_con(adap, I2C_PCA_CON_ENSIO | 
adap->bus_settings.clock_freq);
+       }
+ }
+ 
+@@ -435,13 +449,14 @@ static int pca_init(struct i2c_adapter *adap)
+                               " Use the nominal frequency.\n", adap->name);
+               }
+ 
+-              pca_reset(pca_data);
+-
+               clock = pca_clock(pca_data);
+               printk(KERN_INFO "%s: Clock frequency is %dkHz\n",
+                    adap->name, freqs[clock]);
+ 
+-              pca_set_con(pca_data, I2C_PCA_CON_ENSIO | clock);
++              /* Store settings as these will be needed when the PCA chip is 
reset */
++              pca_data->bus_settings.clock_freq = clock;
++
++              pca_reset(pca_data);
+       } else {
+               int clock;
+               int mode;
+@@ -508,19 +523,15 @@ static int pca_init(struct i2c_adapter *adap)
+                       thi = tlow * min_thi / min_tlow;
+               }
+ 
++              /* Store settings as these will be needed when the PCA chip is 
reset */
++              pca_data->bus_settings.mode = mode;
++              pca_data->bus_settings.tlow = tlow;
++              pca_data->bus_settings.thi = thi;
++
+               pca_reset(pca_data);
+ 
+               printk(KERN_INFO
+                    "%s: Clock frequency is %dHz\n", adap->name, clock * 100);
+-
+-              pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IMODE);
+-              pca_outw(pca_data, I2C_PCA_IND, mode);
+-              pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ISCLL);
+-              pca_outw(pca_data, I2C_PCA_IND, tlow);
+-              pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_ISCLH);
+-              pca_outw(pca_data, I2C_PCA_IND, thi);
+-
+-              pca_set_con(pca_data, I2C_PCA_CON_ENSIO);
+       }
+       udelay(500); /* 500 us for oscillator to stabilise */
+ 
+diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c
+index 06debfa903b9c..21cf2b7dd0f29 100644
+--- a/drivers/i2c/busses/i2c-i801.c
++++ b/drivers/i2c/busses/i2c-i801.c
+@@ -1499,6 +1499,16 @@ static inline int i801_acpi_probe(struct i801_priv 
*priv) { return 0; }
+ static inline void i801_acpi_remove(struct i801_priv *priv) { }
+ #endif
+ 
++static unsigned char i801_setup_hstcfg(struct i801_priv *priv)
++{
++      unsigned char hstcfg = priv->original_hstcfg;
++
++      hstcfg &= ~SMBHSTCFG_I2C_EN;    /* SMBus timing */
++      hstcfg |= SMBHSTCFG_HST_EN;
++      pci_write_config_byte(priv->pci_dev, SMBHSTCFG, hstcfg);
++      return hstcfg;
++}
++
+ static int i801_probe(struct pci_dev *dev, const struct pci_device_id *id)
+ {
+       unsigned char temp;
+@@ -1602,14 +1612,10 @@ static int i801_probe(struct pci_dev *dev, const 
struct pci_device_id *id)
+               return err;
+       }
+ 
+-      pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &temp);
+-      priv->original_hstcfg = temp;
+-      temp &= ~SMBHSTCFG_I2C_EN;      /* SMBus timing */
+-      if (!(temp & SMBHSTCFG_HST_EN)) {
++      pci_read_config_byte(priv->pci_dev, SMBHSTCFG, &priv->original_hstcfg);
++      temp = i801_setup_hstcfg(priv);
++      if (!(priv->original_hstcfg & SMBHSTCFG_HST_EN))
+               dev_info(&dev->dev, "Enabling SMBus device\n");
+-              temp |= SMBHSTCFG_HST_EN;
+-      }
+-      pci_write_config_byte(priv->pci_dev, SMBHSTCFG, temp);
+ 
+       if (temp & SMBHSTCFG_SMB_SMI_EN) {
+               dev_dbg(&dev->dev, "SMBus using interrupt SMI#\n");
+@@ -1736,6 +1742,7 @@ static int i801_resume(struct device *dev)
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct i801_priv *priv = pci_get_drvdata(pci_dev);
+ 
++      i801_setup_hstcfg(priv);
+       i801_enable_host_notify(&priv->adapter);
+ 
+       return 0;
+diff --git a/drivers/iio/accel/bmc150-accel-core.c 
b/drivers/iio/accel/bmc150-accel-core.c
+index 7e86a5b7ec4e8..0d40c32b56ce8 100644
+--- a/drivers/iio/accel/bmc150-accel-core.c
++++ b/drivers/iio/accel/bmc150-accel-core.c
+@@ -197,6 +197,14 @@ struct bmc150_accel_data {
+       struct mutex mutex;
+       u8 fifo_mode, watermark;
+       s16 buffer[8];
++      /*
++       * Ensure there is sufficient space and correct alignment for
++       * the timestamp if enabled
++       */
++      struct {
++              __le16 channels[3];
++              s64 ts __aligned(8);
++      } scan;
+       u8 bw_bits;
+       u32 slope_dur;
+       u32 slope_thres;
+@@ -933,15 +941,16 @@ static int __bmc150_accel_fifo_flush(struct iio_dev 
*indio_dev,
+        * now.
+        */
+       for (i = 0; i < count; i++) {
+-              u16 sample[8];
+               int j, bit;
+ 
+               j = 0;
+               for_each_set_bit(bit, indio_dev->active_scan_mask,
+                                indio_dev->masklength)
+-                      memcpy(&sample[j++], &buffer[i * 3 + bit], 2);
++                      memcpy(&data->scan.channels[j++], &buffer[i * 3 + bit],
++                             sizeof(data->scan.channels[0]));
+ 
+-              iio_push_to_buffers_with_timestamp(indio_dev, sample, tstamp);
++              iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
++                                                 tstamp);
+ 
+               tstamp += sample_period;
+       }
+diff --git a/drivers/iio/accel/kxsd9.c b/drivers/iio/accel/kxsd9.c
+index 9af60ac707382..1bda730a71c0b 100644
+--- a/drivers/iio/accel/kxsd9.c
++++ b/drivers/iio/accel/kxsd9.c
+@@ -212,14 +212,20 @@ static irqreturn_t kxsd9_trigger_handler(int irq, void 
*p)
+       const struct iio_poll_func *pf = p;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct kxsd9_state *st = iio_priv(indio_dev);
++      /*
++       * Ensure correct positioning and alignment of timestamp.
++       * No need to zero initialize as all elements written.
++       */
++      struct {
++              __be16 chan[4];
++              s64 ts __aligned(8);
++      } hw_values;
+       int ret;
+-      /* 4 * 16bit values AND timestamp */
+-      __be16 hw_values[8];
+ 
+       ret = regmap_bulk_read(st->map,
+                              KXSD9_REG_X,
+-                             &hw_values,
+-                             8);
++                             hw_values.chan,
++                             sizeof(hw_values.chan));
+       if (ret) {
+               dev_err(st->dev,
+                       "error reading data\n");
+@@ -227,7 +233,7 @@ static irqreturn_t kxsd9_trigger_handler(int irq, void *p)
+       }
+ 
+       iio_push_to_buffers_with_timestamp(indio_dev,
+-                                         hw_values,
++                                         &hw_values,
+                                          iio_get_time_ns(indio_dev));
+       iio_trigger_notify_done(indio_dev->trig);
+ 
+diff --git a/drivers/iio/accel/mma7455_core.c 
b/drivers/iio/accel/mma7455_core.c
+index 6551085bedd75..f7804e56cc272 100644
+--- a/drivers/iio/accel/mma7455_core.c
++++ b/drivers/iio/accel/mma7455_core.c
+@@ -55,6 +55,14 @@
+ 
+ struct mma7455_data {
+       struct regmap *regmap;
++      /*
++       * Used to reorganize data.  Will ensure correct alignment of
++       * the timestamp if present
++       */
++      struct {
++              __le16 channels[3];
++              s64 ts __aligned(8);
++      } scan;
+ };
+ 
+ static int mma7455_drdy(struct mma7455_data *mma7455)
+@@ -85,19 +93,19 @@ static irqreturn_t mma7455_trigger_handler(int irq, void 
*p)
+       struct iio_poll_func *pf = p;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct mma7455_data *mma7455 = iio_priv(indio_dev);
+-      u8 buf[16]; /* 3 x 16-bit channels + padding + ts */
+       int ret;
+ 
+       ret = mma7455_drdy(mma7455);
+       if (ret)
+               goto done;
+ 
+-      ret = regmap_bulk_read(mma7455->regmap, MMA7455_REG_XOUTL, buf,
+-                             sizeof(__le16) * 3);
++      ret = regmap_bulk_read(mma7455->regmap, MMA7455_REG_XOUTL,
++                             mma7455->scan.channels,
++                             sizeof(mma7455->scan.channels));
+       if (ret)
+               goto done;
+ 
+-      iio_push_to_buffers_with_timestamp(indio_dev, buf,
++      iio_push_to_buffers_with_timestamp(indio_dev, &mma7455->scan,
+                                          iio_get_time_ns(indio_dev));
+ 
+ done:
+diff --git a/drivers/iio/accel/mma8452.c b/drivers/iio/accel/mma8452.c
+index 49263428c4cf0..200ac4dad7990 100644
+--- a/drivers/iio/accel/mma8452.c
++++ b/drivers/iio/accel/mma8452.c
+@@ -105,6 +105,12 @@ struct mma8452_data {
+       u8 ctrl_reg1;
+       u8 data_cfg;
+       const struct mma_chip_info *chip_info;
++
++      /* Ensure correct alignment of time stamp when present */
++      struct {
++              __be16 channels[3];
++              s64 ts __aligned(8);
++      } buffer;
+ };
+ 
+ /**
+@@ -1003,14 +1009,13 @@ static irqreturn_t mma8452_trigger_handler(int irq, 
void *p)
+       struct iio_poll_func *pf = p;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct mma8452_data *data = iio_priv(indio_dev);
+-      u8 buffer[16]; /* 3 16-bit channels + padding + ts */
+       int ret;
+ 
+-      ret = mma8452_read(data, (__be16 *)buffer);
++      ret = mma8452_read(data, data->buffer.channels);
+       if (ret < 0)
+               goto done;
+ 
+-      iio_push_to_buffers_with_timestamp(indio_dev, buffer,
++      iio_push_to_buffers_with_timestamp(indio_dev, &data->buffer,
+                                          iio_get_time_ns(indio_dev));
+ 
+ done:
+diff --git a/drivers/iio/adc/ina2xx-adc.c b/drivers/iio/adc/ina2xx-adc.c
+index d5b9f831eba77..e87c7db53e09e 100644
+--- a/drivers/iio/adc/ina2xx-adc.c
++++ b/drivers/iio/adc/ina2xx-adc.c
+@@ -133,6 +133,11 @@ struct ina2xx_chip_info {
+       int int_time_vbus; /* Bus voltage integration time uS */
+       int int_time_vshunt; /* Shunt voltage integration time uS */
+       bool allow_async_readout;
++      /* data buffer needs space for channel data and timestamp */
++      struct {
++              u16 chan[4];
++              u64 ts __aligned(8);
++      } scan;
+ };
+ 
+ static const struct ina2xx_config ina2xx_config[] = {
+@@ -598,7 +603,6 @@ static const struct iio_chan_spec ina219_channels[] = {
+ static int ina2xx_work_buffer(struct iio_dev *indio_dev)
+ {
+       struct ina2xx_chip_info *chip = iio_priv(indio_dev);
+-      unsigned short data[8];
+       int bit, ret, i = 0;
+       s64 time_a, time_b;
+       unsigned int alert;
+@@ -648,7 +652,7 @@ static int ina2xx_work_buffer(struct iio_dev *indio_dev)
+               if (ret < 0)
+                       return ret;
+ 
+-              data[i++] = val;
++              chip->scan.chan[i++] = val;
+ 
+               if (INA2XX_SHUNT_VOLTAGE + bit == INA2XX_POWER)
+                       cnvr_need_clear = 0;
+@@ -665,8 +669,7 @@ static int ina2xx_work_buffer(struct iio_dev *indio_dev)
+ 
+       time_b = iio_get_time_ns(indio_dev);
+ 
+-      iio_push_to_buffers_with_timestamp(indio_dev,
+-                                         (unsigned int *)data, time_a);
++      iio_push_to_buffers_with_timestamp(indio_dev, &chip->scan, time_a);
+ 
+       return (unsigned long)(time_b - time_a) / 1000;
+ };
+diff --git a/drivers/iio/adc/max1118.c b/drivers/iio/adc/max1118.c
+index 2e9648a078c42..3dca3cf18d87c 100644
+--- a/drivers/iio/adc/max1118.c
++++ b/drivers/iio/adc/max1118.c
+@@ -38,6 +38,11 @@ struct max1118 {
+       struct spi_device *spi;
+       struct mutex lock;
+       struct regulator *reg;
++      /* Ensure natural alignment of buffer elements */
++      struct {
++              u8 channels[2];
++              s64 ts __aligned(8);
++      } scan;
+ 
+       u8 data ____cacheline_aligned;
+ };
+@@ -163,7 +168,6 @@ static irqreturn_t max1118_trigger_handler(int irq, void 
*p)
+       struct iio_poll_func *pf = p;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct max1118 *adc = iio_priv(indio_dev);
+-      u8 data[16] = { }; /* 2x 8-bit ADC data + padding + 8 bytes timestamp */
+       int scan_index;
+       int i = 0;
+ 
+@@ -181,10 +185,10 @@ static irqreturn_t max1118_trigger_handler(int irq, void 
*p)
+                       goto out;
+               }
+ 
+-              data[i] = ret;
++              adc->scan.channels[i] = ret;
+               i++;
+       }
+-      iio_push_to_buffers_with_timestamp(indio_dev, data,
++      iio_push_to_buffers_with_timestamp(indio_dev, &adc->scan,
+                                          iio_get_time_ns(indio_dev));
+ out:
+       mutex_unlock(&adc->lock);
+diff --git a/drivers/iio/adc/mcp3422.c b/drivers/iio/adc/mcp3422.c
+index 63de705086ed4..9ac2becde8f29 100644
+--- a/drivers/iio/adc/mcp3422.c
++++ b/drivers/iio/adc/mcp3422.c
+@@ -99,16 +99,12 @@ static int mcp3422_update_config(struct mcp3422 *adc, u8 
newconfig)
+ {
+       int ret;
+ 
+-      mutex_lock(&adc->lock);
+-
+       ret = i2c_master_send(adc->i2c, &newconfig, 1);
+       if (ret > 0) {
+               adc->config = newconfig;
+               ret = 0;
+       }
+ 
+-      mutex_unlock(&adc->lock);
+-
+       return ret;
+ }
+ 
+@@ -141,6 +137,8 @@ static int mcp3422_read_channel(struct mcp3422 *adc,
+       u8 config;
+       u8 req_channel = channel->channel;
+ 
++      mutex_lock(&adc->lock);
++
+       if (req_channel != MCP3422_CHANNEL(adc->config)) {
+               config = adc->config;
+               config &= ~MCP3422_CHANNEL_MASK;
+@@ -148,12 +146,18 @@ static int mcp3422_read_channel(struct mcp3422 *adc,
+               config &= ~MCP3422_PGA_MASK;
+               config |= MCP3422_PGA_VALUE(adc->pga[req_channel]);
+               ret = mcp3422_update_config(adc, config);
+-              if (ret < 0)
++              if (ret < 0) {
++                      mutex_unlock(&adc->lock);
+                       return ret;
++              }
+               msleep(mcp3422_read_times[MCP3422_SAMPLE_RATE(adc->config)]);
+       }
+ 
+-      return mcp3422_read(adc, value, &config);
++      ret = mcp3422_read(adc, value, &config);
++
++      mutex_unlock(&adc->lock);
++
++      return ret;
+ }
+ 
+ static int mcp3422_read_raw(struct iio_dev *iio,
+diff --git a/drivers/iio/adc/ti-adc081c.c b/drivers/iio/adc/ti-adc081c.c
+index 319172cf7da80..d9bfe79c17475 100644
+--- a/drivers/iio/adc/ti-adc081c.c
++++ b/drivers/iio/adc/ti-adc081c.c
+@@ -36,6 +36,12 @@ struct adc081c {
+ 
+       /* 8, 10 or 12 */
+       int bits;
++
++      /* Ensure natural alignment of buffer elements */
++      struct {
++              u16 channel;
++              s64 ts __aligned(8);
++      } scan;
+ };
+ 
+ #define REG_CONV_RES 0x00
+@@ -132,14 +138,13 @@ static irqreturn_t adc081c_trigger_handler(int irq, void 
*p)
+       struct iio_poll_func *pf = p;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct adc081c *data = iio_priv(indio_dev);
+-      u16 buf[8]; /* 2 bytes data + 6 bytes padding + 8 bytes timestamp */
+       int ret;
+ 
+       ret = i2c_smbus_read_word_swapped(data->i2c, REG_CONV_RES);
+       if (ret < 0)
+               goto out;
+-      buf[0] = ret;
+-      iio_push_to_buffers_with_timestamp(indio_dev, buf,
++      data->scan.channel = ret;
++      iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
+                                          iio_get_time_ns(indio_dev));
+ out:
+       iio_trigger_notify_done(indio_dev->trig);
+diff --git a/drivers/iio/adc/ti-adc084s021.c b/drivers/iio/adc/ti-adc084s021.c
+index a355121c11a42..f3ad1d024c758 100644
+--- a/drivers/iio/adc/ti-adc084s021.c
++++ b/drivers/iio/adc/ti-adc084s021.c
+@@ -28,6 +28,11 @@ struct adc084s021 {
+       struct spi_transfer spi_trans;
+       struct regulator *reg;
+       struct mutex lock;
++      /* Buffer used to align data */
++      struct {
++              __be16 channels[4];
++              s64 ts __aligned(8);
++      } scan;
+       /*
+        * DMA (thus cache coherency maintenance) requires the
+        * transfer buffers to live in their own cache line.
+@@ -143,14 +148,13 @@ static irqreturn_t adc084s021_buffer_trigger_handler(int 
irq, void *pollfunc)
+       struct iio_poll_func *pf = pollfunc;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct adc084s021 *adc = iio_priv(indio_dev);
+-      __be16 data[8] = {0}; /* 4 * 16-bit words of data + 8 bytes timestamp */
+ 
+       mutex_lock(&adc->lock);
+ 
+-      if (adc084s021_adc_conversion(adc, &data) < 0)
++      if (adc084s021_adc_conversion(adc, adc->scan.channels) < 0)
+               dev_err(&adc->spi->dev, "Failed to read data\n");
+ 
+-      iio_push_to_buffers_with_timestamp(indio_dev, data,
++      iio_push_to_buffers_with_timestamp(indio_dev, &adc->scan,
+                                          iio_get_time_ns(indio_dev));
+       mutex_unlock(&adc->lock);
+       iio_trigger_notify_done(indio_dev->trig);
+diff --git a/drivers/iio/adc/ti-ads1015.c b/drivers/iio/adc/ti-ads1015.c
+index 9ac2fb032df6b..df71c61053532 100644
+--- a/drivers/iio/adc/ti-ads1015.c
++++ b/drivers/iio/adc/ti-ads1015.c
+@@ -312,6 +312,7 @@ static const struct iio_chan_spec ads1115_channels[] = {
+       IIO_CHAN_SOFT_TIMESTAMP(ADS1015_TIMESTAMP),
+ };
+ 
++#ifdef CONFIG_PM
+ static int ads1015_set_power_state(struct ads1015_data *data, bool on)
+ {
+       int ret;
+@@ -329,6 +330,15 @@ static int ads1015_set_power_state(struct ads1015_data 
*data, bool on)
+       return ret < 0 ? ret : 0;
+ }
+ 
++#else /* !CONFIG_PM */
++
++static int ads1015_set_power_state(struct ads1015_data *data, bool on)
++{
++      return 0;
++}
++
++#endif /* !CONFIG_PM */
++
+ static
+ int ads1015_get_adc_result(struct ads1015_data *data, int chan, int *val)
+ {
+diff --git a/drivers/iio/chemical/ccs811.c b/drivers/iio/chemical/ccs811.c
+index 9dd0e1cd93dda..9f80cc18ef7fe 100644
+--- a/drivers/iio/chemical/ccs811.c
++++ b/drivers/iio/chemical/ccs811.c
+@@ -73,6 +73,11 @@ struct ccs811_data {
+       struct i2c_client *client;
+       struct mutex lock; /* Protect readings */
+       struct ccs811_reading buffer;
++      /* Ensures correct alignment of timestamp if present */
++      struct {
++              s16 channels[2];
++              s64 ts __aligned(8);
++      } scan;
+ };
+ 
+ static const struct iio_chan_spec ccs811_channels[] = {
+@@ -275,17 +280,17 @@ static irqreturn_t ccs811_trigger_handler(int irq, void 
*p)
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct ccs811_data *data = iio_priv(indio_dev);
+       struct i2c_client *client = data->client;
+-      s16 buf[8]; /* s16 eCO2 + s16 TVOC + padding + 8 byte timestamp */
+       int ret;
+ 
+-      ret = i2c_smbus_read_i2c_block_data(client, CCS811_ALG_RESULT_DATA, 4,
+-                                          (u8 *)&buf);
++      ret = i2c_smbus_read_i2c_block_data(client, CCS811_ALG_RESULT_DATA,
++                                          sizeof(data->scan.channels),
++                                          (u8 *)data->scan.channels);
+       if (ret != 4) {
+               dev_err(&client->dev, "cannot read sensor data\n");
+               goto err;
+       }
+ 
+-      iio_push_to_buffers_with_timestamp(indio_dev, buf,
++      iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
+                                          iio_get_time_ns(indio_dev));
+ 
+ err:
+diff --git a/drivers/iio/light/ltr501.c b/drivers/iio/light/ltr501.c
+index 67838edd8b37f..7a93580496591 100644
+--- a/drivers/iio/light/ltr501.c
++++ b/drivers/iio/light/ltr501.c
+@@ -1249,13 +1249,16 @@ static irqreturn_t ltr501_trigger_handler(int irq, 
void *p)
+       struct iio_poll_func *pf = p;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct ltr501_data *data = iio_priv(indio_dev);
+-      u16 buf[8];
++      struct {
++              u16 channels[3];
++              s64 ts __aligned(8);
++      } scan;
+       __le16 als_buf[2];
+       u8 mask = 0;
+       int j = 0;
+       int ret, psdata;
+ 
+-      memset(buf, 0, sizeof(buf));
++      memset(&scan, 0, sizeof(scan));
+ 
+       /* figure out which data needs to be ready */
+       if (test_bit(0, indio_dev->active_scan_mask) ||
+@@ -1274,9 +1277,9 @@ static irqreturn_t ltr501_trigger_handler(int irq, void 
*p)
+               if (ret < 0)
+                       return ret;
+               if (test_bit(0, indio_dev->active_scan_mask))
+-                      buf[j++] = le16_to_cpu(als_buf[1]);
++                      scan.channels[j++] = le16_to_cpu(als_buf[1]);
+               if (test_bit(1, indio_dev->active_scan_mask))
+-                      buf[j++] = le16_to_cpu(als_buf[0]);
++                      scan.channels[j++] = le16_to_cpu(als_buf[0]);
+       }
+ 
+       if (mask & LTR501_STATUS_PS_RDY) {
+@@ -1284,10 +1287,10 @@ static irqreturn_t ltr501_trigger_handler(int irq, 
void *p)
+                                      &psdata, 2);
+               if (ret < 0)
+                       goto done;
+-              buf[j++] = psdata & LTR501_PS_DATA_MASK;
++              scan.channels[j++] = psdata & LTR501_PS_DATA_MASK;
+       }
+ 
+-      iio_push_to_buffers_with_timestamp(indio_dev, buf,
++      iio_push_to_buffers_with_timestamp(indio_dev, &scan,
+                                          iio_get_time_ns(indio_dev));
+ 
+ done:
+diff --git a/drivers/iio/light/max44000.c b/drivers/iio/light/max44000.c
+index 81bd8e8da4a69..255b932fc21df 100644
+--- a/drivers/iio/light/max44000.c
++++ b/drivers/iio/light/max44000.c
+@@ -78,6 +78,11 @@
+ struct max44000_data {
+       struct mutex lock;
+       struct regmap *regmap;
++      /* Ensure naturally aligned timestamp */
++      struct {
++              u16 channels[2];
++              s64 ts __aligned(8);
++      } scan;
+ };
+ 
+ /* Default scale is set to the minimum of 0.03125 or 1 / (1 << 5) lux */
+@@ -492,7 +497,6 @@ static irqreturn_t max44000_trigger_handler(int irq, void 
*p)
+       struct iio_poll_func *pf = p;
+       struct iio_dev *indio_dev = pf->indio_dev;
+       struct max44000_data *data = iio_priv(indio_dev);
+-      u16 buf[8]; /* 2x u16 + padding + 8 bytes timestamp */
+       int index = 0;
+       unsigned int regval;
+       int ret;
+@@ -502,17 +506,17 @@ static irqreturn_t max44000_trigger_handler(int irq, 
void *p)
+               ret = max44000_read_alsval(data);
+               if (ret < 0)
+                       goto out_unlock;
+-              buf[index++] = ret;
++              data->scan.channels[index++] = ret;
+       }
+       if (test_bit(MAX44000_SCAN_INDEX_PRX, indio_dev->active_scan_mask)) {
+               ret = regmap_read(data->regmap, MAX44000_REG_PRX_DATA, &regval);
+               if (ret < 0)
+                       goto out_unlock;
+-              buf[index] = regval;
++              data->scan.channels[index] = regval;
+       }
+       mutex_unlock(&data->lock);
+ 
+-      iio_push_to_buffers_with_timestamp(indio_dev, buf,
++      iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
+                                          iio_get_time_ns(indio_dev));
+       iio_trigger_notify_done(indio_dev->trig);
+       return IRQ_HANDLED;
+diff --git a/drivers/iio/magnetometer/ak8975.c 
b/drivers/iio/magnetometer/ak8975.c
+index 4ff883942f7b7..b08bd99295699 100644
+--- a/drivers/iio/magnetometer/ak8975.c
++++ b/drivers/iio/magnetometer/ak8975.c
+@@ -381,6 +381,12 @@ struct ak8975_data {
+       struct iio_mount_matrix orientation;
+       struct regulator        *vdd;
+       struct regulator        *vid;
++
++      /* Ensure natural alignment of timestamp */
++      struct {
++              s16 channels[3];
++              s64 ts __aligned(8);
++      } scan;
+ };
+ 
+ /* Enable attached power regulator if any. */
+@@ -815,7 +821,6 @@ static void ak8975_fill_buffer(struct iio_dev *indio_dev)
+       const struct i2c_client *client = data->client;
+       const struct ak_def *def = data->def;
+       int ret;
+-      s16 buff[8]; /* 3 x 16 bits axis values + 1 aligned 64 bits timestamp */
+       __le16 fval[3];
+ 
+       mutex_lock(&data->lock);
+@@ -838,12 +843,13 @@ static void ak8975_fill_buffer(struct iio_dev *indio_dev)
+       mutex_unlock(&data->lock);
+ 
+       /* Clamp to valid range. */
+-      buff[0] = clamp_t(s16, le16_to_cpu(fval[0]), -def->range, def->range);
+-      buff[1] = clamp_t(s16, le16_to_cpu(fval[1]), -def->range, def->range);
+-      buff[2] = clamp_t(s16, le16_to_cpu(fval[2]), -def->range, def->range);
++      data->scan.channels[0] = clamp_t(s16, le16_to_cpu(fval[0]), 
-def->range, def->range);
++      data->scan.channels[1] = clamp_t(s16, le16_to_cpu(fval[1]), 
-def->range, def->range);
++      data->scan.channels[2] = clamp_t(s16, le16_to_cpu(fval[2]), 
-def->range, def->range);
+ 
+-      iio_push_to_buffers_with_timestamp(indio_dev, buff,
++      iio_push_to_buffers_with_timestamp(indio_dev, &data->scan,
+                                          iio_get_time_ns(indio_dev));
++
+       return;
+ 
+ unlock:
+diff --git a/drivers/infiniband/core/verbs.c b/drivers/infiniband/core/verbs.c
+index d21c86dd27d86..01f02b3cb835e 100644
+--- a/drivers/infiniband/core/verbs.c
++++ b/drivers/infiniband/core/verbs.c
+@@ -1343,7 +1343,7 @@ int ib_get_eth_speed(struct ib_device *dev, u8 port_num, 
u8 *speed, u8 *width)
+ 
+       dev_put(netdev);
+ 
+-      if (!rc) {
++      if (!rc && lksettings.base.speed != (u32)SPEED_UNKNOWN) {
+               netdev_speed = lksettings.base.speed;
+       } else {
+               netdev_speed = SPEED_1000;
+diff --git a/drivers/infiniband/sw/rxe/rxe.c b/drivers/infiniband/sw/rxe/rxe.c
+index 8c3d30b3092d4..25267a620e0b5 100644
+--- a/drivers/infiniband/sw/rxe/rxe.c
++++ b/drivers/infiniband/sw/rxe/rxe.c
+@@ -170,9 +170,6 @@ static int rxe_init_ports(struct rxe_dev *rxe)
+ 
+       rxe_init_port_param(port);
+ 
+-      if (!port->attr.pkey_tbl_len || !port->attr.gid_tbl_len)
+-              return -EINVAL;
+-
+       port->pkey_tbl = kcalloc(port->attr.pkey_tbl_len,
+                       sizeof(*port->pkey_tbl), GFP_KERNEL);
+ 
+diff --git a/drivers/infiniband/sw/rxe/rxe_mr.c 
b/drivers/infiniband/sw/rxe/rxe_mr.c
+index 5c2684bf430f8..a0d2a2350c7e5 100644
+--- a/drivers/infiniband/sw/rxe/rxe_mr.c
++++ b/drivers/infiniband/sw/rxe/rxe_mr.c
+@@ -203,6 +203,7 @@ int rxe_mem_init_user(struct rxe_dev *rxe, struct rxe_pd 
*pd, u64 start,
+                       vaddr = page_address(sg_page(sg));
+                       if (!vaddr) {
+                               pr_warn("null vaddr\n");
++                              ib_umem_release(umem);
+                               err = -ENOMEM;
+                               goto err1;
+                       }
+diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.c 
b/drivers/infiniband/sw/rxe/rxe_verbs.c
+index 1cbf4e407afaf..bbd4378e7a96e 100644
+--- a/drivers/infiniband/sw/rxe/rxe_verbs.c
++++ b/drivers/infiniband/sw/rxe/rxe_verbs.c
+@@ -1178,7 +1178,7 @@ static ssize_t parent_show(struct device *device,
+       struct rxe_dev *rxe = container_of(device, struct rxe_dev,
+                                          ib_dev.dev);
+ 
+-      return snprintf(buf, 16, "%s\n", rxe_parent_name(rxe, 1));
++      return scnprintf(buf, PAGE_SIZE, "%s\n", rxe_parent_name(rxe, 1));
+ }
+ 
+ static DEVICE_ATTR_RO(parent);
+diff --git a/drivers/input/mouse/trackpoint.c 
b/drivers/input/mouse/trackpoint.c
+index bbd29220dbe99..d68aba9c5dd62 100644
+--- a/drivers/input/mouse/trackpoint.c
++++ b/drivers/input/mouse/trackpoint.c
+@@ -20,10 +20,12 @@
+ #include "trackpoint.h"
+ 
+ static const char * const trackpoint_variants[] = {
+-      [TP_VARIANT_IBM]        = "IBM",
+-      [TP_VARIANT_ALPS]       = "ALPS",
+-      [TP_VARIANT_ELAN]       = "Elan",
+-      [TP_VARIANT_NXP]        = "NXP",
++      [TP_VARIANT_IBM]                = "IBM",
++      [TP_VARIANT_ALPS]               = "ALPS",
++      [TP_VARIANT_ELAN]               = "Elan",
++      [TP_VARIANT_NXP]                = "NXP",
++      [TP_VARIANT_JYT_SYNAPTICS]      = "JYT_Synaptics",
++      [TP_VARIANT_SYNAPTICS]          = "Synaptics",
+ };
+ 
+ /*
+diff --git a/drivers/input/mouse/trackpoint.h 
b/drivers/input/mouse/trackpoint.h
+index 538986e5ac5bc..4ebcdf802e9a2 100644
+--- a/drivers/input/mouse/trackpoint.h
++++ b/drivers/input/mouse/trackpoint.h
+@@ -27,10 +27,12 @@
+  * 0x01 was the original IBM trackpoint, others implement very limited
+  * subset of trackpoint features.
+  */
+-#define TP_VARIANT_IBM                0x01
+-#define TP_VARIANT_ALPS               0x02
+-#define TP_VARIANT_ELAN               0x03
+-#define TP_VARIANT_NXP                0x04
++#define TP_VARIANT_IBM                        0x01
++#define TP_VARIANT_ALPS                       0x02
++#define TP_VARIANT_ELAN                       0x03
++#define TP_VARIANT_NXP                        0x04
++#define TP_VARIANT_JYT_SYNAPTICS      0x05
++#define TP_VARIANT_SYNAPTICS          0x06
+ 
+ /*
+  * Commands
+diff --git a/drivers/input/serio/i8042-x86ia64io.h 
b/drivers/input/serio/i8042-x86ia64io.h
+index 8134c7f928165..7c05e09abacf9 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -552,6 +552,14 @@ static const struct dmi_system_id __initconst 
i8042_dmi_nomux_table[] = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 5738"),
+               },
+       },
++      {
++              /* Entroware Proteus */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Entroware"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"),
++              },
++      },
+       { }
+ };
+ 
+@@ -680,6 +688,14 @@ static const struct dmi_system_id __initconst 
i8042_dmi_reset_table[] = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "33474HU"),
+               },
+       },
++      {
++              /* Entroware Proteus */
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Entroware"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Proteus"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "EL07R4"),
++              },
++      },
+       { }
+ };
+ 
+diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c
+index 75cf66ffc705d..ff3f9a01e443c 100644
+--- a/drivers/mmc/host/sdhci-msm.c
++++ b/drivers/mmc/host/sdhci-msm.c
+@@ -837,7 +837,7 @@ static void sdhci_msm_set_cdr(struct sdhci_host *host, 
bool enable)
+ static int sdhci_msm_execute_tuning(struct mmc_host *mmc, u32 opcode)
+ {
+       struct sdhci_host *host = mmc_priv(mmc);
+-      int tuning_seq_cnt = 3;
++      int tuning_seq_cnt = 10;
+       u8 phase, tuned_phases[16], tuned_phase_cnt = 0;
+       int rc;
+       struct mmc_ios ios = host->mmc->ios;
+@@ -901,6 +901,22 @@ retry:
+       } while (++phase < ARRAY_SIZE(tuned_phases));
+ 
+       if (tuned_phase_cnt) {
++              if (tuned_phase_cnt == ARRAY_SIZE(tuned_phases)) {
++                      /*
++                       * All phases valid is _almost_ as bad as no phases
++                       * valid.  Probably all phases are not really reliable
++                       * but we didn't detect where the unreliable place is.
++                       * That means we'll essentially be guessing and hoping
++                       * we get a good phase.  Better to try a few times.
++                       */
++                      dev_dbg(mmc_dev(mmc), "%s: All phases valid; try 
again\n",
++                              mmc_hostname(mmc));
++                      if (--tuning_seq_cnt) {
++                              tuned_phase_cnt = 0;
++                              goto retry;
++                      }
++              }
++
+               rc = msm_find_most_appropriate_phase(host, tuned_phases,
+                                                    tuned_phase_cnt);
+               if (rc < 0)
+diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
+index dbc6c9ed1c8f8..17a7ef679bab5 100644
+--- a/drivers/net/hyperv/netvsc_drv.c
++++ b/drivers/net/hyperv/netvsc_drv.c
+@@ -365,7 +365,7 @@ static u16 netvsc_select_queue(struct net_device *ndev, 
struct sk_buff *skb,
+       }
+       rcu_read_unlock();
+ 
+-      while (unlikely(txq >= ndev->real_num_tx_queues))
++      while (txq >= ndev->real_num_tx_queues)
+               txq -= ndev->real_num_tx_queues;
+ 
+       return txq;
+diff --git a/drivers/net/wan/hdlc_cisco.c b/drivers/net/wan/hdlc_cisco.c
+index a408abc25512a..7f99fb666f196 100644
+--- a/drivers/net/wan/hdlc_cisco.c
++++ b/drivers/net/wan/hdlc_cisco.c
+@@ -377,6 +377,7 @@ static int cisco_ioctl(struct net_device *dev, struct 
ifreq *ifr)
+               memcpy(&state(hdlc)->settings, &new_settings, size);
+               spin_lock_init(&state(hdlc)->lock);
+               dev->header_ops = &cisco_header_ops;
++              dev->hard_header_len = sizeof(struct hdlc_header);
+               dev->type = ARPHRD_CISCO;
+               call_netdevice_notifiers(NETDEV_POST_TYPE_CHANGE, dev);
+               netif_dormant_on(dev);
+diff --git a/drivers/net/wan/lapbether.c b/drivers/net/wan/lapbether.c
+index c94dfa70f2a33..15177a54b17d7 100644
+--- a/drivers/net/wan/lapbether.c
++++ b/drivers/net/wan/lapbether.c
+@@ -213,6 +213,8 @@ static void lapbeth_data_transmit(struct net_device *ndev, 
struct sk_buff *skb)
+ 
+       skb->dev = dev = lapbeth->ethdev;
+ 
++      skb_reset_network_header(skb);
++
+       dev_hard_header(skb, dev, ETH_P_DEC, bcast_addr, NULL, 0);
+ 
+       dev_queue_xmit(skb);
+@@ -343,6 +345,7 @@ static int lapbeth_new_device(struct net_device *dev)
+        */
+       ndev->needed_headroom = -1 + 3 + 2 + dev->hard_header_len
+                                          + dev->needed_headroom;
++      ndev->needed_tailroom = dev->needed_tailroom;
+ 
+       lapbeth = netdev_priv(ndev);
+       lapbeth->axdev = ndev;
+diff --git a/drivers/nfc/st95hf/core.c b/drivers/nfc/st95hf/core.c
+index 01acb6e533655..c4b6e29c07192 100644
+--- a/drivers/nfc/st95hf/core.c
++++ b/drivers/nfc/st95hf/core.c
+@@ -981,7 +981,7 @@ static int st95hf_in_send_cmd(struct nfc_digital_dev *ddev,
+       rc = down_killable(&stcontext->exchange_lock);
+       if (rc) {
+               WARN(1, "Semaphore is not found up in st95hf_in_send_cmd\n");
+-              return rc;
++              goto free_skb_resp;
+       }
+ 
+       rc = st95hf_spi_send(&stcontext->spicontext, skb->data,
+diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
+index 13c89cc9d10cf..e95d2f75713e1 100644
+--- a/drivers/nvme/host/fc.c
++++ b/drivers/nvme/host/fc.c
+@@ -1566,6 +1566,7 @@ nvme_fc_term_aen_ops(struct nvme_fc_ctrl *ctrl)
+       struct nvme_fc_fcp_op *aen_op;
+       int i;
+ 
++      cancel_work_sync(&ctrl->ctrl.async_event_work);
+       aen_op = ctrl->aen_ops;
+       for (i = 0; i < NVME_FC_NR_AEN_COMMANDS; i++, aen_op++) {
+               if (!aen_op->fcp_req.private)
+diff --git a/drivers/rapidio/Kconfig b/drivers/rapidio/Kconfig
+index d6d2f20c45977..21df2816def76 100644
+--- a/drivers/rapidio/Kconfig
++++ b/drivers/rapidio/Kconfig
+@@ -25,7 +25,7 @@ config RAPIDIO_ENABLE_RX_TX_PORTS
+ config RAPIDIO_DMA_ENGINE
+       bool "DMA Engine support for RapidIO"
+       depends on RAPIDIO
+-      select DMADEVICES
++      depends on DMADEVICES
+       select DMA_ENGINE
+       help
+         Say Y here if you want to use DMA Engine frameork for RapidIO data
+diff --git a/drivers/regulator/core.c b/drivers/regulator/core.c
+index b2cb4f497ef67..bd6991a99593d 100644
+--- a/drivers/regulator/core.c
++++ b/drivers/regulator/core.c
+@@ -1192,7 +1192,7 @@ static int set_consumer_device_supply(struct 
regulator_dev *rdev,
+                                     const char *consumer_dev_name,
+                                     const char *supply)
+ {
+-      struct regulator_map *node;
++      struct regulator_map *node, *new_node;
+       int has_dev;
+ 
+       if (supply == NULL)
+@@ -1203,6 +1203,22 @@ static int set_consumer_device_supply(struct 
regulator_dev *rdev,
+       else
+               has_dev = 0;
+ 
++      new_node = kzalloc(sizeof(struct regulator_map), GFP_KERNEL);
++      if (new_node == NULL)
++              return -ENOMEM;
++
++      new_node->regulator = rdev;
++      new_node->supply = supply;
++
++      if (has_dev) {
++              new_node->dev_name = kstrdup(consumer_dev_name, GFP_KERNEL);
++              if (new_node->dev_name == NULL) {
++                      kfree(new_node);
++                      return -ENOMEM;
++              }
++      }
++
++      mutex_lock(&regulator_list_mutex);
+       list_for_each_entry(node, &regulator_map_list, list) {
+               if (node->dev_name && consumer_dev_name) {
+                       if (strcmp(node->dev_name, consumer_dev_name) != 0)
+@@ -1220,26 +1236,19 @@ static int set_consumer_device_supply(struct 
regulator_dev *rdev,
+                        node->regulator->desc->name,
+                        supply,
+                        dev_name(&rdev->dev), rdev_get_name(rdev));
+-              return -EBUSY;
++              goto fail;
+       }
+ 
+-      node = kzalloc(sizeof(struct regulator_map), GFP_KERNEL);
+-      if (node == NULL)
+-              return -ENOMEM;
+-
+-      node->regulator = rdev;
+-      node->supply = supply;
+-
+-      if (has_dev) {
+-              node->dev_name = kstrdup(consumer_dev_name, GFP_KERNEL);
+-              if (node->dev_name == NULL) {
+-                      kfree(node);
+-                      return -ENOMEM;
+-              }
+-      }
++      list_add(&new_node->list, &regulator_map_list);
++      mutex_unlock(&regulator_list_mutex);
+ 
+-      list_add(&node->list, &regulator_map_list);
+       return 0;
++
++fail:
++      mutex_unlock(&regulator_list_mutex);
++      kfree(new_node->dev_name);
++      kfree(new_node);
++      return -EBUSY;
+ }
+ 
+ static void unset_regulator_supplies(struct regulator_dev *rdev)
+@@ -4095,19 +4104,16 @@ regulator_register(const struct regulator_desc 
*regulator_desc,
+ 
+       /* add consumers devices */
+       if (init_data) {
+-              mutex_lock(&regulator_list_mutex);
+               for (i = 0; i < init_data->num_consumer_supplies; i++) {
+                       ret = set_consumer_device_supply(rdev,
+                               init_data->consumer_supplies[i].dev_name,
+                               init_data->consumer_supplies[i].supply);
+                       if (ret < 0) {
+-                              mutex_unlock(&regulator_list_mutex);
+                               dev_err(dev, "Failed to set supply %s\n",
+                                       init_data->consumer_supplies[i].supply);
+                               goto unset_supplies;
+                       }
+               }
+-              mutex_unlock(&regulator_list_mutex);
+       }
+ 
+       if (!rdev->desc->ops->get_voltage &&
+diff --git a/drivers/scsi/libfc/fc_disc.c b/drivers/scsi/libfc/fc_disc.c
+index 62f83cc151b22..0db0d0ad9f966 100644
+--- a/drivers/scsi/libfc/fc_disc.c
++++ b/drivers/scsi/libfc/fc_disc.c
+@@ -658,8 +658,6 @@ free_fp:
+       fc_frame_free(fp);
+ out:
+       kref_put(&rdata->kref, fc_rport_destroy);
+-      if (!IS_ERR(fp))
+-              fc_frame_free(fp);
+ }
+ 
+ /**
+diff --git a/drivers/scsi/libsas/sas_ata.c b/drivers/scsi/libsas/sas_ata.c
+index 70be4425ae0be..470e11b428208 100644
+--- a/drivers/scsi/libsas/sas_ata.c
++++ b/drivers/scsi/libsas/sas_ata.c
+@@ -227,7 +227,10 @@ static unsigned int sas_ata_qc_issue(struct 
ata_queued_cmd *qc)
+               task->num_scatter = si;
+       }
+ 
+-      task->data_dir = qc->dma_dir;
++      if (qc->tf.protocol == ATA_PROT_NODATA)
++              task->data_dir = DMA_NONE;
++      else
++              task->data_dir = qc->dma_dir;
+       task->scatter = qc->sg;
+       task->ata_task.retry_count = 1;
+       task->task_state_flags = SAS_TASK_STATE_PENDING;
+diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
+index db1111f7e85ae..566e8d07cb058 100644
+--- a/drivers/scsi/lpfc/lpfc_els.c
++++ b/drivers/scsi/lpfc/lpfc_els.c
+@@ -4104,7 +4104,9 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct 
lpfc_iocbq *cmdiocb,
+ out:
+       if (ndlp && NLP_CHK_NODE_ACT(ndlp) && shost) {
+               spin_lock_irq(shost->host_lock);
+-              ndlp->nlp_flag &= ~(NLP_ACC_REGLOGIN | NLP_RM_DFLT_RPI);
++              if (mbox)
++                      ndlp->nlp_flag &= ~NLP_ACC_REGLOGIN;
++              ndlp->nlp_flag &= ~NLP_RM_DFLT_RPI;
+               spin_unlock_irq(shost->host_lock);
+ 
+               /* If the node is not being used by another discovery thread,
+diff --git a/drivers/scsi/pm8001/pm8001_sas.c 
b/drivers/scsi/pm8001/pm8001_sas.c
+index e64a13f0bce17..61a2da30f94b7 100644
+--- a/drivers/scsi/pm8001/pm8001_sas.c
++++ b/drivers/scsi/pm8001/pm8001_sas.c
+@@ -795,7 +795,7 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info 
*pm8001_ha,
+ 
+               res = pm8001_tag_alloc(pm8001_ha, &ccb_tag);
+               if (res)
+-                      return res;
++                      goto ex_err;
+               ccb = &pm8001_ha->ccb_info[ccb_tag];
+               ccb->device = pm8001_dev;
+               ccb->ccb_tag = ccb_tag;
+diff --git a/drivers/spi/spi-loopback-test.c b/drivers/spi/spi-loopback-test.c
+index bed7403bb6b3a..b9a7117b6dce3 100644
+--- a/drivers/spi/spi-loopback-test.c
++++ b/drivers/spi/spi-loopback-test.c
+@@ -99,7 +99,7 @@ static struct spi_test spi_tests[] = {
+       {
+               .description    = "tx/rx-transfer - crossing PAGE_SIZE",
+               .fill_option    = FILL_COUNT_8,
+-              .iterate_len    = { ITERATE_MAX_LEN },
++              .iterate_len    = { ITERATE_LEN },
+               .iterate_tx_align = ITERATE_ALIGN,
+               .iterate_rx_align = ITERATE_ALIGN,
+               .transfer_count = 1,
+diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
+index ab6a4f85bcde7..acc8eeed73f07 100644
+--- a/drivers/spi/spi.c
++++ b/drivers/spi/spi.c
+@@ -1125,8 +1125,6 @@ out:
+       if (msg->status && ctlr->handle_err)
+               ctlr->handle_err(ctlr, msg);
+ 
+-      spi_res_release(ctlr, msg);
+-
+       spi_finalize_current_message(ctlr);
+ 
+       return ret;
+@@ -1384,6 +1382,13 @@ void spi_finalize_current_message(struct spi_controller 
*ctlr)
+ 
+       spi_unmap_msg(ctlr, mesg);
+ 
++      /* In the prepare_messages callback the spi bus has the opportunity to
++       * split a transfer to smaller chunks.
++       * Release splited transfers here since spi_map_msg is done on the
++       * splited transfers.
++       */
++      spi_res_release(ctlr, mesg);
++
+       if (ctlr->cur_msg_prepared && ctlr->unprepare_message) {
+               ret = ctlr->unprepare_message(ctlr, mesg);
+               if (ret) {
+diff --git a/drivers/staging/greybus/audio_topology.c 
b/drivers/staging/greybus/audio_topology.c
+index 07fac3948f3a6..dcb4e6c69f167 100644
+--- a/drivers/staging/greybus/audio_topology.c
++++ b/drivers/staging/greybus/audio_topology.c
+@@ -461,6 +461,15 @@ static int gbcodec_mixer_dapm_ctl_put(struct snd_kcontrol 
*kcontrol,
+       val = ucontrol->value.integer.value[0] & mask;
+       connect = !!val;
+ 
++      ret = gb_pm_runtime_get_sync(bundle);
++      if (ret)
++              return ret;
++
++      ret = gb_audio_gb_get_control(module->mgmt_connection, data->ctl_id,
++                                    GB_AUDIO_INVALID_INDEX, &gbvalue);
++      if (ret)
++              goto exit;
++
+       /* update ucontrol */
+       if (gbvalue.value.integer_value[0] != val) {
+               for (wi = 0; wi < wlist->num_widgets; wi++) {
+@@ -474,25 +483,17 @@ static int gbcodec_mixer_dapm_ctl_put(struct 
snd_kcontrol *kcontrol,
+               gbvalue.value.integer_value[0] =
+                       cpu_to_le32(ucontrol->value.integer.value[0]);
+ 
+-              ret = gb_pm_runtime_get_sync(bundle);
+-              if (ret)
+-                      return ret;
+-
+               ret = gb_audio_gb_set_control(module->mgmt_connection,
+                                             data->ctl_id,
+                                             GB_AUDIO_INVALID_INDEX, &gbvalue);
+-
+-              gb_pm_runtime_put_autosuspend(bundle);
+-
+-              if (ret) {
+-                      dev_err_ratelimited(codec->dev,
+-                                          "%d:Error in %s for %s\n", ret,
+-                                          __func__, kcontrol->id.name);
+-                      return ret;
+-              }
+       }
+ 
+-      return 0;
++exit:
++      gb_pm_runtime_put_autosuspend(bundle);
++      if (ret)
++              dev_err_ratelimited(codec_dev, "%d:Error in %s for %s\n", ret,
++                                  __func__, kcontrol->id.name);
++      return ret;
+ }
+ 
+ #define SOC_DAPM_MIXER_GB(xname, kcount, data) \
+diff --git a/drivers/staging/wlan-ng/hfa384x_usb.c 
b/drivers/staging/wlan-ng/hfa384x_usb.c
+index fb1a76c4c9271..292ebbce50dc8 100644
+--- a/drivers/staging/wlan-ng/hfa384x_usb.c
++++ b/drivers/staging/wlan-ng/hfa384x_usb.c
+@@ -531,13 +531,8 @@ static void hfa384x_usb_defer(struct work_struct *data)
+  */
+ void hfa384x_create(struct hfa384x *hw, struct usb_device *usb)
+ {
+-      memset(hw, 0, sizeof(*hw));
+       hw->usb = usb;
+ 
+-      /* set up the endpoints */
+-      hw->endp_in = usb_rcvbulkpipe(usb, 1);
+-      hw->endp_out = usb_sndbulkpipe(usb, 2);
+-
+       /* Set up the waitq */
+       init_waitqueue_head(&hw->cmdq);
+ 
+diff --git a/drivers/staging/wlan-ng/prism2usb.c 
b/drivers/staging/wlan-ng/prism2usb.c
+index 8d32b1603d10a..9eee72aff7233 100644
+--- a/drivers/staging/wlan-ng/prism2usb.c
++++ b/drivers/staging/wlan-ng/prism2usb.c
+@@ -61,23 +61,14 @@ static int prism2sta_probe_usb(struct usb_interface 
*interface,
+                              const struct usb_device_id *id)
+ {
+       struct usb_device *dev;
+-      const struct usb_endpoint_descriptor *epd;
+-      const struct usb_host_interface *iface_desc = interface->cur_altsetting;
++      struct usb_endpoint_descriptor *bulk_in, *bulk_out;
++      struct usb_host_interface *iface_desc = interface->cur_altsetting;
+       struct wlandevice *wlandev = NULL;
+       struct hfa384x *hw = NULL;
+       int result = 0;
+ 
+-      if (iface_desc->desc.bNumEndpoints != 2) {
+-              result = -ENODEV;
+-              goto failed;
+-      }
+-
+-      result = -EINVAL;
+-      epd = &iface_desc->endpoint[1].desc;
+-      if (!usb_endpoint_is_bulk_in(epd))
+-              goto failed;
+-      epd = &iface_desc->endpoint[2].desc;
+-      if (!usb_endpoint_is_bulk_out(epd))
++      result = usb_find_common_endpoints(iface_desc, &bulk_in, &bulk_out, 
NULL, NULL);
++      if (result)
+               goto failed;
+ 
+       dev = interface_to_usbdev(interface);
+@@ -96,6 +87,8 @@ static int prism2sta_probe_usb(struct usb_interface 
*interface,
+       }
+ 
+       /* Initialize the hw data */
++      hw->endp_in = usb_rcvbulkpipe(dev, bulk_in->bEndpointAddress);
++      hw->endp_out = usb_sndbulkpipe(dev, bulk_out->bEndpointAddress);
+       hfa384x_create(hw, dev);
+       hw->wlandev = wlandev;
+ 
+diff --git a/drivers/target/iscsi/iscsi_target.c 
b/drivers/target/iscsi/iscsi_target.c
+index ee49b227dc12b..da80c03de6ea4 100644
+--- a/drivers/target/iscsi/iscsi_target.c
++++ b/drivers/target/iscsi/iscsi_target.c
+@@ -1382,14 +1382,27 @@ static u32 iscsit_do_crypto_hash_sg(
+       sg = cmd->first_data_sg;
+       page_off = cmd->first_data_sg_off;
+ 
++      if (data_length && page_off) {
++              struct scatterlist first_sg;
++              u32 len = min_t(u32, data_length, sg->length - page_off);
++
++              sg_init_table(&first_sg, 1);
++              sg_set_page(&first_sg, sg_page(sg), len, sg->offset + page_off);
++
++              ahash_request_set_crypt(hash, &first_sg, NULL, len);
++              crypto_ahash_update(hash);
++
++              data_length -= len;
++              sg = sg_next(sg);
++      }
++
+       while (data_length) {
+-              u32 cur_len = min_t(u32, data_length, (sg->length - page_off));
++              u32 cur_len = min_t(u32, data_length, sg->length);
+ 
+               ahash_request_set_crypt(hash, sg, NULL, cur_len);
+               crypto_ahash_update(hash);
+ 
+               data_length -= cur_len;
+-              page_off = 0;
+               /* iscsit_map_iovec has already checked for invalid sg pointers 
*/
+               sg = sg_next(sg);
+       }
+diff --git a/drivers/target/iscsi/iscsi_target_login.c 
b/drivers/target/iscsi/iscsi_target_login.c
+index 55df6f99e6691..c36d98e901a98 100644
+--- a/drivers/target/iscsi/iscsi_target_login.c
++++ b/drivers/target/iscsi/iscsi_target_login.c
+@@ -1158,7 +1158,7 @@ iscsit_conn_set_transport(struct iscsi_conn *conn, 
struct iscsit_transport *t)
+ }
+ 
+ void iscsi_target_login_sess_out(struct iscsi_conn *conn,
+-              struct iscsi_np *np, bool zero_tsih, bool new_sess)
++                               bool zero_tsih, bool new_sess)
+ {
+       if (!new_sess)
+               goto old_sess_out;
+@@ -1180,7 +1180,6 @@ void iscsi_target_login_sess_out(struct iscsi_conn *conn,
+       conn->sess = NULL;
+ 
+ old_sess_out:
+-      iscsi_stop_login_thread_timer(np);
+       /*
+        * If login negotiation fails check if the Time2Retain timer
+        * needs to be restarted.
+@@ -1440,8 +1439,9 @@ static int __iscsi_target_login_thread(struct iscsi_np 
*np)
+ new_sess_out:
+       new_sess = true;
+ old_sess_out:
++      iscsi_stop_login_thread_timer(np);
+       tpg_np = conn->tpg_np;
+-      iscsi_target_login_sess_out(conn, np, zero_tsih, new_sess);
++      iscsi_target_login_sess_out(conn, zero_tsih, new_sess);
+       new_sess = false;
+ 
+       if (tpg) {
+diff --git a/drivers/target/iscsi/iscsi_target_login.h 
b/drivers/target/iscsi/iscsi_target_login.h
+index c2495e03625c5..9b08b24d223da 100644
+--- a/drivers/target/iscsi/iscsi_target_login.h
++++ b/drivers/target/iscsi/iscsi_target_login.h
+@@ -22,8 +22,7 @@ extern int iscsit_put_login_tx(struct iscsi_conn *, struct 
iscsi_login *, u32);
+ extern void iscsit_free_conn(struct iscsi_np *, struct iscsi_conn *);
+ extern int iscsit_start_kthreads(struct iscsi_conn *);
+ extern void iscsi_post_login_handler(struct iscsi_np *, struct iscsi_conn *, 
u8);
+-extern void iscsi_target_login_sess_out(struct iscsi_conn *, struct iscsi_np 
*,
+-                              bool, bool);
++extern void iscsi_target_login_sess_out(struct iscsi_conn *, bool, bool);
+ extern int iscsi_target_login_thread(void *);
+ 
+ #endif   /*** ISCSI_TARGET_LOGIN_H ***/
+diff --git a/drivers/target/iscsi/iscsi_target_nego.c 
b/drivers/target/iscsi/iscsi_target_nego.c
+index 87248a2512e59..07335357418c8 100644
+--- a/drivers/target/iscsi/iscsi_target_nego.c
++++ b/drivers/target/iscsi/iscsi_target_nego.c
+@@ -554,12 +554,11 @@ static bool iscsi_target_sk_check_and_clear(struct 
iscsi_conn *conn, unsigned in
+ 
+ static void iscsi_target_login_drop(struct iscsi_conn *conn, struct 
iscsi_login *login)
+ {
+-      struct iscsi_np *np = login->np;
+       bool zero_tsih = login->zero_tsih;
+ 
+       iscsi_remove_failed_auth_entry(conn);
+       iscsi_target_nego_release(conn);
+-      iscsi_target_login_sess_out(conn, np, zero_tsih, true);
++      iscsi_target_login_sess_out(conn, zero_tsih, true);
+ }
+ 
+ static void iscsi_target_login_timeout(unsigned long data)
+diff --git a/drivers/tty/serial/8250/8250_pci.c 
b/drivers/tty/serial/8250/8250_pci.c
+index b31fed7f1679f..071ee37399b7d 100644
+--- a/drivers/tty/serial/8250/8250_pci.c
++++ b/drivers/tty/serial/8250/8250_pci.c
+@@ -5247,6 +5247,17 @@ static const struct pci_device_id serial_pci_tbl[] = {
+               PCI_ANY_ID, PCI_ANY_ID,
+               0, 0, pbn_wch384_4 },
+ 
++      /*
++       * Realtek RealManage
++       */
++      {       PCI_VENDOR_ID_REALTEK, 0x816a,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0, pbn_b0_1_115200 },
++
++      {       PCI_VENDOR_ID_REALTEK, 0x816b,
++              PCI_ANY_ID, PCI_ANY_ID,
++              0, 0, pbn_b0_1_115200 },
++
+       /* Fintek PCI serial cards */
+       { PCI_DEVICE(0x1c29, 0x1104), .driver_data = pbn_fintek_4 },
+       { PCI_DEVICE(0x1c29, 0x1108), .driver_data = pbn_fintek_8 },
+diff --git a/drivers/usb/class/usblp.c b/drivers/usb/class/usblp.c
+index b0471ce34011a..9775b5c8a313c 100644
+--- a/drivers/usb/class/usblp.c
++++ b/drivers/usb/class/usblp.c
+@@ -840,6 +840,11 @@ static ssize_t usblp_read(struct file *file, char __user 
*buffer, size_t len, lo
+       if (rv < 0)
+               return rv;
+ 
++      if (!usblp->present) {
++              count = -ENODEV;
++              goto done;
++      }
++
+       if ((avail = usblp->rstatus) < 0) {
+               printk(KERN_ERR "usblp%d: error %d reading from printer\n",
+                   usblp->minor, (int)avail);
+diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
+index 298c91f83aeec..7337d8f317aaf 100644
+--- a/drivers/usb/core/message.c
++++ b/drivers/usb/core/message.c
+@@ -1143,6 +1143,34 @@ void usb_disable_interface(struct usb_device *dev, 
struct usb_interface *intf,
+       }
+ }
+ 
++/*
++ * usb_disable_device_endpoints -- Disable all endpoints for a device
++ * @dev: the device whose endpoints are being disabled
++ * @skip_ep0: 0 to disable endpoint 0, 1 to skip it.
++ */
++static void usb_disable_device_endpoints(struct usb_device *dev, int skip_ep0)
++{
++      struct usb_hcd *hcd = bus_to_hcd(dev->bus);
++      int i;
++
++      if (hcd->driver->check_bandwidth) {
++              /* First pass: Cancel URBs, leave endpoint pointers intact. */
++              for (i = skip_ep0; i < 16; ++i) {
++                      usb_disable_endpoint(dev, i, false);
++                      usb_disable_endpoint(dev, i + USB_DIR_IN, false);
++              }
++              /* Remove endpoints from the host controller internal state */
++              mutex_lock(hcd->bandwidth_mutex);
++              usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
++              mutex_unlock(hcd->bandwidth_mutex);
++      }
++      /* Second pass: remove endpoint pointers */
++      for (i = skip_ep0; i < 16; ++i) {
++              usb_disable_endpoint(dev, i, true);
++              usb_disable_endpoint(dev, i + USB_DIR_IN, true);
++      }
++}
++
+ /**
+  * usb_disable_device - Disable all the endpoints for a USB device
+  * @dev: the device whose endpoints are being disabled
+@@ -1156,7 +1184,6 @@ void usb_disable_interface(struct usb_device *dev, 
struct usb_interface *intf,
+ void usb_disable_device(struct usb_device *dev, int skip_ep0)
+ {
+       int i;
+-      struct usb_hcd *hcd = bus_to_hcd(dev->bus);
+ 
+       /* getting rid of interfaces will disconnect
+        * any drivers bound to them (a key side effect)
+@@ -1202,22 +1229,8 @@ void usb_disable_device(struct usb_device *dev, int 
skip_ep0)
+ 
+       dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__,
+               skip_ep0 ? "non-ep0" : "all");
+-      if (hcd->driver->check_bandwidth) {
+-              /* First pass: Cancel URBs, leave endpoint pointers intact. */
+-              for (i = skip_ep0; i < 16; ++i) {
+-                      usb_disable_endpoint(dev, i, false);
+-                      usb_disable_endpoint(dev, i + USB_DIR_IN, false);
+-              }
+-              /* Remove endpoints from the host controller internal state */
+-              mutex_lock(hcd->bandwidth_mutex);
+-              usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
+-              mutex_unlock(hcd->bandwidth_mutex);
+-              /* Second pass: remove endpoint pointers */
+-      }
+-      for (i = skip_ep0; i < 16; ++i) {
+-              usb_disable_endpoint(dev, i, true);
+-              usb_disable_endpoint(dev, i + USB_DIR_IN, true);
+-      }
++
++      usb_disable_device_endpoints(dev, skip_ep0);
+ }
+ 
+ /**
+@@ -1460,6 +1473,9 @@ EXPORT_SYMBOL_GPL(usb_set_interface);
+  * The caller must own the device lock.
+  *
+  * Return: Zero on success, else a negative error code.
++ *
++ * If this routine fails the device will probably be in an unusable state
++ * with endpoints disabled, and interfaces only partially enabled.
+  */
+ int usb_reset_configuration(struct usb_device *dev)
+ {
+@@ -1475,10 +1491,7 @@ int usb_reset_configuration(struct usb_device *dev)
+        * calls during probe() are fine
+        */
+ 
+-      for (i = 1; i < 16; ++i) {
+-              usb_disable_endpoint(dev, i, true);
+-              usb_disable_endpoint(dev, i + USB_DIR_IN, true);
+-      }
++      usb_disable_device_endpoints(dev, 1); /* skip ep0*/
+ 
+       config = dev->actconfig;
+       retval = 0;
+@@ -1491,34 +1504,10 @@ int usb_reset_configuration(struct usb_device *dev)
+               mutex_unlock(hcd->bandwidth_mutex);
+               return -ENOMEM;
+       }
+-      /* Make sure we have enough bandwidth for each alternate setting 0 */
+-      for (i = 0; i < config->desc.bNumInterfaces; i++) {
+-              struct usb_interface *intf = config->interface[i];
+-              struct usb_host_interface *alt;
+ 
+-              alt = usb_altnum_to_altsetting(intf, 0);
+-              if (!alt)
+-                      alt = &intf->altsetting[0];
+-              if (alt != intf->cur_altsetting)
+-                      retval = usb_hcd_alloc_bandwidth(dev, NULL,
+-                                      intf->cur_altsetting, alt);
+-              if (retval < 0)
+-                      break;
+-      }
+-      /* If not, reinstate the old alternate settings */
++      /* xHCI adds all endpoints in usb_hcd_alloc_bandwidth */
++      retval = usb_hcd_alloc_bandwidth(dev, config, NULL, NULL);
+       if (retval < 0) {
+-reset_old_alts:
+-              for (i--; i >= 0; i--) {
+-                      struct usb_interface *intf = config->interface[i];
+-                      struct usb_host_interface *alt;
+-
+-                      alt = usb_altnum_to_altsetting(intf, 0);
+-                      if (!alt)
+-                              alt = &intf->altsetting[0];
+-                      if (alt != intf->cur_altsetting)
+-                              usb_hcd_alloc_bandwidth(dev, NULL,
+-                                              alt, intf->cur_altsetting);
+-              }
+               usb_enable_lpm(dev);
+               mutex_unlock(hcd->bandwidth_mutex);
+               return retval;
+@@ -1527,8 +1516,12 @@ reset_old_alts:
+                       USB_REQ_SET_CONFIGURATION, 0,
+                       config->desc.bConfigurationValue, 0,
+                       NULL, 0, USB_CTRL_SET_TIMEOUT);
+-      if (retval < 0)
+-              goto reset_old_alts;
++      if (retval < 0) {
++              usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
++              usb_enable_lpm(dev);
++              mutex_unlock(hcd->bandwidth_mutex);
++              return retval;
++      }
+       mutex_unlock(hcd->bandwidth_mutex);
+ 
+       /* re-init hc/hcd interface/endpoint state */
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index eed7c8d8e3d4f..dd72e85f2e176 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -236,6 +236,10 @@ static const struct usb_device_id usb_quirk_list[] = {
+       /* Generic RTL8153 based ethernet adapters */
+       { USB_DEVICE(0x0bda, 0x8153), .driver_info = USB_QUIRK_NO_LPM },
+ 
++      /* SONiX USB DEVICE Touchpad */
++      { USB_DEVICE(0x0c45, 0x7056), .driver_info =
++                      USB_QUIRK_IGNORE_REMOTE_WAKEUP },
++
+       /* Action Semiconductor flash disk */
+       { USB_DEVICE(0x10d6, 0x2200), .driver_info =
+                       USB_QUIRK_STRING_FETCH_255 },
+diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c
+index 15c19863f7b34..e97834c350922 100644
+--- a/drivers/usb/core/sysfs.c
++++ b/drivers/usb/core/sysfs.c
+@@ -865,7 +865,11 @@ read_descriptors(struct file *filp, struct kobject *kobj,
+       size_t srclen, n;
+       int cfgno;
+       void *src;
++      int retval;
+ 
++      retval = usb_lock_device_interruptible(udev);
++      if (retval < 0)
++              return -EINTR;
+       /* The binary attribute begins with the device descriptor.
+        * Following that are the raw descriptor entries for all the
+        * configurations (config plus subsidiary descriptors).
+@@ -890,6 +894,7 @@ read_descriptors(struct file *filp, struct kobject *kobj,
+                       off -= srclen;
+               }
+       }
++      usb_unlock_device(udev);
+       return count - nleft;
+ }
+ 
+diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
+index 6e834b83a1040..44b7066b12469 100644
+--- a/drivers/usb/host/ehci-hcd.c
++++ b/drivers/usb/host/ehci-hcd.c
+@@ -35,6 +35,7 @@
+ #include <linux/interrupt.h>
+ #include <linux/usb.h>
+ #include <linux/usb/hcd.h>
++#include <linux/usb/otg.h>
+ #include <linux/moduleparam.h>
+ #include <linux/dma-mapping.h>
+ #include <linux/debugfs.h>
+diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c
+index 37ef2ac9cdae0..c144172a09a40 100644
+--- a/drivers/usb/host/ehci-hub.c
++++ b/drivers/usb/host/ehci-hub.c
+@@ -27,7 +27,6 @@
+  */
+ 
+ /*-------------------------------------------------------------------------*/
+-#include <linux/usb/otg.h>
+ 
+ #define       PORT_WAKE_BITS  (PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E)
+ 
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index 8abb30c797d30..3e2d3a96b559e 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -708,6 +708,7 @@ static const struct usb_device_id id_table_combined[] = {
+       { USB_DEVICE(XSENS_VID, XSENS_AWINDA_STATION_PID) },
+       { USB_DEVICE(XSENS_VID, XSENS_CONVERTER_PID) },
+       { USB_DEVICE(XSENS_VID, XSENS_MTDEVBOARD_PID) },
++      { USB_DEVICE(XSENS_VID, XSENS_MTIUSBCONVERTER_PID) },
+       { USB_DEVICE(XSENS_VID, XSENS_MTW_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_OMNI1509) },
+       { USB_DEVICE(MOBILITY_VID, MOBILITY_USB_SERIAL_PID) },
+diff --git a/drivers/usb/serial/ftdi_sio_ids.h 
b/drivers/usb/serial/ftdi_sio_ids.h
+index e8373528264c3..b5ca17a5967a0 100644
+--- a/drivers/usb/serial/ftdi_sio_ids.h
++++ b/drivers/usb/serial/ftdi_sio_ids.h
+@@ -160,6 +160,7 @@
+ #define XSENS_AWINDA_DONGLE_PID 0x0102
+ #define XSENS_MTW_PID         0x0200  /* Xsens MTw */
+ #define XSENS_MTDEVBOARD_PID  0x0300  /* Motion Tracker Development Board */
++#define XSENS_MTIUSBCONVERTER_PID     0x0301  /* MTi USB converter */
+ #define XSENS_CONVERTER_PID   0xD00D  /* Xsens USB-serial converter */
+ 
+ /* Xsens devices using FTDI VID */
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 1e41240cdd43a..c2f1e49ea5062 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -1097,14 +1097,18 @@ static const struct usb_device_id option_ids[] = {
+       { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M),
+         .driver_info = RSVD(1) | RSVD(3) },
+       /* Quectel products using Quectel vendor ID */
+-      { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC21),
+-        .driver_info = RSVD(4) },
+-      { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EC25),
+-        .driver_info = RSVD(4) },
+-      { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_EG95),
+-        .driver_info = RSVD(4) },
+-      { USB_DEVICE(QUECTEL_VENDOR_ID, QUECTEL_PRODUCT_BG96),
+-        .driver_info = RSVD(4) },
++      { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EC21, 0xff, 0xff, 0xff),
++        .driver_info = NUMEP2 },
++      { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EC21, 0xff, 0, 0) },
++      { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EC25, 0xff, 0xff, 0xff),
++        .driver_info = NUMEP2 },
++      { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EC25, 0xff, 0, 0) },
++      { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EG95, 0xff, 0xff, 0xff),
++        .driver_info = NUMEP2 },
++      { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EG95, 0xff, 0, 0) },
++      { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_BG96, 0xff, 0xff, 0xff),
++        .driver_info = NUMEP2 },
++      { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_BG96, 0xff, 0, 0) },
+       { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EP06, 0xff, 0xff, 0xff),
+         .driver_info = RSVD(1) | RSVD(2) | RSVD(3) | RSVD(4) | NUMEP2 },
+       { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EP06, 0xff, 0, 0) },
+@@ -1822,6 +1826,8 @@ static const struct usb_device_id option_ids[] = {
+       { USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9003, 0xff) },   /* Simcom 
SIM7500/SIM7600 MBIM mode */
+       { USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9011, 0xff),     /* Simcom 
SIM7500/SIM7600 RNDIS mode */
+         .driver_info = RSVD(7) },
++      { USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9205, 0xff) },   /* Simcom 
SIM7070/SIM7080/SIM7090 AT+ECM mode */
++      { USB_DEVICE_INTERFACE_CLASS(0x1e0e, 0x9206, 0xff) },   /* Simcom 
SIM7070/SIM7080/SIM7090 AT-only mode */
+       { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X060S_X200),
+         .driver_info = NCTRL(0) | NCTRL(1) | RSVD(4) },
+       { USB_DEVICE(ALCATEL_VENDOR_ID, ALCATEL_PRODUCT_X220_X500D),
+diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
+index 20dd8df864c45..6234cee50a889 100644
+--- a/drivers/usb/storage/uas.c
++++ b/drivers/usb/storage/uas.c
+@@ -670,8 +670,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
+       if (devinfo->resetting) {
+               cmnd->result = DID_ERROR << 16;
+               cmnd->scsi_done(cmnd);
+-              spin_unlock_irqrestore(&devinfo->lock, flags);
+-              return 0;
++              goto zombie;
+       }
+ 
+       /* Find a free uas-tag */
+@@ -706,6 +705,16 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
+               cmdinfo->state &= ~(SUBMIT_DATA_IN_URB | SUBMIT_DATA_OUT_URB);
+ 
+       err = uas_submit_urbs(cmnd, devinfo);
++      /*
++       * in case of fatal errors the SCSI layer is peculiar
++       * a command that has finished is a success for the purpose
++       * of queueing, no matter how fatal the error
++       */
++      if (err == -ENODEV) {
++              cmnd->result = DID_ERROR << 16;
++              cmnd->scsi_done(cmnd);
++              goto zombie;
++      }
+       if (err) {
+               /* If we did nothing, give up now */
+               if (cmdinfo->state & SUBMIT_STATUS_URB) {
+@@ -716,6 +725,7 @@ static int uas_queuecommand_lck(struct scsi_cmnd *cmnd,
+       }
+ 
+       devinfo->cmnd[idx] = cmnd;
++zombie:
+       spin_unlock_irqrestore(&devinfo->lock, flags);
+       return 0;
+ }
+diff --git a/drivers/usb/typec/ucsi/ucsi_acpi.c 
b/drivers/usb/typec/ucsi/ucsi_acpi.c
+index 494d2a49203a9..d5e17dd6773a2 100644
+--- a/drivers/usb/typec/ucsi/ucsi_acpi.c
++++ b/drivers/usb/typec/ucsi/ucsi_acpi.c
+@@ -67,11 +67,15 @@ static void ucsi_acpi_notify(acpi_handle handle, u32 
event, void *data)
+ 
+ static int ucsi_acpi_probe(struct platform_device *pdev)
+ {
++      struct acpi_device *adev = ACPI_COMPANION(&pdev->dev);
+       struct ucsi_acpi *ua;
+       struct resource *res;
+       acpi_status status;
+       int ret;
+ 
++      if (adev->dep_unmet)
++              return -EPROBE_DEFER;
++
+       ua = devm_kzalloc(&pdev->dev, sizeof(*ua), GFP_KERNEL);
+       if (!ua)
+               return -ENOMEM;
+diff --git a/drivers/video/console/Kconfig b/drivers/video/console/Kconfig
+index 7f1f1fbcef9e2..7434320168e0c 100644
+--- a/drivers/video/console/Kconfig
++++ b/drivers/video/console/Kconfig
+@@ -22,52 +22,6 @@ config VGA_CONSOLE
+ 
+         Say Y.
+ 
+-config VGACON_SOFT_SCROLLBACK
+-       bool "Enable Scrollback Buffer in System RAM"
+-       depends on VGA_CONSOLE
+-       default n
+-       help
+-         The scrollback buffer of the standard VGA console is located in
+-       the VGA RAM.  The size of this RAM is fixed and is quite small.
+-       If you require a larger scrollback buffer, this can be placed in
+-       System RAM which is dynamically allocated during initialization.
+-       Placing the scrollback buffer in System RAM will slightly slow
+-       down the console.
+-
+-       If you want this feature, say 'Y' here and enter the amount of
+-       RAM to allocate for this buffer.  If unsure, say 'N'.
+-
+-config VGACON_SOFT_SCROLLBACK_SIZE
+-       int "Scrollback Buffer Size (in KB)"
+-       depends on VGACON_SOFT_SCROLLBACK
+-       range 1 1024
+-       default "64"
+-       help
+-        Enter the amount of System RAM to allocate for scrollback
+-        buffers of VGA consoles. Each 64KB will give you approximately
+-        16 80x25 screenfuls of scrollback buffer.
+-
+-config VGACON_SOFT_SCROLLBACK_PERSISTENT_ENABLE_BY_DEFAULT
+-      bool "Persistent Scrollback History for each console by default"
+-      depends on VGACON_SOFT_SCROLLBACK
+-      default n
+-      help
+-        Say Y here if the scrollback history should persist by default when
+-        switching between consoles. Otherwise, the scrollback history will be
+-        flushed each time the console is switched. This feature can also be
+-        enabled using the boot command line parameter
+-        'vgacon.scrollback_persistent=1'.
+-
+-        This feature might break your tool of choice to flush the scrollback
+-        buffer, e.g. clear(1) will work fine but Debian's clear_console(1)
+-        will be broken, which might cause security issues.
+-        You can use the escape sequence \e[3J instead if this feature is
+-        activated.
+-
+-        Note that a buffer of VGACON_SOFT_SCROLLBACK_SIZE is taken for each
+-        created tty device.
+-        So if you use a RAM-constrained system, say N here.
+-
+ config MDA_CONSOLE
+       depends on !M68K && !PARISC && ISA
+       tristate "MDA text console (dual-headed)"
+diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
+index 8f061c18e115e..a054af74c38f1 100644
+--- a/drivers/video/console/vgacon.c
++++ b/drivers/video/console/vgacon.c
+@@ -160,213 +160,6 @@ static inline void vga_set_mem_top(struct vc_data *c)
+       write_vga(12, (c->vc_visible_origin - vga_vram_base) / 2);
+ }
+ 
+-#ifdef CONFIG_VGACON_SOFT_SCROLLBACK
+-/* software scrollback */
+-struct vgacon_scrollback_info {
+-      void *data;
+-      int tail;
+-      int size;
+-      int rows;
+-      int cnt;
+-      int cur;
+-      int save;
+-      int restore;
+-};
+-
+-static struct vgacon_scrollback_info *vgacon_scrollback_cur;
+-static struct vgacon_scrollback_info vgacon_scrollbacks[MAX_NR_CONSOLES];
+-static bool scrollback_persistent = \
+-      IS_ENABLED(CONFIG_VGACON_SOFT_SCROLLBACK_PERSISTENT_ENABLE_BY_DEFAULT);
+-module_param_named(scrollback_persistent, scrollback_persistent, bool, 0000);
+-MODULE_PARM_DESC(scrollback_persistent, "Enable persistent scrollback for all 
vga consoles");
+-
+-static void vgacon_scrollback_reset(int vc_num, size_t reset_size)
+-{
+-      struct vgacon_scrollback_info *scrollback = &vgacon_scrollbacks[vc_num];
+-
+-      if (scrollback->data && reset_size > 0)
+-              memset(scrollback->data, 0, reset_size);
+-
+-      scrollback->cnt  = 0;
+-      scrollback->tail = 0;
+-      scrollback->cur  = 0;
+-}
+-
+-static void vgacon_scrollback_init(int vc_num)
+-{
+-      int pitch = vga_video_num_columns * 2;
+-      size_t size = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024;
+-      int rows = size / pitch;
+-      void *data;
+-
+-      data = kmalloc_array(CONFIG_VGACON_SOFT_SCROLLBACK_SIZE, 1024,
+-                           GFP_NOWAIT);
+-
+-      vgacon_scrollbacks[vc_num].data = data;
+-      vgacon_scrollback_cur = &vgacon_scrollbacks[vc_num];
+-
+-      vgacon_scrollback_cur->rows = rows - 1;
+-      vgacon_scrollback_cur->size = rows * pitch;
+-
+-      vgacon_scrollback_reset(vc_num, size);
+-}
+-
+-static void vgacon_scrollback_switch(int vc_num)
+-{
+-      if (!scrollback_persistent)
+-              vc_num = 0;
+-
+-      if (!vgacon_scrollbacks[vc_num].data) {
+-              vgacon_scrollback_init(vc_num);
+-      } else {
+-              if (scrollback_persistent) {
+-                      vgacon_scrollback_cur = &vgacon_scrollbacks[vc_num];
+-              } else {
+-                      size_t size = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024;
+-
+-                      vgacon_scrollback_reset(vc_num, size);
+-              }
+-      }
+-}
+-
+-static void vgacon_scrollback_startup(void)
+-{
+-      vgacon_scrollback_cur = &vgacon_scrollbacks[0];
+-      vgacon_scrollback_init(0);
+-}
+-
+-static void vgacon_scrollback_update(struct vc_data *c, int t, int count)
+-{
+-      void *p;
+-
+-      if (!vgacon_scrollback_cur->data || !vgacon_scrollback_cur->size ||
+-          c->vc_num != fg_console)
+-              return;
+-
+-      p = (void *) (c->vc_origin + t * c->vc_size_row);
+-
+-      while (count--) {
+-              if ((vgacon_scrollback_cur->tail + c->vc_size_row) >
+-                  vgacon_scrollback_cur->size)
+-                      vgacon_scrollback_cur->tail = 0;
+-
+-              scr_memcpyw(vgacon_scrollback_cur->data +
+-                          vgacon_scrollback_cur->tail,
+-                          p, c->vc_size_row);
+-
+-              vgacon_scrollback_cur->cnt++;
+-              p += c->vc_size_row;
+-              vgacon_scrollback_cur->tail += c->vc_size_row;
+-
+-              if (vgacon_scrollback_cur->tail >= vgacon_scrollback_cur->size)
+-                      vgacon_scrollback_cur->tail = 0;
+-
+-              if (vgacon_scrollback_cur->cnt > vgacon_scrollback_cur->rows)
+-                      vgacon_scrollback_cur->cnt = 
vgacon_scrollback_cur->rows;
+-
+-              vgacon_scrollback_cur->cur = vgacon_scrollback_cur->cnt;
+-      }
+-}
+-
+-static void vgacon_restore_screen(struct vc_data *c)
+-{
+-      vgacon_scrollback_cur->save = 0;
+-
+-      if (!vga_is_gfx && !vgacon_scrollback_cur->restore) {
+-              scr_memcpyw((u16 *) c->vc_origin, (u16 *) c->vc_screenbuf,
+-                          c->vc_screenbuf_size > vga_vram_size ?
+-                          vga_vram_size : c->vc_screenbuf_size);
+-              vgacon_scrollback_cur->restore = 1;
+-              vgacon_scrollback_cur->cur = vgacon_scrollback_cur->cnt;
+-      }
+-}
+-
+-static void vgacon_scrolldelta(struct vc_data *c, int lines)
+-{
+-      int start, end, count, soff;
+-
+-      if (!lines) {
+-              c->vc_visible_origin = c->vc_origin;
+-              vga_set_mem_top(c);
+-              return;
+-      }
+-
+-      if (!vgacon_scrollback_cur->data)
+-              return;
+-
+-      if (!vgacon_scrollback_cur->save) {
+-              vgacon_cursor(c, CM_ERASE);
+-              vgacon_save_screen(c);
+-              vgacon_scrollback_cur->save = 1;
+-      }
+-
+-      vgacon_scrollback_cur->restore = 0;
+-      start = vgacon_scrollback_cur->cur + lines;
+-      end = start + abs(lines);
+-
+-      if (start < 0)
+-              start = 0;
+-
+-      if (start > vgacon_scrollback_cur->cnt)
+-              start = vgacon_scrollback_cur->cnt;
+-
+-      if (end < 0)
+-              end = 0;
+-
+-      if (end > vgacon_scrollback_cur->cnt)
+-              end = vgacon_scrollback_cur->cnt;
+-
+-      vgacon_scrollback_cur->cur = start;
+-      count = end - start;
+-      soff = vgacon_scrollback_cur->tail -
+-              ((vgacon_scrollback_cur->cnt - end) * c->vc_size_row);
+-      soff -= count * c->vc_size_row;
+-
+-      if (soff < 0)
+-              soff += vgacon_scrollback_cur->size;
+-
+-      count = vgacon_scrollback_cur->cnt - start;
+-
+-      if (count > c->vc_rows)
+-              count = c->vc_rows;
+-
+-      if (count) {
+-              int copysize;
+-
+-              int diff = c->vc_rows - count;
+-              void *d = (void *) c->vc_origin;
+-              void *s = (void *) c->vc_screenbuf;
+-
+-              count *= c->vc_size_row;
+-              /* how much memory to end of buffer left? */
+-              copysize = min(count, vgacon_scrollback_cur->size - soff);
+-              scr_memcpyw(d, vgacon_scrollback_cur->data + soff, copysize);
+-              d += copysize;
+-              count -= copysize;
+-
+-              if (count) {
+-                      scr_memcpyw(d, vgacon_scrollback_cur->data, count);
+-                      d += count;
+-              }
+-
+-              if (diff)
+-                      scr_memcpyw(d, s, diff * c->vc_size_row);
+-      } else
+-              vgacon_cursor(c, CM_MOVE);
+-}
+-
+-static void vgacon_flush_scrollback(struct vc_data *c)
+-{
+-      size_t size = CONFIG_VGACON_SOFT_SCROLLBACK_SIZE * 1024;
+-
+-      vgacon_scrollback_reset(c->vc_num, size);
+-}
+-#else
+-#define vgacon_scrollback_startup(...) do { } while (0)
+-#define vgacon_scrollback_init(...)    do { } while (0)
+-#define vgacon_scrollback_update(...)  do { } while (0)
+-#define vgacon_scrollback_switch(...)  do { } while (0)
+-
+ static void vgacon_restore_screen(struct vc_data *c)
+ {
+       if (c->vc_origin != c->vc_visible_origin)
+@@ -380,11 +173,6 @@ static void vgacon_scrolldelta(struct vc_data *c, int 
lines)
+       vga_set_mem_top(c);
+ }
+ 
+-static void vgacon_flush_scrollback(struct vc_data *c)
+-{
+-}
+-#endif /* CONFIG_VGACON_SOFT_SCROLLBACK */
+-
+ static const char *vgacon_startup(void)
+ {
+       const char *display_desc = NULL;
+@@ -567,10 +355,7 @@ static const char *vgacon_startup(void)
+       vgacon_xres = screen_info.orig_video_cols * VGA_FONTWIDTH;
+       vgacon_yres = vga_scan_lines;
+ 
+-      if (!vga_init_done) {
+-              vgacon_scrollback_startup();
+-              vga_init_done = true;
+-      }
++      vga_init_done = true;
+ 
+       return display_desc;
+ }
+@@ -861,7 +646,6 @@ static int vgacon_switch(struct vc_data *c)
+                       vgacon_doresize(c, c->vc_cols, c->vc_rows);
+       }
+ 
+-      vgacon_scrollback_switch(c->vc_num);
+       return 0;               /* Redrawing not needed */
+ }
+ 
+@@ -1377,7 +1161,6 @@ static bool vgacon_scroll(struct vc_data *c, unsigned 
int t, unsigned int b,
+       oldo = c->vc_origin;
+       delta = lines * c->vc_size_row;
+       if (dir == SM_UP) {
+-              vgacon_scrollback_update(c, t, lines);
+               if (c->vc_scr_end + delta >= vga_vram_end) {
+                       scr_memcpyw((u16 *) vga_vram_base,
+                                   (u16 *) (oldo + delta),
+@@ -1442,7 +1225,6 @@ const struct consw vga_con = {
+       .con_save_screen = vgacon_save_screen,
+       .con_build_attr = vgacon_build_attr,
+       .con_invert_region = vgacon_invert_region,
+-      .con_flush_scrollback = vgacon_flush_scrollback,
+ };
+ EXPORT_SYMBOL(vga_con);
+ 
+diff --git a/drivers/video/fbdev/core/bitblit.c 
b/drivers/video/fbdev/core/bitblit.c
+index 5dce2b10c09ac..33408c1994a6a 100644
+--- a/drivers/video/fbdev/core/bitblit.c
++++ b/drivers/video/fbdev/core/bitblit.c
+@@ -234,7 +234,7 @@ static void bit_clear_margins(struct vc_data *vc, struct 
fb_info *info,
+ }
+ 
+ static void bit_cursor(struct vc_data *vc, struct fb_info *info, int mode,
+-                     int softback_lines, int fg, int bg)
++                     int fg, int bg)
+ {
+       struct fb_cursor cursor;
+       struct fbcon_ops *ops = info->fbcon_par;
+@@ -247,15 +247,6 @@ static void bit_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
+ 
+       cursor.set = 0;
+ 
+-      if (softback_lines) {
+-              if (y + softback_lines >= vc->vc_rows) {
+-                      mode = CM_ERASE;
+-                      ops->cursor_flash = 0;
+-                      return;
+-              } else
+-                      y += softback_lines;
+-      }
+-
+       c = scr_readw((u16 *) vc->vc_pos);
+       attribute = get_attribute(info, c);
+       src = vc->vc_font.data + ((c & charmask) * (w * vc->vc_font.height));
+diff --git a/drivers/video/fbdev/core/fbcon.c 
b/drivers/video/fbdev/core/fbcon.c
+index be31be84af67d..5825f057fb4b1 100644
+--- a/drivers/video/fbdev/core/fbcon.c
++++ b/drivers/video/fbdev/core/fbcon.c
+@@ -102,12 +102,6 @@ static int logo_lines;
+ /* logo_shown is an index to vc_cons when >= 0; otherwise follows FBCON_LOGO
+    enums.  */
+ static int logo_shown = FBCON_LOGO_CANSHOW;
+-/* Software scrollback */
+-static int fbcon_softback_size = 32768;
+-static unsigned long softback_buf, softback_curr;
+-static unsigned long softback_in;
+-static unsigned long softback_top, softback_end;
+-static int softback_lines;
+ /* console mappings */
+ static int first_fb_vc;
+ static int last_fb_vc = MAX_NR_CONSOLES - 1;
+@@ -142,8 +136,6 @@ static int margin_color;
+ 
+ static const struct consw fb_con;
+ 
+-#define CM_SOFTBACK   (8)
+-
+ #define advance_row(p, delta) (unsigned short *)((unsigned long)(p) + (delta) 
* vc->vc_size_row)
+ 
+ static int fbcon_set_origin(struct vc_data *);
+@@ -349,18 +341,6 @@ static int get_color(struct vc_data *vc, struct fb_info 
*info,
+       return color;
+ }
+ 
+-static void fbcon_update_softback(struct vc_data *vc)
+-{
+-      int l = fbcon_softback_size / vc->vc_size_row;
+-
+-      if (l > 5)
+-              softback_end = softback_buf + l * vc->vc_size_row;
+-      else
+-              /* Smaller scrollback makes no sense, and 0 would screw
+-                 the operation totally */
+-              softback_top = 0;
+-}
+-
+ static void fb_flashcursor(struct work_struct *work)
+ {
+       struct fb_info *info = container_of(work, struct fb_info, queue);
+@@ -390,7 +370,7 @@ static void fb_flashcursor(struct work_struct *work)
+       c = scr_readw((u16 *) vc->vc_pos);
+       mode = (!ops->cursor_flash || ops->cursor_state.enable) ?
+               CM_ERASE : CM_DRAW;
+-      ops->cursor(vc, info, mode, softback_lines, get_color(vc, info, c, 1),
++      ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
+                   get_color(vc, info, c, 0));
+       console_unlock();
+ }
+@@ -448,13 +428,7 @@ static int __init fb_console_setup(char *this_opt)
+               }
+               
+               if (!strncmp(options, "scrollback:", 11)) {
+-                      options += 11;
+-                      if (*options) {
+-                              fbcon_softback_size = simple_strtoul(options, 
&options, 0);
+-                              if (*options == 'k' || *options == 'K') {
+-                                      fbcon_softback_size *= 1024;
+-                              }
+-                      }
++                      pr_warn("Ignoring scrollback size option\n");
+                       continue;
+               }
+               
+@@ -969,31 +943,6 @@ static const char *fbcon_startup(void)
+               p->con_rotate = fbcon_platform_get_rotate(info);
+       set_blitting_type(vc, info);
+ 
+-      if (info->fix.type != FB_TYPE_TEXT) {
+-              if (fbcon_softback_size) {
+-                      if (!softback_buf) {
+-                              softback_buf =
+-                                  (unsigned long)
+-                                  kmalloc(fbcon_softback_size,
+-                                          GFP_KERNEL);
+-                              if (!softback_buf) {
+-                                      fbcon_softback_size = 0;
+-                                      softback_top = 0;
+-                              }
+-                      }
+-              } else {
+-                      if (softback_buf) {
+-                              kfree((void *) softback_buf);
+-                              softback_buf = 0;
+-                              softback_top = 0;
+-                      }
+-              }
+-              if (softback_buf)
+-                      softback_in = softback_top = softback_curr =
+-                          softback_buf;
+-              softback_lines = 0;
+-      }
+-
+       /* Setup default font */
+       if (!p->fontdata && !vc->vc_font.data) {
+               if (!fontname[0] || !(font = find_font(fontname)))
+@@ -1159,9 +1108,6 @@ static void fbcon_init(struct vc_data *vc, int init)
+       if (logo)
+               fbcon_prepare_logo(vc, info, cols, rows, new_cols, new_rows);
+ 
+-      if (vc == svc && softback_buf)
+-              fbcon_update_softback(vc);
+-
+       if (ops->rotate_font && ops->rotate_font(info, vc)) {
+               ops->rotate = FB_ROTATE_UR;
+               set_blitting_type(vc, info);
+@@ -1324,7 +1270,6 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
+ {
+       struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
+       struct fbcon_ops *ops = info->fbcon_par;
+-      int y;
+       int c = scr_readw((u16 *) vc->vc_pos);
+ 
+       ops->cur_blink_jiffies = msecs_to_jiffies(vc->vc_cur_blink_ms);
+@@ -1338,16 +1283,8 @@ static void fbcon_cursor(struct vc_data *vc, int mode)
+               fbcon_add_cursor_timer(info);
+ 
+       ops->cursor_flash = (mode == CM_ERASE) ? 0 : 1;
+-      if (mode & CM_SOFTBACK) {
+-              mode &= ~CM_SOFTBACK;
+-              y = softback_lines;
+-      } else {
+-              if (softback_lines)
+-                      fbcon_set_origin(vc);
+-              y = 0;
+-      }
+ 
+-      ops->cursor(vc, info, mode, y, get_color(vc, info, c, 1),
++      ops->cursor(vc, info, mode, get_color(vc, info, c, 1),
+                   get_color(vc, info, c, 0));
+ }
+ 
+@@ -1418,8 +1355,6 @@ static void fbcon_set_disp(struct fb_info *info, struct 
fb_var_screeninfo *var,
+ 
+       if (con_is_visible(vc)) {
+               update_screen(vc);
+-              if (softback_buf)
+-                      fbcon_update_softback(vc);
+       }
+ }
+ 
+@@ -1557,99 +1492,6 @@ static __inline__ void ypan_down_redraw(struct vc_data 
*vc, int t, int count)
+       scrollback_current = 0;
+ }
+ 
+-static void fbcon_redraw_softback(struct vc_data *vc, struct display *p,
+-                                long delta)
+-{
+-      int count = vc->vc_rows;
+-      unsigned short *d, *s;
+-      unsigned long n;
+-      int line = 0;
+-
+-      d = (u16 *) softback_curr;
+-      if (d == (u16 *) softback_in)
+-              d = (u16 *) vc->vc_origin;
+-      n = softback_curr + delta * vc->vc_size_row;
+-      softback_lines -= delta;
+-      if (delta < 0) {
+-              if (softback_curr < softback_top && n < softback_buf) {
+-                      n += softback_end - softback_buf;
+-                      if (n < softback_top) {
+-                              softback_lines -=
+-                                  (softback_top - n) / vc->vc_size_row;
+-                              n = softback_top;
+-                      }
+-              } else if (softback_curr >= softback_top
+-                         && n < softback_top) {
+-                      softback_lines -=
+-                          (softback_top - n) / vc->vc_size_row;
+-                      n = softback_top;
+-              }
+-      } else {
+-              if (softback_curr > softback_in && n >= softback_end) {
+-                      n += softback_buf - softback_end;
+-                      if (n > softback_in) {
+-                              n = softback_in;
+-                              softback_lines = 0;
+-                      }
+-              } else if (softback_curr <= softback_in && n > softback_in) {
+-                      n = softback_in;
+-                      softback_lines = 0;
+-              }
+-      }
+-      if (n == softback_curr)
+-              return;
+-      softback_curr = n;
+-      s = (u16 *) softback_curr;
+-      if (s == (u16 *) softback_in)
+-              s = (u16 *) vc->vc_origin;
+-      while (count--) {
+-              unsigned short *start;
+-              unsigned short *le;
+-              unsigned short c;
+-              int x = 0;
+-              unsigned short attr = 1;
+-
+-              start = s;
+-              le = advance_row(s, 1);
+-              do {
+-                      c = scr_readw(s);
+-                      if (attr != (c & 0xff00)) {
+-                              attr = c & 0xff00;
+-                              if (s > start) {
+-                                      fbcon_putcs(vc, start, s - start,
+-                                                  line, x);
+-                                      x += s - start;
+-                                      start = s;
+-                              }
+-                      }
+-                      if (c == scr_readw(d)) {
+-                              if (s > start) {
+-                                      fbcon_putcs(vc, start, s - start,
+-                                                  line, x);
+-                                      x += s - start + 1;
+-                                      start = s + 1;
+-                              } else {
+-                                      x++;
+-                                      start++;
+-                              }
+-                      }
+-                      s++;
+-                      d++;
+-              } while (s < le);
+-              if (s > start)
+-                      fbcon_putcs(vc, start, s - start, line, x);
+-              line++;
+-              if (d == (u16 *) softback_end)
+-                      d = (u16 *) softback_buf;
+-              if (d == (u16 *) softback_in)
+-                      d = (u16 *) vc->vc_origin;
+-              if (s == (u16 *) softback_end)
+-                      s = (u16 *) softback_buf;
+-              if (s == (u16 *) softback_in)
+-                      s = (u16 *) vc->vc_origin;
+-      }
+-}
+-
+ static void fbcon_redraw_move(struct vc_data *vc, struct display *p,
+                             int line, int count, int dy)
+ {
+@@ -1789,31 +1631,6 @@ static void fbcon_redraw(struct vc_data *vc, struct 
display *p,
+       }
+ }
+ 
+-static inline void fbcon_softback_note(struct vc_data *vc, int t,
+-                                     int count)
+-{
+-      unsigned short *p;
+-
+-      if (vc->vc_num != fg_console)
+-              return;
+-      p = (unsigned short *) (vc->vc_origin + t * vc->vc_size_row);
+-
+-      while (count) {
+-              scr_memcpyw((u16 *) softback_in, p, vc->vc_size_row);
+-              count--;
+-              p = advance_row(p, 1);
+-              softback_in += vc->vc_size_row;
+-              if (softback_in == softback_end)
+-                      softback_in = softback_buf;
+-              if (softback_in == softback_top) {
+-                      softback_top += vc->vc_size_row;
+-                      if (softback_top == softback_end)
+-                              softback_top = softback_buf;
+-              }
+-      }
+-      softback_curr = softback_in;
+-}
+-
+ static bool fbcon_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
+               enum con_scroll dir, unsigned int count)
+ {
+@@ -1836,8 +1653,6 @@ static bool fbcon_scroll(struct vc_data *vc, unsigned 
int t, unsigned int b,
+       case SM_UP:
+               if (count > vc->vc_rows)        /* Maximum realistic size */
+                       count = vc->vc_rows;
+-              if (softback_top)
+-                      fbcon_softback_note(vc, t, count);
+               if (logo_shown >= 0)
+                       goto redraw_up;
+               switch (p->scrollmode) {
+@@ -2142,7 +1957,7 @@ static int fbcon_resize(struct vc_data *vc, unsigned int 
width,
+       struct fb_var_screeninfo var = info->var;
+       int x_diff, y_diff, virt_w, virt_h, virt_fw, virt_fh;
+ 
+-      if (ops->p && ops->p->userfont && FNTSIZE(vc->vc_font.data)) {
++      if (p->userfont && FNTSIZE(vc->vc_font.data)) {
+               int size;
+               int pitch = PITCH(vc->vc_font.width);
+ 
+@@ -2208,14 +2023,6 @@ static int fbcon_switch(struct vc_data *vc)
+       info = registered_fb[con2fb_map[vc->vc_num]];
+       ops = info->fbcon_par;
+ 
+-      if (softback_top) {
+-              if (softback_lines)
+-                      fbcon_set_origin(vc);
+-              softback_top = softback_curr = softback_in = softback_buf;
+-              softback_lines = 0;
+-              fbcon_update_softback(vc);
+-      }
+-
+       if (logo_shown >= 0) {
+               struct vc_data *conp2 = vc_cons[logo_shown].d;
+ 
+@@ -2549,9 +2356,6 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, 
int h,
+       int cnt;
+       char *old_data = NULL;
+ 
+-      if (con_is_visible(vc) && softback_lines)
+-              fbcon_set_origin(vc);
+-
+       resize = (w != vc->vc_font.width) || (h != vc->vc_font.height);
+       if (p->userfont)
+               old_data = vc->vc_font.data;
+@@ -2577,8 +2381,6 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, 
int h,
+               cols /= w;
+               rows /= h;
+               vc_resize(vc, cols, rows);
+-              if (con_is_visible(vc) && softback_buf)
+-                      fbcon_update_softback(vc);
+       } else if (con_is_visible(vc)
+                  && vc->vc_mode == KD_TEXT) {
+               fbcon_clear_margins(vc, 0);
+@@ -2736,19 +2538,7 @@ static void fbcon_set_palette(struct vc_data *vc, const 
unsigned char *table)
+ 
+ static u16 *fbcon_screen_pos(struct vc_data *vc, int offset)
+ {
+-      unsigned long p;
+-      int line;
+-      
+-      if (vc->vc_num != fg_console || !softback_lines)
+-              return (u16 *) (vc->vc_origin + offset);
+-      line = offset / vc->vc_size_row;
+-      if (line >= softback_lines)
+-              return (u16 *) (vc->vc_origin + offset -
+-                              softback_lines * vc->vc_size_row);
+-      p = softback_curr + offset;
+-      if (p >= softback_end)
+-              p += softback_buf - softback_end;
+-      return (u16 *) p;
++      return (u16 *) (vc->vc_origin + offset);
+ }
+ 
+ static unsigned long fbcon_getxy(struct vc_data *vc, unsigned long pos,
+@@ -2762,22 +2552,7 @@ static unsigned long fbcon_getxy(struct vc_data *vc, 
unsigned long pos,
+ 
+               x = offset % vc->vc_cols;
+               y = offset / vc->vc_cols;
+-              if (vc->vc_num == fg_console)
+-                      y += softback_lines;
+               ret = pos + (vc->vc_cols - x) * 2;
+-      } else if (vc->vc_num == fg_console && softback_lines) {
+-              unsigned long offset = pos - softback_curr;
+-
+-              if (pos < softback_curr)
+-                      offset += softback_end - softback_buf;
+-              offset /= 2;
+-              x = offset % vc->vc_cols;
+-              y = offset / vc->vc_cols;
+-              ret = pos + (vc->vc_cols - x) * 2;
+-              if (ret == softback_end)
+-                      ret = softback_buf;
+-              if (ret == softback_in)
+-                      ret = vc->vc_origin;
+       } else {
+               /* Should not happen */
+               x = y = 0;
+@@ -2805,106 +2580,11 @@ static void fbcon_invert_region(struct vc_data *vc, 
u16 * p, int cnt)
+                       a = ((a) & 0x88ff) | (((a) & 0x7000) >> 4) |
+                           (((a) & 0x0700) << 4);
+               scr_writew(a, p++);
+-              if (p == (u16 *) softback_end)
+-                      p = (u16 *) softback_buf;
+-              if (p == (u16 *) softback_in)
+-                      p = (u16 *) vc->vc_origin;
+       }
+ }
+ 
+-static void fbcon_scrolldelta(struct vc_data *vc, int lines)
+-{
+-      struct fb_info *info = registered_fb[con2fb_map[fg_console]];
+-      struct fbcon_ops *ops = info->fbcon_par;
+-      struct display *disp = &fb_display[fg_console];
+-      int offset, limit, scrollback_old;
+-
+-      if (softback_top) {
+-              if (vc->vc_num != fg_console)
+-                      return;
+-              if (vc->vc_mode != KD_TEXT || !lines)
+-                      return;
+-              if (logo_shown >= 0) {
+-                      struct vc_data *conp2 = vc_cons[logo_shown].d;
+-
+-                      if (conp2->vc_top == logo_lines
+-                          && conp2->vc_bottom == conp2->vc_rows)
+-                              conp2->vc_top = 0;
+-                      if (logo_shown == vc->vc_num) {
+-                              unsigned long p, q;
+-                              int i;
+-
+-                              p = softback_in;
+-                              q = vc->vc_origin +
+-                                  logo_lines * vc->vc_size_row;
+-                              for (i = 0; i < logo_lines; i++) {
+-                                      if (p == softback_top)
+-                                              break;
+-                                      if (p == softback_buf)
+-                                              p = softback_end;
+-                                      p -= vc->vc_size_row;
+-                                      q -= vc->vc_size_row;
+-                                      scr_memcpyw((u16 *) q, (u16 *) p,
+-                                                  vc->vc_size_row);
+-                              }
+-                              softback_in = softback_curr = p;
+-                              update_region(vc, vc->vc_origin,
+-                                            logo_lines * vc->vc_cols);
+-                      }
+-                      logo_shown = FBCON_LOGO_CANSHOW;
+-              }
+-              fbcon_cursor(vc, CM_ERASE | CM_SOFTBACK);
+-              fbcon_redraw_softback(vc, disp, lines);
+-              fbcon_cursor(vc, CM_DRAW | CM_SOFTBACK);
+-              return;
+-      }
+-
+-      if (!scrollback_phys_max)
+-              return;
+-
+-      scrollback_old = scrollback_current;
+-      scrollback_current -= lines;
+-      if (scrollback_current < 0)
+-              scrollback_current = 0;
+-      else if (scrollback_current > scrollback_max)
+-              scrollback_current = scrollback_max;
+-      if (scrollback_current == scrollback_old)
+-              return;
+-
+-      if (fbcon_is_inactive(vc, info))
+-              return;
+-
+-      fbcon_cursor(vc, CM_ERASE);
+-
+-      offset = disp->yscroll - scrollback_current;
+-      limit = disp->vrows;
+-      switch (disp->scrollmode) {
+-      case SCROLL_WRAP_MOVE:
+-              info->var.vmode |= FB_VMODE_YWRAP;
+-              break;
+-      case SCROLL_PAN_MOVE:
+-      case SCROLL_PAN_REDRAW:
+-              limit -= vc->vc_rows;
+-              info->var.vmode &= ~FB_VMODE_YWRAP;
+-              break;
+-      }
+-      if (offset < 0)
+-              offset += limit;
+-      else if (offset >= limit)
+-              offset -= limit;
+-
+-      ops->var.xoffset = 0;
+-      ops->var.yoffset = offset * vc->vc_font.height;
+-      ops->update_start(info);
+-
+-      if (!scrollback_current)
+-              fbcon_cursor(vc, CM_DRAW);
+-}
+-
+ static int fbcon_set_origin(struct vc_data *vc)
+ {
+-      if (softback_lines)
+-              fbcon_scrolldelta(vc, softback_lines);
+       return 0;
+ }
+ 
+@@ -2968,8 +2648,6 @@ static void fbcon_modechanged(struct fb_info *info)
+ 
+               fbcon_set_palette(vc, color_table);
+               update_screen(vc);
+-              if (softback_buf)
+-                      fbcon_update_softback(vc);
+       }
+ }
+ 
+@@ -3389,7 +3067,6 @@ static const struct consw fb_con = {
+       .con_font_default       = fbcon_set_def_font,
+       .con_font_copy          = fbcon_copy_font,
+       .con_set_palette        = fbcon_set_palette,
+-      .con_scrolldelta        = fbcon_scrolldelta,
+       .con_set_origin         = fbcon_set_origin,
+       .con_invert_region      = fbcon_invert_region,
+       .con_screen_pos         = fbcon_screen_pos,
+@@ -3598,9 +3275,6 @@ static void fbcon_exit(void)
+       if (fbcon_has_exited)
+               return;
+ 
+-      kfree((void *)softback_buf);
+-      softback_buf = 0UL;
+-
+       for (i = 0; i < FB_MAX; i++) {
+               int pending = 0;
+ 
+diff --git a/drivers/video/fbdev/core/fbcon.h 
b/drivers/video/fbdev/core/fbcon.h
+index 18f3ac1442370..0d85ad43caa3e 100644
+--- a/drivers/video/fbdev/core/fbcon.h
++++ b/drivers/video/fbdev/core/fbcon.h
+@@ -62,7 +62,7 @@ struct fbcon_ops {
+       void (*clear_margins)(struct vc_data *vc, struct fb_info *info,
+                             int color, int bottom_only);
+       void (*cursor)(struct vc_data *vc, struct fb_info *info, int mode,
+-                     int softback_lines, int fg, int bg);
++                     int fg, int bg);
+       int  (*update_start)(struct fb_info *info);
+       int  (*rotate_font)(struct fb_info *info, struct vc_data *vc);
+       struct fb_var_screeninfo var;  /* copy of the current fb_var_screeninfo 
*/
+diff --git a/drivers/video/fbdev/core/fbcon_ccw.c 
b/drivers/video/fbdev/core/fbcon_ccw.c
+index e0b9fbe7ca9e1..be6103bedf2eb 100644
+--- a/drivers/video/fbdev/core/fbcon_ccw.c
++++ b/drivers/video/fbdev/core/fbcon_ccw.c
+@@ -219,7 +219,7 @@ static void ccw_clear_margins(struct vc_data *vc, struct 
fb_info *info,
+ }
+ 
+ static void ccw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
+-                     int softback_lines, int fg, int bg)
++                     int fg, int bg)
+ {
+       struct fb_cursor cursor;
+       struct fbcon_ops *ops = info->fbcon_par;
+@@ -236,15 +236,6 @@ static void ccw_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
+ 
+       cursor.set = 0;
+ 
+-      if (softback_lines) {
+-              if (y + softback_lines >= vc->vc_rows) {
+-                      mode = CM_ERASE;
+-                      ops->cursor_flash = 0;
+-                      return;
+-              } else
+-                      y += softback_lines;
+-      }
+-
+       c = scr_readw((u16 *) vc->vc_pos);
+       attribute = get_attribute(info, c);
+       src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
+diff --git a/drivers/video/fbdev/core/fbcon_cw.c 
b/drivers/video/fbdev/core/fbcon_cw.c
+index 158e6ea1c0f64..dab93bb1ba422 100644
+--- a/drivers/video/fbdev/core/fbcon_cw.c
++++ b/drivers/video/fbdev/core/fbcon_cw.c
+@@ -202,7 +202,7 @@ static void cw_clear_margins(struct vc_data *vc, struct 
fb_info *info,
+ }
+ 
+ static void cw_cursor(struct vc_data *vc, struct fb_info *info, int mode,
+-                    int softback_lines, int fg, int bg)
++                    int fg, int bg)
+ {
+       struct fb_cursor cursor;
+       struct fbcon_ops *ops = info->fbcon_par;
+@@ -219,15 +219,6 @@ static void cw_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
+ 
+       cursor.set = 0;
+ 
+-      if (softback_lines) {
+-              if (y + softback_lines >= vc->vc_rows) {
+-                      mode = CM_ERASE;
+-                      ops->cursor_flash = 0;
+-                      return;
+-              } else
+-                      y += softback_lines;
+-      }
+-
+       c = scr_readw((u16 *) vc->vc_pos);
+       attribute = get_attribute(info, c);
+       src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.width));
+diff --git a/drivers/video/fbdev/core/fbcon_ud.c 
b/drivers/video/fbdev/core/fbcon_ud.c
+index 3df2696381667..dfed90bf07683 100644
+--- a/drivers/video/fbdev/core/fbcon_ud.c
++++ b/drivers/video/fbdev/core/fbcon_ud.c
+@@ -249,7 +249,7 @@ static void ud_clear_margins(struct vc_data *vc, struct 
fb_info *info,
+ }
+ 
+ static void ud_cursor(struct vc_data *vc, struct fb_info *info, int mode,
+-                    int softback_lines, int fg, int bg)
++                    int fg, int bg)
+ {
+       struct fb_cursor cursor;
+       struct fbcon_ops *ops = info->fbcon_par;
+@@ -267,15 +267,6 @@ static void ud_cursor(struct vc_data *vc, struct fb_info 
*info, int mode,
+ 
+       cursor.set = 0;
+ 
+-      if (softback_lines) {
+-              if (y + softback_lines >= vc->vc_rows) {
+-                      mode = CM_ERASE;
+-                      ops->cursor_flash = 0;
+-                      return;
+-              } else
+-                      y += softback_lines;
+-      }
+-
+       c = scr_readw((u16 *) vc->vc_pos);
+       attribute = get_attribute(info, c);
+       src = ops->fontbuffer + ((c & charmask) * (w * vc->vc_font.height));
+diff --git a/drivers/video/fbdev/core/tileblit.c 
b/drivers/video/fbdev/core/tileblit.c
+index 93390312957ff..eb664dbf96f66 100644
+--- a/drivers/video/fbdev/core/tileblit.c
++++ b/drivers/video/fbdev/core/tileblit.c
+@@ -80,7 +80,7 @@ static void tile_clear_margins(struct vc_data *vc, struct 
fb_info *info,
+ }
+ 
+ static void tile_cursor(struct vc_data *vc, struct fb_info *info, int mode,
+-                      int softback_lines, int fg, int bg)
++                      int fg, int bg)
+ {
+       struct fb_tilecursor cursor;
+       int use_sw = (vc->vc_cursor_type & 0x10);
+diff --git a/drivers/video/fbdev/vga16fb.c b/drivers/video/fbdev/vga16fb.c
+index 5f0690c8fc936..ee6957a799bb6 100644
+--- a/drivers/video/fbdev/vga16fb.c
++++ b/drivers/video/fbdev/vga16fb.c
+@@ -1122,7 +1122,7 @@ static void vga_8planes_imageblit(struct fb_info *info, 
const struct fb_image *i
+         char oldop = setop(0);
+         char oldsr = setsr(0);
+         char oldmask = selectmask();
+-        const char *cdat = image->data;
++      const unsigned char *cdat = image->data;
+       u32 dx = image->dx;
+         char __iomem *where;
+         int y;
+diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
+index 63b8812ba508a..cb46ad4b2b0d1 100644
+--- a/fs/btrfs/extent-tree.c
++++ b/fs/btrfs/extent-tree.c
+@@ -1170,12 +1170,11 @@ int btrfs_get_extent_inline_ref_type(const struct 
extent_buffer *eb,
+                       if (type == BTRFS_SHARED_BLOCK_REF_KEY) {
+                               ASSERT(eb->fs_info);
+                               /*
+-                               * Every shared one has parent tree
+-                               * block, which must be aligned to
+-                               * nodesize.
++                               * Every shared one has parent tree block,
++                               * which must be aligned to sector size.
+                                */
+                               if (offset &&
+-                                  IS_ALIGNED(offset, eb->fs_info->nodesize))
++                                  IS_ALIGNED(offset, eb->fs_info->sectorsize))
+                                       return type;
+                       }
+               } else if (is_data == BTRFS_REF_TYPE_DATA) {
+@@ -1184,12 +1183,11 @@ int btrfs_get_extent_inline_ref_type(const struct 
extent_buffer *eb,
+                       if (type == BTRFS_SHARED_DATA_REF_KEY) {
+                               ASSERT(eb->fs_info);
+                               /*
+-                               * Every shared one has parent tree
+-                               * block, which must be aligned to
+-                               * nodesize.
++                               * Every shared one has parent tree block,
++                               * which must be aligned to sector size.
+                                */
+                               if (offset &&
+-                                  IS_ALIGNED(offset, eb->fs_info->nodesize))
++                                  IS_ALIGNED(offset, eb->fs_info->sectorsize))
+                                       return type;
+                       }
+               } else {
+@@ -1199,8 +1197,9 @@ int btrfs_get_extent_inline_ref_type(const struct 
extent_buffer *eb,
+       }
+ 
+       btrfs_print_leaf((struct extent_buffer *)eb);
+-      btrfs_err(eb->fs_info, "eb %llu invalid extent inline ref type %d",
+-                eb->start, type);
++      btrfs_err(eb->fs_info,
++                "eb %llu iref 0x%lx invalid extent inline ref type %d",
++                eb->start, (unsigned long)iref, type);
+       WARN_ON(1);
+ 
+       return BTRFS_REF_TYPE_INVALID;
+diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
+index 7b3e41987d072..73a0fc60e395a 100644
+--- a/fs/btrfs/ioctl.c
++++ b/fs/btrfs/ioctl.c
+@@ -2131,7 +2131,8 @@ static noinline int search_ioctl(struct inode *inode,
+       key.offset = sk->min_offset;
+ 
+       while (1) {
+-              ret = fault_in_pages_writeable(ubuf, *buf_size - sk_offset);
++              ret = fault_in_pages_writeable(ubuf + sk_offset,
++                                             *buf_size - sk_offset);
+               if (ret)
+                       break;
+ 
+diff --git a/fs/btrfs/print-tree.c b/fs/btrfs/print-tree.c
+index 47336d4b19d84..f96eb176166d9 100644
+--- a/fs/btrfs/print-tree.c
++++ b/fs/btrfs/print-tree.c
+@@ -116,9 +116,10 @@ static void print_extent_item(struct extent_buffer *eb, 
int slot, int type)
+                        * offset is supposed to be a tree block which
+                        * must be aligned to nodesize.
+                        */
+-                      if (!IS_ALIGNED(offset, eb->fs_info->nodesize))
+-                              pr_info("\t\t\t(parent %llu is NOT ALIGNED to 
nodesize %llu)\n",
+-                                      offset, (unsigned long 
long)eb->fs_info->nodesize);
++                      if (!IS_ALIGNED(offset, eb->fs_info->sectorsize))
++                              pr_info(
++                      "\t\t\t(parent %llu not aligned to sectorsize %u)\n",
++                                      offset, eb->fs_info->sectorsize);
+                       break;
+               case BTRFS_EXTENT_DATA_REF_KEY:
+                       dref = (struct btrfs_extent_data_ref *)(&iref->offset);
+@@ -133,8 +134,9 @@ static void print_extent_item(struct extent_buffer *eb, 
int slot, int type)
+                        * must be aligned to nodesize.
+                        */
+                       if (!IS_ALIGNED(offset, eb->fs_info->nodesize))
+-                              pr_info("\t\t\t(parent %llu is NOT ALIGNED to 
nodesize %llu)\n",
+-                                   offset, (unsigned long 
long)eb->fs_info->nodesize);
++                              pr_info(
++                      "\t\t\t(parent %llu not aligned to sectorsize %u)\n",
++                                   offset, eb->fs_info->sectorsize);
+                       break;
+               default:
+                       pr_cont("(extent %llu has INVALID ref type %d)\n",
+diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
+index a57f847303fcd..f3cb042a28d5c 100644
+--- a/fs/btrfs/volumes.c
++++ b/fs/btrfs/volumes.c
+@@ -16,6 +16,7 @@
+  * Boston, MA 021110-1307, USA.
+  */
+ #include <linux/sched.h>
++#include <linux/sched/mm.h>
+ #include <linux/bio.h>
+ #include <linux/slab.h>
+ #include <linux/buffer_head.h>
+@@ -6278,8 +6279,17 @@ static struct btrfs_device *add_missing_dev(struct 
btrfs_fs_devices *fs_devices,
+                                           u64 devid, u8 *dev_uuid)
+ {
+       struct btrfs_device *device;
++      unsigned int nofs_flag;
+ 
++      /*
++       * We call this under the chunk_mutex, so we want to use NOFS for this
++       * allocation, however we don't want to change btrfs_alloc_device() to
++       * always do NOFS because we use it in a lot of other GFP_KERNEL safe
++       * places.
++       */
++      nofs_flag = memalloc_nofs_save();
+       device = btrfs_alloc_device(NULL, &devid, dev_uuid);
++      memalloc_nofs_restore(nofs_flag);
+       if (IS_ERR(device))
+               return NULL;
+ 
+diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
+index e7b8e2b35e226..f8006f62c5467 100644
+--- a/fs/f2fs/node.c
++++ b/fs/f2fs/node.c
+@@ -2011,6 +2011,9 @@ static void __build_free_nids(struct f2fs_sb_info *sbi, 
bool sync, bool mount)
+       if (unlikely(nid >= nm_i->max_nid))
+               nid = 0;
+ 
++      if (unlikely(nid % NAT_ENTRY_PER_BLOCK))
++              nid = NAT_BLOCK_OFFSET(nid) * NAT_ENTRY_PER_BLOCK;
++
+       /* Enough entries */
+       if (nm_i->nid_cnt[FREE_NID_LIST] >= NAT_ENTRY_PER_BLOCK)
+               return;
+diff --git a/fs/gfs2/glops.c b/fs/gfs2/glops.c
+index cdd1c5f06f452..f1844af4005b6 100644
+--- a/fs/gfs2/glops.c
++++ b/fs/gfs2/glops.c
+@@ -89,6 +89,8 @@ static void gfs2_ail_empty_gl(struct gfs2_glock *gl)
+       memset(&tr, 0, sizeof(tr));
+       INIT_LIST_HEAD(&tr.tr_buf);
+       INIT_LIST_HEAD(&tr.tr_databuf);
++      INIT_LIST_HEAD(&tr.tr_ail1_list);
++      INIT_LIST_HEAD(&tr.tr_ail2_list);
+       tr.tr_revokes = atomic_read(&gl->gl_ail_count);
+ 
+       if (!tr.tr_revokes)
+diff --git a/fs/gfs2/log.c b/fs/gfs2/log.c
+index f30418911e1bd..b05c0ed36b6fe 100644
+--- a/fs/gfs2/log.c
++++ b/fs/gfs2/log.c
+@@ -734,8 +734,6 @@ void gfs2_log_flush(struct gfs2_sbd *sdp, struct 
gfs2_glock *gl,
+       tr = sdp->sd_log_tr;
+       if (tr) {
+               sdp->sd_log_tr = NULL;
+-              INIT_LIST_HEAD(&tr->tr_ail1_list);
+-              INIT_LIST_HEAD(&tr->tr_ail2_list);
+               tr->tr_first = sdp->sd_log_flush_head;
+               if (unlikely (state == SFS_FROZEN))
+                       gfs2_assert_withdraw(sdp, !tr->tr_num_buf_new && 
!tr->tr_num_databuf_new);
+diff --git a/fs/gfs2/trans.c b/fs/gfs2/trans.c
+index 69e3402a3cc59..3a9abc3aac82c 100644
+--- a/fs/gfs2/trans.c
++++ b/fs/gfs2/trans.c
+@@ -56,6 +56,8 @@ int gfs2_trans_begin(struct gfs2_sbd *sdp, unsigned int 
blocks,
+                                                  sizeof(u64));
+       INIT_LIST_HEAD(&tr->tr_databuf);
+       INIT_LIST_HEAD(&tr->tr_buf);
++      INIT_LIST_HEAD(&tr->tr_ail1_list);
++      INIT_LIST_HEAD(&tr->tr_ail2_list);
+ 
+       sb_start_intwrite(sdp->sd_vfs);
+ 
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index 4cfb84119e017..997b731ee19ab 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -6687,7 +6687,12 @@ int nfs4_lock_delegation_recall(struct file_lock *fl, 
struct nfs4_state *state,
+       err = nfs4_set_lock_state(state, fl);
+       if (err != 0)
+               return err;
+-      err = _nfs4_do_setlk(state, F_SETLK, fl, NFS_LOCK_NEW);
++      do {
++              err = _nfs4_do_setlk(state, F_SETLK, fl, NFS_LOCK_NEW);
++              if (err != -NFS4ERR_DELAY)
++                      break;
++              ssleep(1);
++      } while (err == -NFS4ERR_DELAY);
+       return nfs4_handle_delegation_recall_error(server, state, stateid, fl, 
err);
+ }
+ 
+diff --git a/fs/xfs/libxfs/xfs_attr_leaf.c b/fs/xfs/libxfs/xfs_attr_leaf.c
+index 73a541755d5b7..299d17b088e21 100644
+--- a/fs/xfs/libxfs/xfs_attr_leaf.c
++++ b/fs/xfs/libxfs/xfs_attr_leaf.c
+@@ -520,8 +520,8 @@ xfs_attr_shortform_create(xfs_da_args_t *args)
+               ASSERT(ifp->if_flags & XFS_IFINLINE);
+       }
+       xfs_idata_realloc(dp, sizeof(*hdr), XFS_ATTR_FORK);
+-      hdr = (xfs_attr_sf_hdr_t *)ifp->if_u1.if_data;
+-      hdr->count = 0;
++      hdr = (struct xfs_attr_sf_hdr *)ifp->if_u1.if_data;
++      memset(hdr, 0, sizeof(*hdr));
+       hdr->totsize = cpu_to_be16(sizeof(*hdr));
+       xfs_trans_log_inode(args->trans, dp, XFS_ILOG_CORE | XFS_ILOG_ADATA);
+ }
+diff --git a/include/linux/i2c-algo-pca.h b/include/linux/i2c-algo-pca.h
+index d03071732db4a..7c522fdd9ea73 100644
+--- a/include/linux/i2c-algo-pca.h
++++ b/include/linux/i2c-algo-pca.h
+@@ -53,6 +53,20 @@
+ #define I2C_PCA_CON_SI                0x08 /* Serial Interrupt */
+ #define I2C_PCA_CON_CR                0x07 /* Clock Rate (MASK) */
+ 
++/**
++ * struct pca_i2c_bus_settings - The configured PCA i2c bus settings
++ * @mode: Configured i2c bus mode
++ * @tlow: Configured SCL LOW period
++ * @thi: Configured SCL HIGH period
++ * @clock_freq: The configured clock frequency
++ */
++struct pca_i2c_bus_settings {
++      int mode;
++      int tlow;
++      int thi;
++      int clock_freq;
++};
++
+ struct i2c_algo_pca_data {
+       void                            *data;  /* private low level data */
+       void (*write_byte)              (void *data, int reg, int val);
+@@ -64,6 +78,7 @@ struct i2c_algo_pca_data {
+        * For PCA9665, use the frequency you want here. */
+       unsigned int                    i2c_clock;
+       unsigned int                    chip;
++      struct pca_i2c_bus_settings             bus_settings;
+ };
+ 
+ int i2c_pca_add_bus(struct i2c_adapter *);
+diff --git a/include/soc/nps/common.h b/include/soc/nps/common.h
+index 9b1d43d671a3f..8c18dc6d3fde5 100644
+--- a/include/soc/nps/common.h
++++ b/include/soc/nps/common.h
+@@ -45,6 +45,12 @@
+ #define CTOP_INST_MOV2B_FLIP_R3_B1_B2_INST    0x5B60
+ #define CTOP_INST_MOV2B_FLIP_R3_B1_B2_LIMM    0x00010422
+ 
++#ifndef AUX_IENABLE
++#define AUX_IENABLE                           0x40c
++#endif
++
++#define CTOP_AUX_IACK                         (0xFFFFF800 + 0x088)
++
+ #ifndef __ASSEMBLY__
+ 
+ /* In order to increase compilation test coverage */
+diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
+index efe8873943f66..62f5e47aed160 100644
+--- a/include/uapi/linux/kvm.h
++++ b/include/uapi/linux/kvm.h
+@@ -735,9 +735,10 @@ struct kvm_ppc_resize_hpt {
+ #define KVM_VM_PPC_HV 1
+ #define KVM_VM_PPC_PR 2
+ 
+-/* on MIPS, 0 forces trap & emulate, 1 forces VZ ASE */
+-#define KVM_VM_MIPS_TE                0
++/* on MIPS, 0 indicates auto, 1 forces VZ ASE, 2 forces trap & emulate */
++#define KVM_VM_MIPS_AUTO      0
+ #define KVM_VM_MIPS_VZ                1
++#define KVM_VM_MIPS_TE                2
+ 
+ #define KVM_S390_SIE_PAGE_OFFSET 1
+ 
+diff --git a/kernel/gcov/gcc_4_7.c b/kernel/gcov/gcc_4_7.c
+index ca5e5c0ef8536..5b9e76117ded1 100644
+--- a/kernel/gcov/gcc_4_7.c
++++ b/kernel/gcov/gcc_4_7.c
+@@ -19,7 +19,9 @@
+ #include <linux/vmalloc.h>
+ #include "gcov.h"
+ 
+-#if (__GNUC__ >= 7)
++#if (__GNUC__ >= 10)
++#define GCOV_COUNTERS                 8
++#elif (__GNUC__ >= 7)
+ #define GCOV_COUNTERS                 9
+ #elif (__GNUC__ > 5) || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)
+ #define GCOV_COUNTERS                 10
+diff --git a/mm/percpu.c b/mm/percpu.c
+index 9beb84800d8df..b24d6fe6bd5ea 100644
+--- a/mm/percpu.c
++++ b/mm/percpu.c
+@@ -1099,7 +1099,7 @@ static struct pcpu_chunk * __init 
pcpu_alloc_first_chunk(unsigned long tmp_addr,
+ 
+       /* allocate chunk */
+       chunk = memblock_virt_alloc(sizeof(struct pcpu_chunk) +
+-                                  BITS_TO_LONGS(region_size >> PAGE_SHIFT),
++                                  BITS_TO_LONGS(region_size >> PAGE_SHIFT) * 
sizeof(unsigned long),
+                                   0);
+ 
+       INIT_LIST_HEAD(&chunk->list);
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index 4c0f637bbf8b8..807edf1dbaf8f 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -5447,9 +5447,13 @@ static int pskb_carve_inside_nonlinear(struct sk_buff 
*skb, const u32 off,
+       if (skb_has_frag_list(skb))
+               skb_clone_fraglist(skb);
+ 
+-      if (k == 0) {
+-              /* split line is in frag list */
+-              pskb_carve_frag_list(skb, shinfo, off - pos, gfp_mask);
++      /* split line is in frag list */
++      if (k == 0 && pskb_carve_frag_list(skb, shinfo, off - pos, gfp_mask)) {
++              /* skb_frag_unref() is not needed here as shinfo->nr_frags = 0. 
*/
++              if (skb_has_frag_list(skb))
++                      kfree_skb_list(skb_shinfo(skb)->frag_list);
++              kfree(data);
++              return -ENOMEM;
+       }
+       skb_release_data(skb);
+ 
+diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c
+index da21efac80f4a..7c0b1feb36299 100644
+--- a/net/sunrpc/rpcb_clnt.c
++++ b/net/sunrpc/rpcb_clnt.c
+@@ -981,8 +981,8 @@ static int rpcb_dec_getaddr(struct rpc_rqst *req, struct 
xdr_stream *xdr,
+       p = xdr_inline_decode(xdr, len);
+       if (unlikely(p == NULL))
+               goto out_fail;
+-      dprintk("RPC: %5u RPCB_%s reply: %s\n", req->rq_task->tk_pid,
+-                      req->rq_task->tk_msg.rpc_proc->p_name, (char *)p);
++      dprintk("RPC: %5u RPCB_%s reply: %*pE\n", req->rq_task->tk_pid,
++                      req->rq_task->tk_msg.rpc_proc->p_name, len, (char *)p);
+ 
+       if (rpc_uaddr2sockaddr(req->rq_xprt->xprt_net, (char *)p, len,
+                               sap, sizeof(address)) == 0)
+diff --git a/sound/hda/hdac_device.c b/sound/hda/hdac_device.c
+index 19deb306facb7..4a843eb7cc940 100644
+--- a/sound/hda/hdac_device.c
++++ b/sound/hda/hdac_device.c
+@@ -123,6 +123,8 @@ EXPORT_SYMBOL_GPL(snd_hdac_device_init);
+ void snd_hdac_device_exit(struct hdac_device *codec)
+ {
+       pm_runtime_put_noidle(&codec->dev);
++      /* keep balance of runtime PM child_count in parent device */
++      pm_runtime_set_suspended(&codec->dev);
+       snd_hdac_bus_remove_device(codec->bus, codec);
+       kfree(codec->vendor_name);
+       kfree(codec->chip_name);
+diff --git a/sound/pci/hda/patch_hdmi.c b/sound/pci/hda/patch_hdmi.c
+index cb7047bf844df..75bdcede04e63 100644
+--- a/sound/pci/hda/patch_hdmi.c
++++ b/sound/pci/hda/patch_hdmi.c
+@@ -3399,6 +3399,7 @@ static int tegra_hdmi_build_pcms(struct hda_codec *codec)
+ 
+ static int patch_tegra_hdmi(struct hda_codec *codec)
+ {
++      struct hdmi_spec *spec;
+       int err;
+ 
+       err = patch_generic_hdmi(codec);
+@@ -3406,6 +3407,10 @@ static int patch_tegra_hdmi(struct hda_codec *codec)
+               return err;
+ 
+       codec->patch_ops.build_pcms = tegra_hdmi_build_pcms;
++      spec = codec->spec;
++      spec->chmap.ops.chmap_cea_alloc_validate_get_type =
++              nvhdmi_chmap_cea_alloc_validate_get_type;
++      spec->chmap.ops.chmap_validate = nvhdmi_chmap_validate;
+ 
+       return 0;
+ }
+diff --git a/tools/perf/tests/pmu.c b/tools/perf/tests/pmu.c
+index 7bedf8608fdde..3e183eef6f857 100644
+--- a/tools/perf/tests/pmu.c
++++ b/tools/perf/tests/pmu.c
+@@ -172,6 +172,7 @@ int test__pmu(struct test *test __maybe_unused, int 
subtest __maybe_unused)
+               ret = 0;
+       } while (0);
+ 
++      perf_pmu__del_formats(&formats);
+       test_format_dir_put(format);
+       return ret;
+ }
+diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
+index 2deffc2349324..ca00b4104bc09 100644
+--- a/tools/perf/util/pmu.c
++++ b/tools/perf/util/pmu.c
+@@ -1100,6 +1100,17 @@ void perf_pmu__set_format(unsigned long *bits, long 
from, long to)
+               set_bit(b, bits);
+ }
+ 
++void perf_pmu__del_formats(struct list_head *formats)
++{
++      struct perf_pmu_format *fmt, *tmp;
++
++      list_for_each_entry_safe(fmt, tmp, formats, list) {
++              list_del(&fmt->list);
++              free(fmt->name);
++              free(fmt);
++      }
++}
++
+ static int sub_non_neg(int a, int b)
+ {
+       if (b > a)
+diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h
+index eca99435f4a0b..59ad5de6601a7 100644
+--- a/tools/perf/util/pmu.h
++++ b/tools/perf/util/pmu.h
+@@ -79,6 +79,7 @@ int perf_pmu__new_format(struct list_head *list, char *name,
+                        int config, unsigned long *bits);
+ void perf_pmu__set_format(unsigned long *bits, long from, long to);
+ int perf_pmu__format_parse(char *dir, struct list_head *head);
++void perf_pmu__del_formats(struct list_head *formats);
+ 
+ struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu);
+ 

Reply via email to