commit:     a11a5a2eeaeebb570c0cc202ef0c8afe163870b8
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Wed Jul 28 12:37:07 2021 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed Jul 28 12:37:07 2021 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=a11a5a2e

Linux patch 4.19.199

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

 0000_README               |    4 +
 1198_linux-4.19.199.patch | 4050 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 4054 insertions(+)

diff --git a/0000_README b/0000_README
index c6a0532..f1619e0 100644
--- a/0000_README
+++ b/0000_README
@@ -831,6 +831,10 @@ Patch:  1197_linux-4.19.198.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.19.198
 
+Patch:  1198_linux-4.19.199.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.19.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.19.199.patch b/1198_linux-4.19.199.patch
new file mode 100644
index 0000000..2765242
--- /dev/null
+++ b/1198_linux-4.19.199.patch
@@ -0,0 +1,4050 @@
+diff --git a/Makefile b/Makefile
+index 09688ffc3f004..f3ad63a089a18 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 19
+-SUBLEVEL = 198
++SUBLEVEL = 199
+ EXTRAVERSION =
+ NAME = "People's Front"
+ 
+diff --git a/arch/arm/boot/dts/bcm-cygnus.dtsi 
b/arch/arm/boot/dts/bcm-cygnus.dtsi
+index 887a60c317e9d..56f43a9f603d8 100644
+--- a/arch/arm/boot/dts/bcm-cygnus.dtsi
++++ b/arch/arm/boot/dts/bcm-cygnus.dtsi
+@@ -455,7 +455,7 @@
+                       status = "disabled";
+               };
+ 
+-              nand: nand@18046000 {
++              nand_controller: nand-controller@18046000 {
+                       compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
+                       reg = <0x18046000 0x600>, <0xf8105408 0x600>,
+                             <0x18046f00 0x20>;
+diff --git a/arch/arm/boot/dts/bcm-hr2.dtsi b/arch/arm/boot/dts/bcm-hr2.dtsi
+index dd71ab08136be..30574101471a5 100644
+--- a/arch/arm/boot/dts/bcm-hr2.dtsi
++++ b/arch/arm/boot/dts/bcm-hr2.dtsi
+@@ -179,7 +179,7 @@
+                       status = "disabled";
+               };
+ 
+-              nand: nand@26000 {
++              nand_controller: nand-controller@26000 {
+                       compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
+                       reg = <0x26000 0x600>,
+                             <0x11b408 0x600>,
+diff --git a/arch/arm/boot/dts/bcm-nsp.dtsi b/arch/arm/boot/dts/bcm-nsp.dtsi
+index b395cb195db21..71918d208fb3a 100644
+--- a/arch/arm/boot/dts/bcm-nsp.dtsi
++++ b/arch/arm/boot/dts/bcm-nsp.dtsi
+@@ -259,7 +259,7 @@
+                       dma-coherent;
+               };
+ 
+-              nand: nand@26000 {
++              nand_controller: nand-controller@26000 {
+                       compatible = "brcm,nand-iproc", "brcm,brcmnand-v6.1";
+                       reg = <0x026000 0x600>,
+                             <0x11b408 0x600>,
+diff --git a/arch/arm/boot/dts/bcm63138.dtsi b/arch/arm/boot/dts/bcm63138.dtsi
+index 6df61518776f7..557098f5c8d53 100644
+--- a/arch/arm/boot/dts/bcm63138.dtsi
++++ b/arch/arm/boot/dts/bcm63138.dtsi
+@@ -175,7 +175,7 @@
+                       status = "disabled";
+               };
+ 
+-              nand: nand@2000 {
++              nand_controller: nand-controller@2000 {
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+                       compatible = "brcm,nand-bcm63138", 
"brcm,brcmnand-v7.0", "brcm,brcmnand";
+diff --git a/arch/arm/boot/dts/bcm7445-bcm97445svmb.dts 
b/arch/arm/boot/dts/bcm7445-bcm97445svmb.dts
+index 8006c69a3fdf6..5931c02882839 100644
+--- a/arch/arm/boot/dts/bcm7445-bcm97445svmb.dts
++++ b/arch/arm/boot/dts/bcm7445-bcm97445svmb.dts
+@@ -14,10 +14,10 @@
+       };
+ };
+ 
+-&nand {
++&nand_controller {
+       status = "okay";
+ 
+-      nandcs@1 {
++      nand@1 {
+               compatible = "brcm,nandcs";
+               reg = <1>;
+               nand-ecc-step-size = <512>;
+diff --git a/arch/arm/boot/dts/bcm7445.dtsi b/arch/arm/boot/dts/bcm7445.dtsi
+index c859aa6f358ca..b06845e92acda 100644
+--- a/arch/arm/boot/dts/bcm7445.dtsi
++++ b/arch/arm/boot/dts/bcm7445.dtsi
+@@ -150,7 +150,7 @@
+                       reg-names = "aon-ctrl", "aon-sram";
+               };
+ 
+-              nand: nand@3e2800 {
++              nand_controller: nand-controller@3e2800 {
+                       status = "disabled";
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+diff --git a/arch/arm/boot/dts/bcm911360_entphn.dts 
b/arch/arm/boot/dts/bcm911360_entphn.dts
+index 53f990defd6ae..423a29a46b771 100644
+--- a/arch/arm/boot/dts/bcm911360_entphn.dts
++++ b/arch/arm/boot/dts/bcm911360_entphn.dts
+@@ -84,8 +84,8 @@
+       status = "okay";
+ };
+ 
+-&nand {
+-      nandcs@1 {
++&nand_controller {
++      nand@1 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-on-flash-bbt;
+diff --git a/arch/arm/boot/dts/bcm958300k.dts 
b/arch/arm/boot/dts/bcm958300k.dts
+index b4a1392bd5a6c..dda3e11b711f6 100644
+--- a/arch/arm/boot/dts/bcm958300k.dts
++++ b/arch/arm/boot/dts/bcm958300k.dts
+@@ -60,8 +60,8 @@
+       status = "okay";
+ };
+ 
+-&nand {
+-      nandcs@1 {
++&nand_controller {
++      nand@1 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-on-flash-bbt;
+diff --git a/arch/arm/boot/dts/bcm958305k.dts 
b/arch/arm/boot/dts/bcm958305k.dts
+index 3378683321d3c..ea3c6b88b313b 100644
+--- a/arch/arm/boot/dts/bcm958305k.dts
++++ b/arch/arm/boot/dts/bcm958305k.dts
+@@ -68,8 +68,8 @@
+       status = "okay";
+ };
+ 
+-&nand {
+-      nandcs@1 {
++&nand_controller {
++      nand@1 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-on-flash-bbt;
+diff --git a/arch/arm/boot/dts/bcm958522er.dts 
b/arch/arm/boot/dts/bcm958522er.dts
+index f9dd342cc2ae4..56f9181975b1a 100644
+--- a/arch/arm/boot/dts/bcm958522er.dts
++++ b/arch/arm/boot/dts/bcm958522er.dts
+@@ -74,8 +74,8 @@
+       status = "okay";
+ };
+ 
+-&nand {
+-      nandcs@0 {
++&nand_controller {
++      nand@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-on-flash-bbt;
+diff --git a/arch/arm/boot/dts/bcm958525er.dts 
b/arch/arm/boot/dts/bcm958525er.dts
+index 374508a9cfbfb..93a3e23ec7ae4 100644
+--- a/arch/arm/boot/dts/bcm958525er.dts
++++ b/arch/arm/boot/dts/bcm958525er.dts
+@@ -74,8 +74,8 @@
+       status = "okay";
+ };
+ 
+-&nand {
+-      nandcs@0 {
++&nand_controller {
++      nand@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-on-flash-bbt;
+diff --git a/arch/arm/boot/dts/bcm958525xmc.dts 
b/arch/arm/boot/dts/bcm958525xmc.dts
+index 403250c5ad8e7..fad974212d8af 100644
+--- a/arch/arm/boot/dts/bcm958525xmc.dts
++++ b/arch/arm/boot/dts/bcm958525xmc.dts
+@@ -90,8 +90,8 @@
+       };
+ };
+ 
+-&nand {
+-      nandcs@0 {
++&nand_controller {
++      nand@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-on-flash-bbt;
+diff --git a/arch/arm/boot/dts/bcm958622hr.dts 
b/arch/arm/boot/dts/bcm958622hr.dts
+index ecd05e26c2629..76ff9c50f62ca 100644
+--- a/arch/arm/boot/dts/bcm958622hr.dts
++++ b/arch/arm/boot/dts/bcm958622hr.dts
+@@ -78,8 +78,8 @@
+       status = "okay";
+ };
+ 
+-&nand {
+-      nandcs@0 {
++&nand_controller {
++      nand@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-on-flash-bbt;
+diff --git a/arch/arm/boot/dts/bcm958623hr.dts 
b/arch/arm/boot/dts/bcm958623hr.dts
+index f5e85b301497c..c2c90ea328a19 100644
+--- a/arch/arm/boot/dts/bcm958623hr.dts
++++ b/arch/arm/boot/dts/bcm958623hr.dts
+@@ -78,8 +78,8 @@
+       status = "okay";
+ };
+ 
+-&nand {
+-      nandcs@0 {
++&nand_controller {
++      nand@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-on-flash-bbt;
+diff --git a/arch/arm/boot/dts/bcm958625hr.dts 
b/arch/arm/boot/dts/bcm958625hr.dts
+index ea3fc194f8f37..6d0179acab38f 100644
+--- a/arch/arm/boot/dts/bcm958625hr.dts
++++ b/arch/arm/boot/dts/bcm958625hr.dts
+@@ -76,8 +76,8 @@
+       status = "okay";
+ };
+ 
+-&nand {
+-      nandcs@0 {
++&nand_controller {
++      nand@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-on-flash-bbt;
+diff --git a/arch/arm/boot/dts/bcm958625k.dts 
b/arch/arm/boot/dts/bcm958625k.dts
+index 3ea5f739e90be..579a88ce5b7f5 100644
+--- a/arch/arm/boot/dts/bcm958625k.dts
++++ b/arch/arm/boot/dts/bcm958625k.dts
+@@ -69,8 +69,8 @@
+       status = "okay";
+ };
+ 
+-&nand {
+-      nandcs@0 {
++&nand_controller {
++      nand@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-on-flash-bbt;
+diff --git a/arch/arm/boot/dts/bcm963138dvt.dts 
b/arch/arm/boot/dts/bcm963138dvt.dts
+index c61673638fa8a..5445fccec5a54 100644
+--- a/arch/arm/boot/dts/bcm963138dvt.dts
++++ b/arch/arm/boot/dts/bcm963138dvt.dts
+@@ -30,10 +30,10 @@
+       status = "okay";
+ };
+ 
+-&nand {
++&nand_controller {
+       status = "okay";
+ 
+-      nandcs@0 {
++      nand@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-ecc-strength = <4>;
+diff --git a/arch/arm/boot/dts/bcm988312hr.dts 
b/arch/arm/boot/dts/bcm988312hr.dts
+index ea9a0806b4460..a03224c54bbbb 100644
+--- a/arch/arm/boot/dts/bcm988312hr.dts
++++ b/arch/arm/boot/dts/bcm988312hr.dts
+@@ -78,8 +78,8 @@
+       status = "okay";
+ };
+ 
+-&nand {
+-      nandcs@0 {
++&nand_controller {
++      nand@0 {
+               compatible = "brcm,nandcs";
+               reg = <0>;
+               nand-on-flash-bbt;
+diff --git a/arch/arm/boot/dts/gemini-dlink-dns-313.dts 
b/arch/arm/boot/dts/gemini-dlink-dns-313.dts
+index 361dccd6c7eee..431c705a7b905 100644
+--- a/arch/arm/boot/dts/gemini-dlink-dns-313.dts
++++ b/arch/arm/boot/dts/gemini-dlink-dns-313.dts
+@@ -140,7 +140,7 @@
+               };
+       };
+ 
+-      mdio0: ethernet-phy {
++      mdio0: mdio {
+               compatible = "virtual,mdio-gpio";
+               /* Uses MDC and MDIO */
+               gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
+diff --git a/arch/arm/boot/dts/gemini-nas4220b.dts 
b/arch/arm/boot/dts/gemini-nas4220b.dts
+index 963ea890c87f2..1c5f7f9e7be33 100644
+--- a/arch/arm/boot/dts/gemini-nas4220b.dts
++++ b/arch/arm/boot/dts/gemini-nas4220b.dts
+@@ -62,7 +62,7 @@
+               };
+       };
+ 
+-      mdio0: ethernet-phy {
++      mdio0: mdio {
+               compatible = "virtual,mdio-gpio";
+               gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
+                       <&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */
+diff --git a/arch/arm/boot/dts/gemini-rut1xx.dts 
b/arch/arm/boot/dts/gemini-rut1xx.dts
+index eb4f0bf074da3..c067c3778f1da 100644
+--- a/arch/arm/boot/dts/gemini-rut1xx.dts
++++ b/arch/arm/boot/dts/gemini-rut1xx.dts
+@@ -56,7 +56,7 @@
+               };
+       };
+ 
+-      mdio0: ethernet-phy {
++      mdio0: mdio {
+               compatible = "virtual,mdio-gpio";
+               gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
+                       <&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */
+diff --git a/arch/arm/boot/dts/gemini-wbd111.dts 
b/arch/arm/boot/dts/gemini-wbd111.dts
+index 29af86cd10f7d..52c10ec0dc725 100644
+--- a/arch/arm/boot/dts/gemini-wbd111.dts
++++ b/arch/arm/boot/dts/gemini-wbd111.dts
+@@ -68,7 +68,7 @@
+               };
+       };
+ 
+-      mdio0: ethernet-phy {
++      mdio0: mdio {
+               compatible = "virtual,mdio-gpio";
+               gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
+                       <&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */
+diff --git a/arch/arm/boot/dts/gemini-wbd222.dts 
b/arch/arm/boot/dts/gemini-wbd222.dts
+index 24e6ae3616f71..73de5cfa01f88 100644
+--- a/arch/arm/boot/dts/gemini-wbd222.dts
++++ b/arch/arm/boot/dts/gemini-wbd222.dts
+@@ -67,7 +67,7 @@
+               };
+       };
+ 
+-      mdio0: ethernet-phy {
++      mdio0: mdio {
+               compatible = "virtual,mdio-gpio";
+               gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>, /* MDC */
+                       <&gpio0 21 GPIO_ACTIVE_HIGH>; /* MDIO */
+diff --git a/arch/arm/boot/dts/gemini.dtsi b/arch/arm/boot/dts/gemini.dtsi
+index eb752e9495de1..4949951e35972 100644
+--- a/arch/arm/boot/dts/gemini.dtsi
++++ b/arch/arm/boot/dts/gemini.dtsi
+@@ -286,6 +286,7 @@
+                       clock-names = "PCLK", "PCICLK";
+                       pinctrl-names = "default";
+                       pinctrl-0 = <&pci_default_pins>;
++                      device_type = "pci";
+                       #address-cells = <3>;
+                       #size-cells = <2>;
+                       #interrupt-cells = <1>;
+diff --git a/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi 
b/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi
+index 9499d113b1394..25462f7789949 100644
+--- a/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-phytec-pfla02.dtsi
+@@ -306,8 +306,8 @@
+                       fsl,pins = <
+                               MX6QDL_PAD_EIM_D24__UART3_TX_DATA       0x1b0b1
+                               MX6QDL_PAD_EIM_D25__UART3_RX_DATA       0x1b0b1
+-                              MX6QDL_PAD_EIM_D30__UART3_RTS_B         0x1b0b1
+-                              MX6QDL_PAD_EIM_D31__UART3_CTS_B         0x1b0b1
++                              MX6QDL_PAD_EIM_D31__UART3_RTS_B         0x1b0b1
++                              MX6QDL_PAD_EIM_D30__UART3_CTS_B         0x1b0b1
+                       >;
+               };
+ 
+@@ -394,6 +394,7 @@
+ &uart3 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_uart3>;
++      uart-has-rtscts;
+       status = "disabled";
+ };
+ 
+diff --git a/arch/arm/boot/dts/rk3036-kylin.dts 
b/arch/arm/boot/dts/rk3036-kylin.dts
+index 0fd19f9723dfc..cd109aebb7831 100644
+--- a/arch/arm/boot/dts/rk3036-kylin.dts
++++ b/arch/arm/boot/dts/rk3036-kylin.dts
+@@ -391,7 +391,7 @@
+               };
+       };
+ 
+-      sleep {
++      suspend {
+               global_pwroff: global-pwroff {
+                       rockchip,pins = <2 7 RK_FUNC_1 &pcfg_pull_none>;
+               };
+diff --git a/arch/arm/boot/dts/rk3188.dtsi b/arch/arm/boot/dts/rk3188.dtsi
+index aa123f93f181c..3b7cae6f41275 100644
+--- a/arch/arm/boot/dts/rk3188.dtsi
++++ b/arch/arm/boot/dts/rk3188.dtsi
+@@ -73,16 +73,16 @@
+               compatible = "rockchip,rk3188-timer", "rockchip,rk3288-timer";
+               reg = <0x2000e000 0x20>;
+               interrupts = <GIC_SPI 46 IRQ_TYPE_LEVEL_HIGH>;
+-              clocks = <&cru SCLK_TIMER3>, <&cru PCLK_TIMER3>;
+-              clock-names = "timer", "pclk";
++              clocks = <&cru PCLK_TIMER3>, <&cru SCLK_TIMER3>;
++              clock-names = "pclk", "timer";
+       };
+ 
+       timer6: timer@200380a0 {
+               compatible = "rockchip,rk3188-timer", "rockchip,rk3288-timer";
+               reg = <0x200380a0 0x20>;
+               interrupts = <GIC_SPI 64 IRQ_TYPE_LEVEL_HIGH>;
+-              clocks = <&cru SCLK_TIMER6>, <&cru PCLK_TIMER0>;
+-              clock-names = "timer", "pclk";
++              clocks = <&cru PCLK_TIMER0>, <&cru SCLK_TIMER6>;
++              clock-names = "pclk", "timer";
+       };
+ 
+       i2s0: i2s@1011a000 {
+diff --git a/arch/arm/boot/dts/rk322x.dtsi b/arch/arm/boot/dts/rk322x.dtsi
+index 2aa74267ae51d..3fe874cab38c6 100644
+--- a/arch/arm/boot/dts/rk322x.dtsi
++++ b/arch/arm/boot/dts/rk322x.dtsi
+@@ -548,10 +548,9 @@
+               compatible = "rockchip,iommu";
+               reg = <0x20020800 0x100>;
+               interrupts = <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>;
+-              interrupt-names = "vpu_mmu";
+               clocks = <&cru ACLK_VPU>, <&cru HCLK_VPU>;
+               clock-names = "aclk", "iface";
+-              iommu-cells = <0>;
++              #iommu-cells = <0>;
+               status = "disabled";
+       };
+ 
+@@ -559,10 +558,9 @@
+               compatible = "rockchip,iommu";
+               reg = <0x20030480 0x40>, <0x200304c0 0x40>;
+               interrupts = <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>;
+-              interrupt-names = "vdec_mmu";
+               clocks = <&cru ACLK_RKVDEC>, <&cru HCLK_RKVDEC>;
+               clock-names = "aclk", "iface";
+-              iommu-cells = <0>;
++              #iommu-cells = <0>;
+               status = "disabled";
+       };
+ 
+@@ -570,7 +568,6 @@
+               compatible = "rockchip,iommu";
+               reg = <0x20053f00 0x100>;
+               interrupts = <GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>;
+-              interrupt-names = "vop_mmu";
+               clocks = <&cru ACLK_VOP>, <&cru HCLK_VOP>;
+               clock-names = "aclk", "iface";
+               iommu-cells = <0>;
+@@ -581,10 +578,9 @@
+               compatible = "rockchip,iommu";
+               reg = <0x20070800 0x100>;
+               interrupts = <GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>;
+-              interrupt-names = "iep_mmu";
+               clocks = <&cru ACLK_IEP>, <&cru HCLK_IEP>;
+               clock-names = "aclk", "iface";
+-              iommu-cells = <0>;
++              #iommu-cells = <0>;
+               status = "disabled";
+       };
+ 
+diff --git a/arch/arm/boot/dts/rk3288-rock2-som.dtsi 
b/arch/arm/boot/dts/rk3288-rock2-som.dtsi
+index 32e1ab3366629..8c3fa4749de6a 100644
+--- a/arch/arm/boot/dts/rk3288-rock2-som.dtsi
++++ b/arch/arm/boot/dts/rk3288-rock2-som.dtsi
+@@ -218,7 +218,7 @@
+       flash0-supply = <&vcc_flash>;
+       flash1-supply = <&vccio_pmu>;
+       gpio30-supply = <&vccio_pmu>;
+-      gpio1830 = <&vcc_io>;
++      gpio1830-supply = <&vcc_io>;
+       lcdc-supply = <&vcc_io>;
+       sdcard-supply = <&vccio_sd>;
+       wifi-supply = <&vcc_18>;
+diff --git a/arch/arm/boot/dts/rk3288-vyasa.dts 
b/arch/arm/boot/dts/rk3288-vyasa.dts
+index 4856a9fc0aea9..0be70dc8281c7 100644
+--- a/arch/arm/boot/dts/rk3288-vyasa.dts
++++ b/arch/arm/boot/dts/rk3288-vyasa.dts
+@@ -358,10 +358,10 @@
+       audio-supply = <&vcc_18>;
+       bb-supply = <&vcc_io>;
+       dvp-supply = <&vcc_io>;
+-      flash0-suuply = <&vcc_18>;
++      flash0-supply = <&vcc_18>;
+       flash1-supply = <&vcc_lan>;
+       gpio30-supply = <&vcc_io>;
+-      gpio1830 = <&vcc_io>;
++      gpio1830-supply = <&vcc_io>;
+       lcdc-supply = <&vcc_io>;
+       sdcard-supply = <&vccio_sd>;
+       wifi-supply = <&vcc_18>;
+diff --git a/arch/arm/boot/dts/rk3288.dtsi b/arch/arm/boot/dts/rk3288.dtsi
+index 440d6783faca5..2ff81f3736c85 100644
+--- a/arch/arm/boot/dts/rk3288.dtsi
++++ b/arch/arm/boot/dts/rk3288.dtsi
+@@ -234,8 +234,8 @@
+               compatible = "rockchip,rk3288-timer";
+               reg = <0x0 0xff810000 0x0 0x20>;
+               interrupts = <GIC_SPI 72 IRQ_TYPE_LEVEL_HIGH>;
+-              clocks = <&xin24m>, <&cru PCLK_TIMER>;
+-              clock-names = "timer", "pclk";
++              clocks = <&cru PCLK_TIMER>, <&xin24m>;
++              clock-names = "pclk", "timer";
+       };
+ 
+       display-subsystem {
+@@ -759,7 +759,7 @@
+                        *      *_HDMI          HDMI
+                        *      *_MIPI_*        MIPI
+                        */
+-                      pd_vio@RK3288_PD_VIO {
++                      power-domain@RK3288_PD_VIO {
+                               reg = <RK3288_PD_VIO>;
+                               clocks = <&cru ACLK_IEP>,
+                                        <&cru ACLK_ISP>,
+@@ -801,7 +801,7 @@
+                        * Note: The following 3 are HEVC(H.265) clocks,
+                        * and on the ACLK_HEVC_NIU (NOC).
+                        */
+-                      pd_hevc@RK3288_PD_HEVC {
++                      power-domain@RK3288_PD_HEVC {
+                               reg = <RK3288_PD_HEVC>;
+                               clocks = <&cru ACLK_HEVC>,
+                                        <&cru SCLK_HEVC_CABAC>,
+@@ -815,7 +815,7 @@
+                        * (video endecoder & decoder) clocks that on the
+                        * ACLK_VCODEC_NIU and HCLK_VCODEC_NIU (NOC).
+                        */
+-                      pd_video@RK3288_PD_VIDEO {
++                      power-domain@RK3288_PD_VIDEO {
+                               reg = <RK3288_PD_VIDEO>;
+                               clocks = <&cru ACLK_VCODEC>,
+                                        <&cru HCLK_VCODEC>;
+@@ -826,7 +826,7 @@
+                        * Note: ACLK_GPU is the GPU clock,
+                        * and on the ACLK_GPU_NIU (NOC).
+                        */
+-                      pd_gpu@RK3288_PD_GPU {
++                      power-domain@RK3288_PD_GPU {
+                               reg = <RK3288_PD_GPU>;
+                               clocks = <&cru ACLK_GPU>;
+                               pm_qos = <&qos_gpu_r>,
+@@ -1541,7 +1541,7 @@
+                       drive-strength = <12>;
+               };
+ 
+-              sleep {
++              suspend {
+                       global_pwroff: global-pwroff {
+                               rockchip,pins = <0 0 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+diff --git a/arch/arm/boot/dts/stm32429i-eval.dts 
b/arch/arm/boot/dts/stm32429i-eval.dts
+index 7eb786a2d6247..f5429e4950242 100644
+--- a/arch/arm/boot/dts/stm32429i-eval.dts
++++ b/arch/arm/boot/dts/stm32429i-eval.dts
+@@ -111,17 +111,15 @@
+               };
+       };
+ 
+-      gpio_keys {
++      gpio-keys {
+               compatible = "gpio-keys";
+-              #address-cells = <1>;
+-              #size-cells = <0>;
+               autorepeat;
+-              button@0 {
++              button-0 {
+                       label = "Wake up";
+                       linux,code = <KEY_WAKEUP>;
+                       gpios = <&gpioa 0 0>;
+               };
+-              button@1 {
++              button-1 {
+                       label = "Tamper";
+                       linux,code = <KEY_RESTART>;
+                       gpios = <&gpioc 13 0>;
+diff --git a/arch/arm/boot/dts/stm32746g-eval.dts 
b/arch/arm/boot/dts/stm32746g-eval.dts
+index 8c081eaf20fea..f99b5df4c12f4 100644
+--- a/arch/arm/boot/dts/stm32746g-eval.dts
++++ b/arch/arm/boot/dts/stm32746g-eval.dts
+@@ -73,12 +73,10 @@
+               };
+       };
+ 
+-      gpio_keys {
++      gpio-keys {
+               compatible = "gpio-keys";
+-              #address-cells = <1>;
+-              #size-cells = <0>;
+               autorepeat;
+-              button@0 {
++              button-0 {
+                       label = "Wake up";
+                       linux,code = <KEY_WAKEUP>;
+                       gpios = <&gpioc 13 0>;
+diff --git a/arch/arm/boot/dts/stm32f429-disco.dts 
b/arch/arm/boot/dts/stm32f429-disco.dts
+index 5ceb2cf3777ff..bcf2a5cfd6b24 100644
+--- a/arch/arm/boot/dts/stm32f429-disco.dts
++++ b/arch/arm/boot/dts/stm32f429-disco.dts
+@@ -78,12 +78,10 @@
+               };
+       };
+ 
+-      gpio_keys {
++      gpio-keys {
+               compatible = "gpio-keys";
+-              #address-cells = <1>;
+-              #size-cells = <0>;
+               autorepeat;
+-              button@0 {
++              button-0 {
+                       label = "User";
+                       linux,code = <KEY_HOME>;
+                       gpios = <&gpioa 0 0>;
+diff --git a/arch/arm/boot/dts/stm32f429.dtsi 
b/arch/arm/boot/dts/stm32f429.dtsi
+index e35d782e7e5f2..fdaf432900060 100644
+--- a/arch/arm/boot/dts/stm32f429.dtsi
++++ b/arch/arm/boot/dts/stm32f429.dtsi
+@@ -263,8 +263,6 @@
+               };
+ 
+               timers13: timers@40001c00 {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40001C00 0x400>;
+                       clocks = <&rcc 0 STM32F4_APB1_CLOCK(TIM13)>;
+@@ -278,8 +276,6 @@
+               };
+ 
+               timers14: timers@40002000 {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40002000 0x400>;
+                       clocks = <&rcc 0 STM32F4_APB1_CLOCK(TIM14)>;
+@@ -558,8 +554,6 @@
+               };
+ 
+               timers10: timers@40014400 {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40014400 0x400>;
+                       clocks = <&rcc 0 STM32F4_APB2_CLOCK(TIM10)>;
+@@ -573,8 +567,6 @@
+               };
+ 
+               timers11: timers@40014800 {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40014800 0x400>;
+                       clocks = <&rcc 0 STM32F4_APB2_CLOCK(TIM11)>;
+@@ -609,7 +601,7 @@
+                       status = "disabled";
+               };
+ 
+-              rcc: rcc@40023810 {
++              rcc: rcc@40023800 {
+                       #reset-cells = <1>;
+                       #clock-cells = <2>;
+                       compatible = "st,stm32f42xx-rcc", "st,stm32-rcc";
+diff --git a/arch/arm/boot/dts/stm32f469-disco.dts 
b/arch/arm/boot/dts/stm32f469-disco.dts
+index eea979ef5512f..881210d820bb7 100644
+--- a/arch/arm/boot/dts/stm32f469-disco.dts
++++ b/arch/arm/boot/dts/stm32f469-disco.dts
+@@ -103,12 +103,10 @@
+               };
+       };
+ 
+-      gpio_keys {
++      gpio-keys {
+               compatible = "gpio-keys";
+-              #address-cells = <1>;
+-              #size-cells = <0>;
+               autorepeat;
+-              button@0 {
++              button-0 {
+                       label = "User";
+                       linux,code = <KEY_WAKEUP>;
+                       gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>;
+diff --git a/arch/arm/boot/dts/stm32f746.dtsi 
b/arch/arm/boot/dts/stm32f746.dtsi
+index f48d06a80d1d6..be62d9091e038 100644
+--- a/arch/arm/boot/dts/stm32f746.dtsi
++++ b/arch/arm/boot/dts/stm32f746.dtsi
+@@ -258,8 +258,6 @@
+               };
+ 
+               timers13: timers@40001c00 {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40001C00 0x400>;
+                       clocks = <&rcc 0 STM32F7_APB1_CLOCK(TIM13)>;
+@@ -273,8 +271,6 @@
+               };
+ 
+               timers14: timers@40002000 {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40002000 0x400>;
+                       clocks = <&rcc 0 STM32F7_APB1_CLOCK(TIM14)>;
+@@ -357,9 +353,9 @@
+                       status = "disabled";
+               };
+ 
+-              i2c3: i2c@40005C00 {
++              i2c3: i2c@40005c00 {
+                       compatible = "st,stm32f7-i2c";
+-                      reg = <0x40005C00 0x400>;
++                      reg = <0x40005c00 0x400>;
+                       interrupts = <72>,
+                                    <73>;
+                       resets = <&rcc STM32F7_APB1_RESET(I2C3)>;
+@@ -521,8 +517,6 @@
+               };
+ 
+               timers10: timers@40014400 {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40014400 0x400>;
+                       clocks = <&rcc 0 STM32F7_APB2_CLOCK(TIM10)>;
+@@ -536,8 +530,6 @@
+               };
+ 
+               timers11: timers@40014800 {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+                       compatible = "st,stm32-timers";
+                       reg = <0x40014800 0x400>;
+                       clocks = <&rcc 0 STM32F7_APB2_CLOCK(TIM11)>;
+diff --git a/arch/arm/boot/dts/stm32f769-disco.dts 
b/arch/arm/boot/dts/stm32f769-disco.dts
+index 677276ba4dbe8..80516f44bb19b 100644
+--- a/arch/arm/boot/dts/stm32f769-disco.dts
++++ b/arch/arm/boot/dts/stm32f769-disco.dts
+@@ -74,12 +74,10 @@
+               };
+       };
+ 
+-      gpio_keys {
++      gpio-keys {
+               compatible = "gpio-keys";
+-              #address-cells = <1>;
+-              #size-cells = <0>;
+               autorepeat;
+-              button@0 {
++              button-0 {
+                       label = "User";
+                       linux,code = <KEY_HOME>;
+                       gpios = <&gpioa 0 GPIO_ACTIVE_HIGH>;
+diff --git a/arch/arm/boot/dts/stm32h743.dtsi 
b/arch/arm/boot/dts/stm32h743.dtsi
+index 637beffe50670..729ff6264776c 100644
+--- a/arch/arm/boot/dts/stm32h743.dtsi
++++ b/arch/arm/boot/dts/stm32h743.dtsi
+@@ -422,8 +422,6 @@
+               };
+ 
+               lptimer4: timer@58002c00 {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+                       compatible = "st,stm32-lptimer";
+                       reg = <0x58002c00 0x400>;
+                       clocks = <&rcc LPTIM4_CK>;
+@@ -438,8 +436,6 @@
+               };
+ 
+               lptimer5: timer@58003000 {
+-                      #address-cells = <1>;
+-                      #size-cells = <0>;
+                       compatible = "st,stm32-lptimer";
+                       reg = <0x58003000 0x400>;
+                       clocks = <&rcc LPTIM5_CK>;
+diff --git a/arch/arm/boot/dts/stm32mp157c.dtsi 
b/arch/arm/boot/dts/stm32mp157c.dtsi
+index c50c36baba758..4278a4b228606 100644
+--- a/arch/arm/boot/dts/stm32mp157c.dtsi
++++ b/arch/arm/boot/dts/stm32mp157c.dtsi
+@@ -964,12 +964,6 @@
+                       status = "disabled";
+               };
+ 
+-              stmmac_axi_config_0: stmmac-axi-config {
+-                      snps,wr_osr_lmt = <0x7>;
+-                      snps,rd_osr_lmt = <0x7>;
+-                      snps,blen = <0 0 0 0 16 8 4>;
+-              };
+-
+               ethernet0: ethernet@5800a000 {
+                       compatible = "st,stm32mp1-dwmac", "snps,dwmac-4.20a";
+                       reg = <0x5800a000 0x2000>;
+@@ -992,6 +986,12 @@
+                       snps,axi-config = <&stmmac_axi_config_0>;
+                       snps,tso;
+                       status = "disabled";
++
++                      stmmac_axi_config_0: stmmac-axi-config {
++                              snps,wr_osr_lmt = <0x7>;
++                              snps,rd_osr_lmt = <0x7>;
++                              snps,blen = <0 0 0 0 16 8 4>;
++                      };
+               };
+ 
+               usbh_ohci: usbh-ohci@5800c000 {
+diff --git a/arch/arm/mach-imx/suspend-imx53.S 
b/arch/arm/mach-imx/suspend-imx53.S
+index 5ed078ad110aa..f12d24104075b 100644
+--- a/arch/arm/mach-imx/suspend-imx53.S
++++ b/arch/arm/mach-imx/suspend-imx53.S
+@@ -33,11 +33,11 @@
+  *                              ^
+  *                              ^
+  *                      imx53_suspend code
+- *              PM_INFO structure(imx53_suspend_info)
++ *              PM_INFO structure(imx5_cpu_suspend_info)
+  * ======================== low address =======================
+  */
+ 
+-/* Offsets of members of struct imx53_suspend_info */
++/* Offsets of members of struct imx5_cpu_suspend_info */
+ #define SUSPEND_INFO_MX53_M4IF_V_OFFSET               0x0
+ #define SUSPEND_INFO_MX53_IOMUXC_V_OFFSET     0x4
+ #define SUSPEND_INFO_MX53_IO_COUNT_OFFSET     0x8
+diff --git a/arch/arm64/boot/dts/arm/juno-base.dtsi 
b/arch/arm64/boot/dts/arm/juno-base.dtsi
+index b6f486737589a..331862504dc33 100644
+--- a/arch/arm64/boot/dts/arm/juno-base.dtsi
++++ b/arch/arm64/boot/dts/arm/juno-base.dtsi
+@@ -533,13 +533,13 @@
+               clocks {
+                       compatible = "arm,scpi-clocks";
+ 
+-                      scpi_dvfs: scpi-dvfs {
++                      scpi_dvfs: clocks-0 {
+                               compatible = "arm,scpi-dvfs-clocks";
+                               #clock-cells = <1>;
+                               clock-indices = <0>, <1>, <2>;
+                               clock-output-names = "atlclk", 
"aplclk","gpuclk";
+                       };
+-                      scpi_clk: scpi-clk {
++                      scpi_clk: clocks-1 {
+                               compatible = "arm,scpi-variable-clocks";
+                               #clock-cells = <1>;
+                               clock-indices = <3>;
+@@ -547,7 +547,7 @@
+                       };
+               };
+ 
+-              scpi_devpd: scpi-power-domains {
++              scpi_devpd: power-controller {
+                       compatible = "arm,scpi-power-domains";
+                       num-domains = <2>;
+                       #power-domain-cells = <1>;
+diff --git a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi 
b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
+index ebe0cd4bf2b7e..8c22ce904e655 100644
+--- a/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
++++ b/arch/arm64/boot/dts/freescale/fsl-ls208xa.dtsi
+@@ -479,7 +479,6 @@
+                       clocks = <&clockgen 4 3>;
+                       clock-names = "dspi";
+                       spi-num-chipselects = <5>;
+-                      bus-num = <0>;
+               };
+ 
+               esdhc: esdhc@2140000 {
+diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi 
b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+index 6be7c67584ba9..05fa0dcb4c690 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+@@ -255,13 +255,13 @@
+                       #address-cells = <1>;
+                       #size-cells = <0>;
+ 
+-                      pd_hevc@RK3328_PD_HEVC {
++                      power-domain@RK3328_PD_HEVC {
+                               reg = <RK3328_PD_HEVC>;
+                       };
+-                      pd_video@RK3328_PD_VIDEO {
++                      power-domain@RK3328_PD_VIDEO {
+                               reg = <RK3328_PD_VIDEO>;
+                       };
+-                      pd_vpu@RK3328_PD_VPU {
++                      power-domain@RK3328_PD_VPU {
+                               reg = <RK3328_PD_VPU>;
+                       };
+               };
+diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi 
b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+index b1c1a88a1c20c..f70c053326865 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi
+@@ -2253,7 +2253,7 @@
+                       };
+               };
+ 
+-              sleep {
++              suspend {
+                       ap_pwroff: ap-pwroff {
+                               rockchip,pins = <1 5 RK_FUNC_1 &pcfg_pull_none>;
+                       };
+diff --git a/arch/mips/include/asm/pgalloc.h b/arch/mips/include/asm/pgalloc.h
+index f800872f867b2..39b9f311c4ef4 100644
+--- a/arch/mips/include/asm/pgalloc.h
++++ b/arch/mips/include/asm/pgalloc.h
+@@ -93,15 +93,11 @@ do {                                                       
\
+ 
+ static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long 
address)
+ {
+-      pmd_t *pmd = NULL;
+-      struct page *pg;
++      pmd_t *pmd;
+ 
+-      pg = alloc_pages(GFP_KERNEL | __GFP_ACCOUNT, PMD_ORDER);
+-      if (pg) {
+-              pgtable_pmd_page_ctor(pg);
+-              pmd = (pmd_t *)page_address(pg);
++      pmd = (pmd_t *) __get_free_pages(GFP_KERNEL, PMD_ORDER);
++      if (pmd)
+               pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
+-      }
+       return pmd;
+ }
+ 
+diff --git a/arch/nds32/mm/mmap.c b/arch/nds32/mm/mmap.c
+index c206b31ce07ac..1bdf5e7d1b438 100644
+--- a/arch/nds32/mm/mmap.c
++++ b/arch/nds32/mm/mmap.c
+@@ -59,7 +59,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
+ 
+               vma = find_vma(mm, addr);
+               if (TASK_SIZE - len >= addr &&
+-                  (!vma || addr + len <= vma->vm_start))
++                  (!vma || addr + len <= vm_start_gap(vma)))
+                       return addr;
+       }
+ 
+diff --git a/arch/powerpc/kvm/book3s_rtas.c b/arch/powerpc/kvm/book3s_rtas.c
+index 8f2355138f80b..a56c56aa829c1 100644
+--- a/arch/powerpc/kvm/book3s_rtas.c
++++ b/arch/powerpc/kvm/book3s_rtas.c
+@@ -243,6 +243,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
+        * value so we can restore it on the way out.
+        */
+       orig_rets = args.rets;
++      if (be32_to_cpu(args.nargs) >= ARRAY_SIZE(args.args)) {
++              /*
++               * Don't overflow our args array: ensure there is room for
++               * at least rets[0] (even if the call specifies 0 nret).
++               *
++               * Each handler must then check for the correct nargs and nret
++               * values, but they may always return failure in rets[0].
++               */
++              rc = -EINVAL;
++              goto fail;
++      }
+       args.rets = &args.args[be32_to_cpu(args.nargs)];
+ 
+       mutex_lock(&vcpu->kvm->arch.rtas_token_lock);
+@@ -270,9 +281,17 @@ int kvmppc_rtas_hcall(struct kvm_vcpu *vcpu)
+ fail:
+       /*
+        * We only get here if the guest has called RTAS with a bogus
+-       * args pointer. That means we can't get to the args, and so we
+-       * can't fail the RTAS call. So fail right out to userspace,
+-       * which should kill the guest.
++       * args pointer or nargs/nret values that would overflow the
++       * array. That means we can't get to the args, and so we can't
++       * fail the RTAS call. So fail right out to userspace, which
++       * should kill the guest.
++       *
++       * SLOF should actually pass the hcall return value from the
++       * rtas handler call in r3, so enter_rtas could be modified to
++       * return a failure indication in r3 and we could return such
++       * errors to the guest rather than failing to host userspace.
++       * However old guests that don't test for failure could then
++       * continue silently after errors, so for now we won't do this.
+        */
+       return rc;
+ }
+diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c
+index 7c8354dfe80e2..ad5a871a6cbfd 100644
+--- a/arch/powerpc/kvm/powerpc.c
++++ b/arch/powerpc/kvm/powerpc.c
+@@ -1995,9 +1995,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
+       {
+               struct kvm_enable_cap cap;
+               r = -EFAULT;
+-              vcpu_load(vcpu);
+               if (copy_from_user(&cap, argp, sizeof(cap)))
+                       goto out;
++              vcpu_load(vcpu);
+               r = kvm_vcpu_ioctl_enable_cap(vcpu, &cap);
+               vcpu_put(vcpu);
+               break;
+@@ -2021,9 +2021,9 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
+       case KVM_DIRTY_TLB: {
+               struct kvm_dirty_tlb dirty;
+               r = -EFAULT;
+-              vcpu_load(vcpu);
+               if (copy_from_user(&dirty, argp, sizeof(dirty)))
+                       goto out;
++              vcpu_load(vcpu);
+               r = kvm_vcpu_ioctl_dirty_tlb(vcpu, &dirty);
+               vcpu_put(vcpu);
+               break;
+diff --git a/arch/s390/include/asm/ftrace.h b/arch/s390/include/asm/ftrace.h
+index 8ea270fdc7fb2..ec698fc52afdb 100644
+--- a/arch/s390/include/asm/ftrace.h
++++ b/arch/s390/include/asm/ftrace.h
+@@ -20,6 +20,7 @@ void ftrace_caller(void);
+ 
+ extern char ftrace_graph_caller_end;
+ extern unsigned long ftrace_plt;
++extern void *ftrace_func;
+ 
+ struct dyn_arch_ftrace { };
+ 
+diff --git a/arch/s390/kernel/ftrace.c b/arch/s390/kernel/ftrace.c
+index 39b13d71a8fe6..463b9e927501d 100644
+--- a/arch/s390/kernel/ftrace.c
++++ b/arch/s390/kernel/ftrace.c
+@@ -57,6 +57,7 @@
+  * >  brasl   %r0,ftrace_caller       # offset 0
+  */
+ 
++void *ftrace_func __read_mostly = ftrace_stub;
+ unsigned long ftrace_plt;
+ 
+ static inline void ftrace_generate_orig_insn(struct ftrace_insn *insn)
+@@ -166,6 +167,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long 
addr)
+ 
+ int ftrace_update_ftrace_func(ftrace_func_t func)
+ {
++      ftrace_func = func;
+       return 0;
+ }
+ 
+diff --git a/arch/s390/kernel/mcount.S b/arch/s390/kernel/mcount.S
+index 020f9aac7dc0c..a59e6b2b27618 100644
+--- a/arch/s390/kernel/mcount.S
++++ b/arch/s390/kernel/mcount.S
+@@ -60,13 +60,13 @@ ENTRY(ftrace_caller)
+ #ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
+       aghik   %r2,%r0,-MCOUNT_INSN_SIZE
+       lgrl    %r4,function_trace_op
+-      lgrl    %r1,ftrace_trace_function
++      lgrl    %r1,ftrace_func
+ #else
+       lgr     %r2,%r0
+       aghi    %r2,-MCOUNT_INSN_SIZE
+       larl    %r4,function_trace_op
+       lg      %r4,0(%r4)
+-      larl    %r1,ftrace_trace_function
++      larl    %r1,ftrace_func
+       lg      %r1,0(%r1)
+ #endif
+       lgr     %r3,%r14
+diff --git a/arch/s390/net/bpf_jit_comp.c b/arch/s390/net/bpf_jit_comp.c
+index 2617e426c7926..e42354b15e0bc 100644
+--- a/arch/s390/net/bpf_jit_comp.c
++++ b/arch/s390/net/bpf_jit_comp.c
+@@ -113,7 +113,7 @@ static inline void reg_set_seen(struct bpf_jit *jit, u32 
b1)
+ {
+       u32 r1 = reg2hex[b1];
+ 
+-      if (!jit->seen_reg[r1] && r1 >= 6 && r1 <= 15)
++      if (r1 >= 6 && r1 <= 15 && !jit->seen_reg[r1])
+               jit->seen_reg[r1] = 1;
+ }
+ 
+diff --git a/drivers/dma-buf/sync_file.c b/drivers/dma-buf/sync_file.c
+index 91d620994123e..b0d2563cde5d2 100644
+--- a/drivers/dma-buf/sync_file.c
++++ b/drivers/dma-buf/sync_file.c
+@@ -220,8 +220,8 @@ static struct sync_file *sync_file_merge(const char *name, 
struct sync_file *a,
+                                        struct sync_file *b)
+ {
+       struct sync_file *sync_file;
+-      struct dma_fence **fences, **nfences, **a_fences, **b_fences;
+-      int i, i_a, i_b, num_fences, a_num_fences, b_num_fences;
++      struct dma_fence **fences = NULL, **nfences, **a_fences, **b_fences;
++      int i = 0, i_a, i_b, num_fences, a_num_fences, b_num_fences;
+ 
+       sync_file = sync_file_alloc();
+       if (!sync_file)
+@@ -245,7 +245,7 @@ static struct sync_file *sync_file_merge(const char *name, 
struct sync_file *a,
+        * If a sync_file can only be created with sync_file_merge
+        * and sync_file_create, this is a reasonable assumption.
+        */
+-      for (i = i_a = i_b = 0; i_a < a_num_fences && i_b < b_num_fences; ) {
++      for (i_a = i_b = 0; i_a < a_num_fences && i_b < b_num_fences; ) {
+               struct dma_fence *pt_a = a_fences[i_a];
+               struct dma_fence *pt_b = b_fences[i_b];
+ 
+@@ -286,15 +286,16 @@ static struct sync_file *sync_file_merge(const char 
*name, struct sync_file *a,
+               fences = nfences;
+       }
+ 
+-      if (sync_file_set_fence(sync_file, fences, i) < 0) {
+-              kfree(fences);
++      if (sync_file_set_fence(sync_file, fences, i) < 0)
+               goto err;
+-      }
+ 
+       strlcpy(sync_file->user_name, name, sizeof(sync_file->user_name));
+       return sync_file;
+ 
+ err:
++      while (i)
++              dma_fence_put(fences[--i]);
++      kfree(fences);
+       fput(sync_file->file);
+       return NULL;
+ 
+diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
+index 2449b357f524b..babd7ebabfef8 100644
+--- a/drivers/gpu/drm/drm_ioctl.c
++++ b/drivers/gpu/drm/drm_ioctl.c
+@@ -797,6 +797,9 @@ long drm_ioctl(struct file *filp,
+       if (drm_dev_is_unplugged(dev))
+               return -ENODEV;
+ 
++       if (DRM_IOCTL_TYPE(cmd) != DRM_IOCTL_BASE)
++               return -ENOTTY;
++
+       is_driver_ioctl = nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END;
+ 
+       if (is_driver_ioctl) {
+diff --git a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c 
b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
+index aab6a70ece7f0..06bd039159738 100644
+--- a/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
++++ b/drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
+@@ -454,7 +454,6 @@ static int rpi_touchscreen_remove(struct i2c_client *i2c)
+       drm_panel_remove(&ts->base);
+ 
+       mipi_dsi_device_unregister(ts->dsi);
+-      kfree(ts->dsi);
+ 
+       return 0;
+ }
+diff --git a/drivers/iio/accel/bma180.c b/drivers/iio/accel/bma180.c
+index 4bedf48d662a5..52275dddab3ec 100644
+--- a/drivers/iio/accel/bma180.c
++++ b/drivers/iio/accel/bma180.c
+@@ -50,7 +50,7 @@ struct bma180_part_info {
+ 
+       u8 int_reset_reg, int_reset_mask;
+       u8 sleep_reg, sleep_mask;
+-      u8 bw_reg, bw_mask;
++      u8 bw_reg, bw_mask, bw_offset;
+       u8 scale_reg, scale_mask;
+       u8 power_reg, power_mask, lowpower_val;
+       u8 int_enable_reg, int_enable_mask;
+@@ -106,6 +106,7 @@ struct bma180_part_info {
+ 
+ #define BMA250_RANGE_MASK     GENMASK(3, 0) /* Range of accel values */
+ #define BMA250_BW_MASK                GENMASK(4, 0) /* Accel bandwidth */
++#define BMA250_BW_OFFSET      8
+ #define BMA250_SUSPEND_MASK   BIT(7) /* chip will sleep */
+ #define BMA250_LOWPOWER_MASK  BIT(6)
+ #define BMA250_DATA_INTEN_MASK        BIT(4)
+@@ -243,7 +244,8 @@ static int bma180_set_bw(struct bma180_data *data, int val)
+       for (i = 0; i < data->part_info->num_bw; ++i) {
+               if (data->part_info->bw_table[i] == val) {
+                       ret = bma180_set_bits(data, data->part_info->bw_reg,
+-                              data->part_info->bw_mask, i);
++                              data->part_info->bw_mask,
++                              i + data->part_info->bw_offset);
+                       if (ret) {
+                               dev_err(&data->client->dev,
+                                       "failed to set bandwidth\n");
+@@ -625,32 +627,53 @@ static const struct iio_chan_spec bma250_channels[] = {
+ 
+ static const struct bma180_part_info bma180_part_info[] = {
+       [BMA180] = {
+-              bma180_channels, ARRAY_SIZE(bma180_channels),
+-              bma180_scale_table, ARRAY_SIZE(bma180_scale_table),
+-              bma180_bw_table, ARRAY_SIZE(bma180_bw_table),
+-              BMA180_CTRL_REG0, BMA180_RESET_INT,
+-              BMA180_CTRL_REG0, BMA180_SLEEP,
+-              BMA180_BW_TCS, BMA180_BW,
+-              BMA180_OFFSET_LSB1, BMA180_RANGE,
+-              BMA180_TCO_Z, BMA180_MODE_CONFIG, BMA180_LOW_POWER,
+-              BMA180_CTRL_REG3, BMA180_NEW_DATA_INT,
+-              BMA180_RESET,
+-              bma180_chip_config,
+-              bma180_chip_disable,
++              .channels = bma180_channels,
++              .num_channels = ARRAY_SIZE(bma180_channels),
++              .scale_table = bma180_scale_table,
++              .num_scales = ARRAY_SIZE(bma180_scale_table),
++              .bw_table = bma180_bw_table,
++              .num_bw = ARRAY_SIZE(bma180_bw_table),
++              .int_reset_reg = BMA180_CTRL_REG0,
++              .int_reset_mask = BMA180_RESET_INT,
++              .sleep_reg = BMA180_CTRL_REG0,
++              .sleep_mask = BMA180_SLEEP,
++              .bw_reg = BMA180_BW_TCS,
++              .bw_mask = BMA180_BW,
++              .scale_reg = BMA180_OFFSET_LSB1,
++              .scale_mask = BMA180_RANGE,
++              .power_reg = BMA180_TCO_Z,
++              .power_mask = BMA180_MODE_CONFIG,
++              .lowpower_val = BMA180_LOW_POWER,
++              .int_enable_reg = BMA180_CTRL_REG3,
++              .int_enable_mask = BMA180_NEW_DATA_INT,
++              .softreset_reg = BMA180_RESET,
++              .chip_config = bma180_chip_config,
++              .chip_disable = bma180_chip_disable,
+       },
+       [BMA250] = {
+-              bma250_channels, ARRAY_SIZE(bma250_channels),
+-              bma250_scale_table, ARRAY_SIZE(bma250_scale_table),
+-              bma250_bw_table, ARRAY_SIZE(bma250_bw_table),
+-              BMA250_INT_RESET_REG, BMA250_INT_RESET_MASK,
+-              BMA250_POWER_REG, BMA250_SUSPEND_MASK,
+-              BMA250_BW_REG, BMA250_BW_MASK,
+-              BMA250_RANGE_REG, BMA250_RANGE_MASK,
+-              BMA250_POWER_REG, BMA250_LOWPOWER_MASK, 1,
+-              BMA250_INT_ENABLE_REG, BMA250_DATA_INTEN_MASK,
+-              BMA250_RESET_REG,
+-              bma250_chip_config,
+-              bma250_chip_disable,
++              .channels = bma250_channels,
++              .num_channels = ARRAY_SIZE(bma250_channels),
++              .scale_table = bma250_scale_table,
++              .num_scales = ARRAY_SIZE(bma250_scale_table),
++              .bw_table = bma250_bw_table,
++              .num_bw = ARRAY_SIZE(bma250_bw_table),
++              .int_reset_reg = BMA250_INT_RESET_REG,
++              .int_reset_mask = BMA250_INT_RESET_MASK,
++              .sleep_reg = BMA250_POWER_REG,
++              .sleep_mask = BMA250_SUSPEND_MASK,
++              .bw_reg = BMA250_BW_REG,
++              .bw_mask = BMA250_BW_MASK,
++              .bw_offset = BMA250_BW_OFFSET,
++              .scale_reg = BMA250_RANGE_REG,
++              .scale_mask = BMA250_RANGE_MASK,
++              .power_reg = BMA250_POWER_REG,
++              .power_mask = BMA250_LOWPOWER_MASK,
++              .lowpower_val = 1,
++              .int_enable_reg = BMA250_INT_ENABLE_REG,
++              .int_enable_mask = BMA250_DATA_INTEN_MASK,
++              .softreset_reg = BMA250_RESET_REG,
++              .chip_config = bma250_chip_config,
++              .chip_disable = bma250_chip_disable,
+       },
+ };
+ 
+diff --git a/drivers/md/dm-writecache.c b/drivers/md/dm-writecache.c
+index a1d4166864d03..3ca8627c2f1de 100644
+--- a/drivers/md/dm-writecache.c
++++ b/drivers/md/dm-writecache.c
+@@ -142,6 +142,7 @@ struct dm_writecache {
+       size_t metadata_sectors;
+       size_t n_blocks;
+       uint64_t seq_count;
++      sector_t data_device_sectors;
+       void *block_start;
+       struct wc_entry *entries;
+       unsigned block_size;
+@@ -153,6 +154,7 @@ struct dm_writecache {
+       bool overwrote_committed:1;
+       bool memory_vmapped:1;
+ 
++      bool start_sector_set:1;
+       bool high_wm_percent_set:1;
+       bool low_wm_percent_set:1;
+       bool max_writeback_jobs_set:1;
+@@ -161,6 +163,10 @@ struct dm_writecache {
+       bool writeback_fua_set:1;
+       bool flush_on_suspend:1;
+ 
++      unsigned high_wm_percent_value;
++      unsigned low_wm_percent_value;
++      unsigned autocommit_time_value;
++
+       unsigned writeback_all;
+       struct workqueue_struct *writeback_wq;
+       struct work_struct writeback_work;
+@@ -924,6 +930,8 @@ static void writecache_resume(struct dm_target *ti)
+ 
+       wc_lock(wc);
+ 
++      wc->data_device_sectors = i_size_read(wc->dev->bdev->bd_inode) >> 
SECTOR_SHIFT;
++
+       if (WC_MODE_PMEM(wc)) {
+               persistent_memory_invalidate_cache(wc->memory_map, 
wc->memory_map_size);
+       } else {
+@@ -1494,6 +1502,10 @@ static bool wc_add_block(struct writeback_struct *wb, 
struct wc_entry *e, gfp_t
+       void *address = memory_data(wc, e);
+ 
+       persistent_memory_flush_cache(address, block_size);
++
++      if (unlikely(bio_end_sector(&wb->bio) >= wc->data_device_sectors))
++              return true;
++
+       return bio_add_page(&wb->bio, persistent_memory_page(address),
+                           block_size, persistent_memory_page_offset(address)) 
!= 0;
+ }
+@@ -1566,6 +1578,9 @@ static void __writecache_writeback_pmem(struct 
dm_writecache *wc, struct writeba
+               if (writecache_has_error(wc)) {
+                       bio->bi_status = BLK_STS_IOERR;
+                       bio_endio(&wb->bio);
++              } else if (unlikely(!bio_sectors(&wb->bio))) {
++                      bio->bi_status = BLK_STS_OK;
++                      bio_endio(&wb->bio);
+               } else {
+                       submit_bio(&wb->bio);
+               }
+@@ -1609,6 +1624,14 @@ static void __writecache_writeback_ssd(struct 
dm_writecache *wc, struct writebac
+                       e = f;
+               }
+ 
++              if (unlikely(to.sector + to.count > wc->data_device_sectors)) {
++                      if (to.sector >= wc->data_device_sectors) {
++                              writecache_copy_endio(0, 0, c);
++                              continue;
++                      }
++                      from.count = to.count = wc->data_device_sectors - 
to.sector;
++              }
++
+               dm_kcopyd_copy(wc->dm_kcopyd, &from, 1, &to, 0, 
writecache_copy_endio, c);
+ 
+               __writeback_throttle(wc, wbl);
+@@ -2045,6 +2068,7 @@ static int writecache_ctr(struct dm_target *ti, unsigned 
argc, char **argv)
+                       if (sscanf(string, "%llu%c", &start_sector, &dummy) != 
1)
+                               goto invalid_optional;
+                       wc->start_sector = start_sector;
++                      wc->start_sector_set = true;
+                       if (wc->start_sector != start_sector ||
+                           wc->start_sector >= wc->memory_map_size >> 
SECTOR_SHIFT)
+                               goto invalid_optional;
+@@ -2054,6 +2078,7 @@ static int writecache_ctr(struct dm_target *ti, unsigned 
argc, char **argv)
+                               goto invalid_optional;
+                       if (high_wm_percent < 0 || high_wm_percent > 100)
+                               goto invalid_optional;
++                      wc->high_wm_percent_value = high_wm_percent;
+                       wc->high_wm_percent_set = true;
+               } else if (!strcasecmp(string, "low_watermark") && opt_params 
>= 1) {
+                       string = dm_shift_arg(&as), opt_params--;
+@@ -2061,6 +2086,7 @@ static int writecache_ctr(struct dm_target *ti, unsigned 
argc, char **argv)
+                               goto invalid_optional;
+                       if (low_wm_percent < 0 || low_wm_percent > 100)
+                               goto invalid_optional;
++                      wc->low_wm_percent_value = low_wm_percent;
+                       wc->low_wm_percent_set = true;
+               } else if (!strcasecmp(string, "writeback_jobs") && opt_params 
>= 1) {
+                       string = dm_shift_arg(&as), opt_params--;
+@@ -2080,6 +2106,7 @@ static int writecache_ctr(struct dm_target *ti, unsigned 
argc, char **argv)
+                       if (autocommit_msecs > 3600000)
+                               goto invalid_optional;
+                       wc->autocommit_jiffies = 
msecs_to_jiffies(autocommit_msecs);
++                      wc->autocommit_time_value = autocommit_msecs;
+                       wc->autocommit_time_set = true;
+               } else if (!strcasecmp(string, "fua")) {
+                       if (WC_MODE_PMEM(wc)) {
+@@ -2275,7 +2302,6 @@ static void writecache_status(struct dm_target *ti, 
status_type_t type,
+       struct dm_writecache *wc = ti->private;
+       unsigned extra_args;
+       unsigned sz = 0;
+-      uint64_t x;
+ 
+       switch (type) {
+       case STATUSTYPE_INFO:
+@@ -2287,7 +2313,7 @@ static void writecache_status(struct dm_target *ti, 
status_type_t type,
+               DMEMIT("%c %s %s %u ", WC_MODE_PMEM(wc) ? 'p' : 's',
+                               wc->dev->name, wc->ssd_dev->name, 
wc->block_size);
+               extra_args = 0;
+-              if (wc->start_sector)
++              if (wc->start_sector_set)
+                       extra_args += 2;
+               if (wc->high_wm_percent_set)
+                       extra_args += 2;
+@@ -2303,26 +2329,18 @@ static void writecache_status(struct dm_target *ti, 
status_type_t type,
+                       extra_args++;
+ 
+               DMEMIT("%u", extra_args);
+-              if (wc->start_sector)
++              if (wc->start_sector_set)
+                       DMEMIT(" start_sector %llu", (unsigned long 
long)wc->start_sector);
+-              if (wc->high_wm_percent_set) {
+-                      x = (uint64_t)wc->freelist_high_watermark * 100;
+-                      x += wc->n_blocks / 2;
+-                      do_div(x, (size_t)wc->n_blocks);
+-                      DMEMIT(" high_watermark %u", 100 - (unsigned)x);
+-              }
+-              if (wc->low_wm_percent_set) {
+-                      x = (uint64_t)wc->freelist_low_watermark * 100;
+-                      x += wc->n_blocks / 2;
+-                      do_div(x, (size_t)wc->n_blocks);
+-                      DMEMIT(" low_watermark %u", 100 - (unsigned)x);
+-              }
++              if (wc->high_wm_percent_set)
++                      DMEMIT(" high_watermark %u", wc->high_wm_percent_value);
++              if (wc->low_wm_percent_set)
++                      DMEMIT(" low_watermark %u", wc->low_wm_percent_value);
+               if (wc->max_writeback_jobs_set)
+                       DMEMIT(" writeback_jobs %u", wc->max_writeback_jobs);
+               if (wc->autocommit_blocks_set)
+                       DMEMIT(" autocommit_blocks %u", wc->autocommit_blocks);
+               if (wc->autocommit_time_set)
+-                      DMEMIT(" autocommit_time %u", 
jiffies_to_msecs(wc->autocommit_jiffies));
++                      DMEMIT(" autocommit_time %u", 
wc->autocommit_time_value);
+               if (wc->writeback_fua_set)
+                       DMEMIT(" %sfua", wc->writeback_fua ? "" : "no");
+               break;
+diff --git a/drivers/media/pci/ngene/ngene-core.c 
b/drivers/media/pci/ngene/ngene-core.c
+index 25f16833a4752..aa60559bbbb49 100644
+--- a/drivers/media/pci/ngene/ngene-core.c
++++ b/drivers/media/pci/ngene/ngene-core.c
+@@ -398,7 +398,7 @@ static int ngene_command_config_free_buf(struct ngene 
*dev, u8 *config)
+ 
+       com.cmd.hdr.Opcode = CMD_CONFIGURE_FREE_BUFFER;
+       com.cmd.hdr.Length = 6;
+-      memcpy(&com.cmd.ConfigureBuffers.config, config, 6);
++      memcpy(&com.cmd.ConfigureFreeBuffers.config, config, 6);
+       com.in_len = 6;
+       com.out_len = 0;
+ 
+diff --git a/drivers/media/pci/ngene/ngene.h b/drivers/media/pci/ngene/ngene.h
+index 01d9f1b58fcbd..9728bce1ea1cd 100644
+--- a/drivers/media/pci/ngene/ngene.h
++++ b/drivers/media/pci/ngene/ngene.h
+@@ -419,12 +419,14 @@ enum _BUFFER_CONFIGS {
+ 
+ struct FW_CONFIGURE_FREE_BUFFERS {
+       struct FW_HEADER hdr;
+-      u8   UVI1_BufferLength;
+-      u8   UVI2_BufferLength;
+-      u8   TVO_BufferLength;
+-      u8   AUD1_BufferLength;
+-      u8   AUD2_BufferLength;
+-      u8   TVA_BufferLength;
++      struct {
++              u8   UVI1_BufferLength;
++              u8   UVI2_BufferLength;
++              u8   TVO_BufferLength;
++              u8   AUD1_BufferLength;
++              u8   AUD2_BufferLength;
++              u8   TVA_BufferLength;
++      } __packed config;
+ } __attribute__ ((__packed__));
+ 
+ struct FW_CONFIGURE_UART {
+diff --git a/drivers/net/dsa/mv88e6xxx/chip.c 
b/drivers/net/dsa/mv88e6xxx/chip.c
+index 67c0ad3b80795..1df7aed5ae15d 100644
+--- a/drivers/net/dsa/mv88e6xxx/chip.c
++++ b/drivers/net/dsa/mv88e6xxx/chip.c
+@@ -3051,7 +3051,7 @@ static const struct mv88e6xxx_ops mv88e6141_ops = {
+       .port_link_state = mv88e6352_port_link_state,
+       .port_get_cmode = mv88e6352_port_get_cmode,
+       .stats_snapshot = mv88e6390_g1_stats_snapshot,
+-      .stats_set_histogram = mv88e6095_g1_stats_set_histogram,
++      .stats_set_histogram = mv88e6390_g1_stats_set_histogram,
+       .stats_get_sset_count = mv88e6320_stats_get_sset_count,
+       .stats_get_strings = mv88e6320_stats_get_strings,
+       .stats_get_stats = mv88e6390_stats_get_stats,
+@@ -3672,7 +3672,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops = {
+       .port_link_state = mv88e6352_port_link_state,
+       .port_get_cmode = mv88e6352_port_get_cmode,
+       .stats_snapshot = mv88e6390_g1_stats_snapshot,
+-      .stats_set_histogram = mv88e6095_g1_stats_set_histogram,
++      .stats_set_histogram = mv88e6390_g1_stats_set_histogram,
+       .stats_get_sset_count = mv88e6320_stats_get_sset_count,
+       .stats_get_strings = mv88e6320_stats_get_strings,
+       .stats_get_stats = mv88e6390_stats_get_stats,
+@@ -3682,6 +3682,7 @@ static const struct mv88e6xxx_ops mv88e6341_ops = {
+       .mgmt_rsvd2cpu =  mv88e6390_g1_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
+       .reset = mv88e6352_g1_reset,
++      .rmu_disable = mv88e6390_g1_rmu_disable,
+       .vtu_getnext = mv88e6352_g1_vtu_getnext,
+       .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
+       .serdes_power = mv88e6341_serdes_power,
+@@ -3764,6 +3765,7 @@ static const struct mv88e6xxx_ops mv88e6351_ops = {
+       .mgmt_rsvd2cpu = mv88e6352_g2_mgmt_rsvd2cpu,
+       .pot_clear = mv88e6xxx_g2_pot_clear,
+       .reset = mv88e6352_g1_reset,
++      .rmu_disable = mv88e6390_g1_rmu_disable,
+       .vtu_getnext = mv88e6352_g1_vtu_getnext,
+       .vtu_loadpurge = mv88e6352_g1_vtu_loadpurge,
+       .avb_ops = &mv88e6352_avb_ops,
+diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c 
b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+index 1546a9bd9203c..79e156e2ad6a0 100644
+--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+@@ -1189,7 +1189,8 @@ static void bcmgenet_power_up(struct bcmgenet_priv *priv,
+ 
+       switch (mode) {
+       case GENET_POWER_PASSIVE:
+-              reg &= ~(EXT_PWR_DOWN_DLL | EXT_PWR_DOWN_BIAS);
++              reg &= ~(EXT_PWR_DOWN_DLL | EXT_PWR_DOWN_BIAS |
++                       EXT_ENERGY_DET_MASK);
+               if (GENET_IS_V5(priv)) {
+                       reg &= ~(EXT_PWR_DOWN_PHY_EN |
+                                EXT_PWR_DOWN_PHY_RD |
+@@ -2790,15 +2791,21 @@ static void bcmgenet_set_hw_addr(struct bcmgenet_priv 
*priv,
+ /* Returns a reusable dma control register value */
+ static u32 bcmgenet_dma_disable(struct bcmgenet_priv *priv)
+ {
++      unsigned int i;
+       u32 reg;
+       u32 dma_ctrl;
+ 
+       /* disable DMA */
+       dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN;
++      for (i = 0; i < priv->hw_params->tx_queues; i++)
++              dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
+       reg = bcmgenet_tdma_readl(priv, DMA_CTRL);
+       reg &= ~dma_ctrl;
+       bcmgenet_tdma_writel(priv, reg, DMA_CTRL);
+ 
++      dma_ctrl = 1 << (DESC_INDEX + DMA_RING_BUF_EN_SHIFT) | DMA_EN;
++      for (i = 0; i < priv->hw_params->rx_queues; i++)
++              dma_ctrl |= (1 << (i + DMA_RING_BUF_EN_SHIFT));
+       reg = bcmgenet_rdma_readl(priv, DMA_CTRL);
+       reg &= ~dma_ctrl;
+       bcmgenet_rdma_writel(priv, reg, DMA_CTRL);
+@@ -2902,12 +2909,6 @@ static int bcmgenet_open(struct net_device *dev)
+ 
+       bcmgenet_set_hw_addr(priv, dev->dev_addr);
+ 
+-      if (priv->internal_phy) {
+-              reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
+-              reg |= EXT_ENERGY_DET_MASK;
+-              bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
+-      }
+-
+       /* Disable RX/TX DMA and flush TX queues */
+       dma_ctrl = bcmgenet_dma_disable(priv);
+ 
+@@ -3626,7 +3627,6 @@ static int bcmgenet_resume(struct device *d)
+       struct bcmgenet_priv *priv = netdev_priv(dev);
+       unsigned long dma_ctrl;
+       int ret;
+-      u32 reg;
+ 
+       if (!netif_running(dev))
+               return 0;
+@@ -3658,12 +3658,6 @@ static int bcmgenet_resume(struct device *d)
+ 
+       bcmgenet_set_hw_addr(priv, dev->dev_addr);
+ 
+-      if (priv->internal_phy) {
+-              reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
+-              reg |= EXT_ENERGY_DET_MASK;
+-              bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
+-      }
+-
+       if (priv->wolopts)
+               bcmgenet_power_up(priv, GENET_POWER_WOL_MAGIC);
+ 
+diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c 
b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
+index 57582efa362df..457ee9ff08515 100644
+--- a/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c
+@@ -166,12 +166,6 @@ int bcmgenet_wol_power_down_cfg(struct bcmgenet_priv 
*priv,
+       reg |= CMD_RX_EN;
+       bcmgenet_umac_writel(priv, reg, UMAC_CMD);
+ 
+-      if (priv->hw_params->flags & GENET_HAS_EXT) {
+-              reg = bcmgenet_ext_readl(priv, EXT_EXT_PWR_MGMT);
+-              reg &= ~EXT_ENERGY_DET_MASK;
+-              bcmgenet_ext_writel(priv, reg, EXT_EXT_PWR_MGMT);
+-      }
+-
+       return 0;
+ }
+ 
+diff --git a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c 
b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c
+index 55fe80ca10d39..9e447983d0aa8 100644
+--- a/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c
++++ b/drivers/net/ethernet/cavium/liquidio/cn23xx_pf_device.c
+@@ -420,7 +420,7 @@ static int cn23xx_pf_setup_global_input_regs(struct 
octeon_device *oct)
+        * bits 32:47 indicate the PVF num.
+        */
+       for (q_no = 0; q_no < ern; q_no++) {
+-              reg_val = oct->pcie_port << CN23XX_PKT_INPUT_CTL_MAC_NUM_POS;
++              reg_val = (u64)oct->pcie_port << 
CN23XX_PKT_INPUT_CTL_MAC_NUM_POS;
+ 
+               /* for VF assigned queues. */
+               if (q_no < oct->sriov_info.pf_srn) {
+diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c 
b/drivers/net/ethernet/intel/e1000e/netdev.c
+index 6bbe7afdf30c4..398f5951d11c5 100644
+--- a/drivers/net/ethernet/intel/e1000e/netdev.c
++++ b/drivers/net/ethernet/intel/e1000e/netdev.c
+@@ -7369,6 +7369,7 @@ err_flashmap:
+ err_ioremap:
+       free_netdev(netdev);
+ err_alloc_etherdev:
++      pci_disable_pcie_error_reporting(pdev);
+       pci_release_mem_regions(pdev);
+ err_pci_reg:
+ err_dma:
+diff --git a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c 
b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
+index c859ababeed50..6e888874010e9 100644
+--- a/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
++++ b/drivers/net/ethernet/intel/fm10k/fm10k_pci.c
+@@ -2228,6 +2228,7 @@ err_sw_init:
+ err_ioremap:
+       free_netdev(netdev);
+ err_alloc_netdev:
++      pci_disable_pcie_error_reporting(pdev);
+       pci_release_mem_regions(pdev);
+ err_pci_reg:
+ err_dma:
+diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c 
b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
+index f50c19b833686..ac5709624c7ad 100644
+--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
++++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
+@@ -3735,6 +3735,7 @@ static int i40evf_probe(struct pci_dev *pdev, const 
struct pci_device_id *ent)
+ err_ioremap:
+       free_netdev(netdev);
+ err_alloc_etherdev:
++      pci_disable_pcie_error_reporting(pdev);
+       pci_release_regions(pdev);
+ err_pci_reg:
+ err_dma:
+diff --git a/drivers/net/ethernet/intel/igb/igb_main.c 
b/drivers/net/ethernet/intel/igb/igb_main.c
+index d85eb80d82497..6221dafc76b95 100644
+--- a/drivers/net/ethernet/intel/igb/igb_main.c
++++ b/drivers/net/ethernet/intel/igb/igb_main.c
+@@ -938,6 +938,7 @@ static void igb_configure_msix(struct igb_adapter *adapter)
+  **/
+ static int igb_request_msix(struct igb_adapter *adapter)
+ {
++      unsigned int num_q_vectors = adapter->num_q_vectors;
+       struct net_device *netdev = adapter->netdev;
+       int i, err = 0, vector = 0, free_vector = 0;
+ 
+@@ -946,7 +947,13 @@ static int igb_request_msix(struct igb_adapter *adapter)
+       if (err)
+               goto err_out;
+ 
+-      for (i = 0; i < adapter->num_q_vectors; i++) {
++      if (num_q_vectors > MAX_Q_VECTORS) {
++              num_q_vectors = MAX_Q_VECTORS;
++              dev_warn(&adapter->pdev->dev,
++                       "The number of queue vectors (%d) is higher than max 
allowed (%d)\n",
++                       adapter->num_q_vectors, MAX_Q_VECTORS);
++      }
++      for (i = 0; i < num_q_vectors; i++) {
+               struct igb_q_vector *q_vector = adapter->q_vector[i];
+ 
+               vector++;
+@@ -1685,14 +1692,15 @@ static bool is_any_txtime_enabled(struct igb_adapter 
*adapter)
+  **/
+ static void igb_config_tx_modes(struct igb_adapter *adapter, int queue)
+ {
+-      struct igb_ring *ring = adapter->tx_ring[queue];
+       struct net_device *netdev = adapter->netdev;
+       struct e1000_hw *hw = &adapter->hw;
++      struct igb_ring *ring;
+       u32 tqavcc, tqavctrl;
+       u16 value;
+ 
+       WARN_ON(hw->mac.type != e1000_i210);
+       WARN_ON(queue < 0 || queue > 1);
++      ring = adapter->tx_ring[queue];
+ 
+       /* If any of the Qav features is enabled, configure queues as SR and
+        * with HIGH PRIO. If none is, then configure them with LOW PRIO and
+@@ -3495,6 +3503,7 @@ err_sw_init:
+ err_ioremap:
+       free_netdev(netdev);
+ err_alloc_etherdev:
++      pci_disable_pcie_error_reporting(pdev);
+       pci_release_mem_regions(pdev);
+ err_pci_reg:
+ err_dma:
+@@ -4684,6 +4693,8 @@ static void igb_clean_tx_ring(struct igb_ring *tx_ring)
+                                              DMA_TO_DEVICE);
+               }
+ 
++              tx_buffer->next_to_watch = NULL;
++
+               /* move us one more past the eop_desc for start of next pkt */
+               tx_buffer++;
+               i++;
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+index 8fcd3ffb43e00..ef92438e4e6df 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+@@ -1823,7 +1823,8 @@ static void ixgbe_dma_sync_frag(struct ixgbe_ring 
*rx_ring,
+                               struct sk_buff *skb)
+ {
+       if (ring_uses_build_skb(rx_ring)) {
+-              unsigned long offset = (unsigned long)(skb->data) & ~PAGE_MASK;
++              unsigned long mask = (unsigned long)ixgbe_rx_pg_size(rx_ring) - 
1;
++              unsigned long offset = (unsigned long)(skb->data) & mask;
+ 
+               dma_sync_single_range_for_cpu(rx_ring->dev,
+                                             IXGBE_CB(skb)->dma,
+@@ -10925,6 +10926,7 @@ err_ioremap:
+       disable_dev = !test_and_set_bit(__IXGBE_DISABLED, &adapter->state);
+       free_netdev(netdev);
+ err_alloc_etherdev:
++      pci_disable_pcie_error_reporting(pdev);
+       pci_release_mem_regions(pdev);
+ err_pci_reg:
+ err_dma:
+diff --git a/drivers/net/ethernet/moxa/moxart_ether.c 
b/drivers/net/ethernet/moxa/moxart_ether.c
+index 4db3431b79ac1..e1a3c3fefc31d 100644
+--- a/drivers/net/ethernet/moxa/moxart_ether.c
++++ b/drivers/net/ethernet/moxa/moxart_ether.c
+@@ -538,10 +538,8 @@ static int moxart_mac_probe(struct platform_device *pdev)
+       SET_NETDEV_DEV(ndev, &pdev->dev);
+ 
+       ret = register_netdev(ndev);
+-      if (ret) {
+-              free_netdev(ndev);
++      if (ret)
+               goto init_fail;
+-      }
+ 
+       netdev_dbg(ndev, "%s: IRQ=%d address=%pM\n",
+                  __func__, ndev->irq, ndev->dev_addr);
+diff --git a/drivers/net/ethernet/qualcomm/emac/emac.c 
b/drivers/net/ethernet/qualcomm/emac/emac.c
+index 19673ed929e68..76a9b37c8680f 100644
+--- a/drivers/net/ethernet/qualcomm/emac/emac.c
++++ b/drivers/net/ethernet/qualcomm/emac/emac.c
+@@ -759,12 +759,13 @@ static int emac_remove(struct platform_device *pdev)
+ 
+       put_device(&adpt->phydev->mdio.dev);
+       mdiobus_unregister(adpt->mii_bus);
+-      free_netdev(netdev);
+ 
+       if (adpt->phy.digital)
+               iounmap(adpt->phy.digital);
+       iounmap(adpt->phy.base);
+ 
++      free_netdev(netdev);
++
+       return 0;
+ }
+ 
+diff --git a/drivers/net/ethernet/ti/tlan.c b/drivers/net/ethernet/ti/tlan.c
+index 01f99e5df1456..9f2129623d189 100644
+--- a/drivers/net/ethernet/ti/tlan.c
++++ b/drivers/net/ethernet/ti/tlan.c
+@@ -312,9 +312,8 @@ static void tlan_remove_one(struct pci_dev *pdev)
+       pci_release_regions(pdev);
+ #endif
+ 
+-      free_netdev(dev);
+-
+       cancel_work_sync(&priv->tlan_tqueue);
++      free_netdev(dev);
+ }
+ 
+ static void tlan_start(struct net_device *dev)
+diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
+index 82d87d2e280c2..d7cf3202cdd3b 100644
+--- a/drivers/nvme/host/pci.c
++++ b/drivers/nvme/host/pci.c
+@@ -2273,7 +2273,9 @@ static void nvme_reset_work(struct work_struct *work)
+       int result;
+       enum nvme_ctrl_state new_state = NVME_CTRL_LIVE;
+ 
+-      if (WARN_ON(dev->ctrl.state != NVME_CTRL_RESETTING)) {
++      if (dev->ctrl.state != NVME_CTRL_RESETTING) {
++              dev_warn(dev->ctrl.device, "ctrl state %d is not RESETTING\n",
++                       dev->ctrl.state);
+               result = -ENODEV;
+               goto out;
+       }
+@@ -2605,7 +2607,6 @@ static void nvme_remove(struct pci_dev *pdev)
+       if (!pci_device_is_present(pdev)) {
+               nvme_change_ctrl_state(&dev->ctrl, NVME_CTRL_DEAD);
+               nvme_dev_disable(dev, true);
+-              nvme_dev_remove_admin(dev);
+       }
+ 
+       flush_work(&dev->ctrl.reset_work);
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index bfb22de693eb4..f287a9f919da1 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -5172,7 +5172,8 @@ DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 
0x0422, quirk_no_ext_tags);
+ static void quirk_amd_harvest_no_ats(struct pci_dev *pdev)
+ {
+       if ((pdev->device == 0x7312 && pdev->revision != 0x00) ||
+-          (pdev->device == 0x7340 && pdev->revision != 0xc5))
++          (pdev->device == 0x7340 && pdev->revision != 0xc5) ||
++          (pdev->device == 0x7341 && pdev->revision != 0x00))
+               return;
+ 
+       pci_info(pdev, "disabling ATS\n");
+@@ -5187,6 +5188,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x6900, 
quirk_amd_harvest_no_ats);
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x7312, quirk_amd_harvest_no_ats);
+ /* AMD Navi14 dGPU */
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x7340, quirk_amd_harvest_no_ats);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x7341, quirk_amd_harvest_no_ats);
+ #endif /* CONFIG_PCI_ATS */
+ 
+ /* Freescale PCIe doesn't support MSI in RC mode */
+diff --git a/drivers/reset/reset-ti-syscon.c b/drivers/reset/reset-ti-syscon.c
+index a2635c21db7f8..ecb8873e3a19b 100644
+--- a/drivers/reset/reset-ti-syscon.c
++++ b/drivers/reset/reset-ti-syscon.c
+@@ -58,8 +58,8 @@ struct ti_syscon_reset_data {
+       unsigned int nr_controls;
+ };
+ 
+-#define to_ti_syscon_reset_data(rcdev)        \
+-      container_of(rcdev, struct ti_syscon_reset_data, rcdev)
++#define to_ti_syscon_reset_data(_rcdev)       \
++      container_of(_rcdev, struct ti_syscon_reset_data, rcdev)
+ 
+ /**
+  * ti_syscon_reset_assert() - assert device reset
+diff --git a/drivers/rtc/rtc-max77686.c b/drivers/rtc/rtc-max77686.c
+index 4aff349ae301a..8e09450d11a65 100644
+--- a/drivers/rtc/rtc-max77686.c
++++ b/drivers/rtc/rtc-max77686.c
+@@ -710,8 +710,8 @@ static int max77686_init_rtc_regmap(struct 
max77686_rtc_info *info)
+ 
+ add_rtc_irq:
+       ret = regmap_add_irq_chip(info->rtc_regmap, info->rtc_irq,
+-                                IRQF_TRIGGER_FALLING | IRQF_ONESHOT |
+-                                IRQF_SHARED, 0, info->drv_data->rtc_irq_chip,
++                                IRQF_ONESHOT | IRQF_SHARED,
++                                0, info->drv_data->rtc_irq_chip,
+                                 &info->rtc_irq_data);
+       if (ret < 0) {
+               dev_err(info->dev, "Failed to add RTC irq chip: %d\n", ret);
+diff --git a/drivers/rtc/rtc-mxc_v2.c b/drivers/rtc/rtc-mxc_v2.c
+index 007879a5042dd..45c7366b72862 100644
+--- a/drivers/rtc/rtc-mxc_v2.c
++++ b/drivers/rtc/rtc-mxc_v2.c
+@@ -395,6 +395,7 @@ static const struct of_device_id mxc_ids[] = {
+       { .compatible = "fsl,imx53-rtc", },
+       {}
+ };
++MODULE_DEVICE_TABLE(of, mxc_ids);
+ 
+ static struct platform_driver mxc_rtc_driver = {
+       .driver = {
+diff --git a/drivers/scsi/aic7xxx/aic7xxx_core.c 
b/drivers/scsi/aic7xxx/aic7xxx_core.c
+index 49e02e8745533..fe15746af520a 100644
+--- a/drivers/scsi/aic7xxx/aic7xxx_core.c
++++ b/drivers/scsi/aic7xxx/aic7xxx_core.c
+@@ -500,7 +500,7 @@ ahc_inq(struct ahc_softc *ahc, u_int port)
+       return ((ahc_inb(ahc, port))
+             | (ahc_inb(ahc, port+1) << 8)
+             | (ahc_inb(ahc, port+2) << 16)
+-            | (ahc_inb(ahc, port+3) << 24)
++            | (((uint64_t)ahc_inb(ahc, port+3)) << 24)
+             | (((uint64_t)ahc_inb(ahc, port+4)) << 32)
+             | (((uint64_t)ahc_inb(ahc, port+5)) << 40)
+             | (((uint64_t)ahc_inb(ahc, port+6)) << 48)
+diff --git a/drivers/scsi/aic94xx/aic94xx_init.c 
b/drivers/scsi/aic94xx/aic94xx_init.c
+index 702da909cee5e..ad8a65ab489cf 100644
+--- a/drivers/scsi/aic94xx/aic94xx_init.c
++++ b/drivers/scsi/aic94xx/aic94xx_init.c
+@@ -71,6 +71,7 @@ static struct scsi_host_template aic94xx_sht = {
+       .use_clustering         = ENABLE_CLUSTERING,
+       .eh_device_reset_handler        = sas_eh_device_reset_handler,
+       .eh_target_reset_handler        = sas_eh_target_reset_handler,
++      .slave_alloc            = sas_slave_alloc,
+       .target_destroy         = sas_target_destroy,
+       .ioctl                  = sas_ioctl,
+       .track_queue_depth      = 1,
+diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c 
b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
+index 8aa3222fe4865..fea26edd505e1 100644
+--- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
++++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
+@@ -1814,6 +1814,7 @@ static struct scsi_host_template sht_v1_hw = {
+       .use_clustering         = ENABLE_CLUSTERING,
+       .eh_device_reset_handler = sas_eh_device_reset_handler,
+       .eh_target_reset_handler = sas_eh_target_reset_handler,
++      .slave_alloc            = sas_slave_alloc,
+       .target_destroy         = sas_target_destroy,
+       .ioctl                  = sas_ioctl,
+       .shost_attrs            = host_attrs,
+diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c 
b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+index ebc984ffe6a22..7be9431976041 100644
+--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
++++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+@@ -3565,6 +3565,7 @@ static struct scsi_host_template sht_v2_hw = {
+       .use_clustering         = ENABLE_CLUSTERING,
+       .eh_device_reset_handler = sas_eh_device_reset_handler,
+       .eh_target_reset_handler = sas_eh_target_reset_handler,
++      .slave_alloc            = sas_slave_alloc,
+       .target_destroy         = sas_target_destroy,
+       .ioctl                  = sas_ioctl,
+       .shost_attrs            = host_attrs,
+diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c 
b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+index ce2f232b3df38..16b7ea5561186 100644
+--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
++++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+@@ -2115,6 +2115,7 @@ static struct scsi_host_template sht_v3_hw = {
+       .use_clustering         = ENABLE_CLUSTERING,
+       .eh_device_reset_handler = sas_eh_device_reset_handler,
+       .eh_target_reset_handler = sas_eh_target_reset_handler,
++      .slave_alloc            = sas_slave_alloc,
+       .target_destroy         = sas_target_destroy,
+       .ioctl                  = sas_ioctl,
+       .shost_attrs            = host_attrs,
+diff --git a/drivers/scsi/isci/init.c b/drivers/scsi/isci/init.c
+index dde84f7443136..07de94ea38192 100644
+--- a/drivers/scsi/isci/init.c
++++ b/drivers/scsi/isci/init.c
+@@ -167,6 +167,7 @@ static struct scsi_host_template isci_sht = {
+       .eh_abort_handler               = sas_eh_abort_handler,
+       .eh_device_reset_handler        = sas_eh_device_reset_handler,
+       .eh_target_reset_handler        = sas_eh_target_reset_handler,
++      .slave_alloc                    = sas_slave_alloc,
+       .target_destroy                 = sas_target_destroy,
+       .ioctl                          = sas_ioctl,
+       .shost_attrs                    = isci_host_attrs,
+diff --git a/drivers/scsi/libfc/fc_rport.c b/drivers/scsi/libfc/fc_rport.c
+index 2b3239765c249..afe79d4415e85 100644
+--- a/drivers/scsi/libfc/fc_rport.c
++++ b/drivers/scsi/libfc/fc_rport.c
+@@ -1169,6 +1169,7 @@ static void fc_rport_prli_resp(struct fc_seq *sp, struct 
fc_frame *fp,
+               resp_code = (pp->spp.spp_flags & FC_SPP_RESP_MASK);
+               FC_RPORT_DBG(rdata, "PRLI spp_flags = 0x%x spp_type 0x%x\n",
+                            pp->spp.spp_flags, pp->spp.spp_type);
++
+               rdata->spp_type = pp->spp.spp_type;
+               if (resp_code != FC_SPP_RESP_ACK) {
+                       if (resp_code == FC_SPP_RESP_CONF)
+@@ -1189,11 +1190,13 @@ static void fc_rport_prli_resp(struct fc_seq *sp, 
struct fc_frame *fp,
+               /*
+                * Call prli provider if we should act as a target
+                */
+-              prov = fc_passive_prov[rdata->spp_type];
+-              if (prov) {
+-                      memset(&temp_spp, 0, sizeof(temp_spp));
+-                      prov->prli(rdata, pp->prli.prli_spp_len,
+-                                 &pp->spp, &temp_spp);
++              if (rdata->spp_type < FC_FC4_PROV_SIZE) {
++                      prov = fc_passive_prov[rdata->spp_type];
++                      if (prov) {
++                              memset(&temp_spp, 0, sizeof(temp_spp));
++                              prov->prli(rdata, pp->prli.prli_spp_len,
++                                         &pp->spp, &temp_spp);
++                      }
+               }
+               /*
+                * Check if the image pair could be established
+diff --git a/drivers/scsi/libsas/sas_scsi_host.c 
b/drivers/scsi/libsas/sas_scsi_host.c
+index 33229348dcb6a..316a111835553 100644
+--- a/drivers/scsi/libsas/sas_scsi_host.c
++++ b/drivers/scsi/libsas/sas_scsi_host.c
+@@ -942,6 +942,14 @@ void sas_task_abort(struct sas_task *task)
+       }
+ }
+ 
++int sas_slave_alloc(struct scsi_device *sdev)
++{
++      if (dev_is_sata(sdev_to_domain_dev(sdev)) && sdev->lun)
++              return -ENXIO;
++
++      return 0;
++}
++
+ void sas_target_destroy(struct scsi_target *starget)
+ {
+       struct domain_device *found_dev = starget->hostdata;
+@@ -988,5 +996,6 @@ EXPORT_SYMBOL_GPL(sas_task_abort);
+ EXPORT_SYMBOL_GPL(sas_phy_reset);
+ EXPORT_SYMBOL_GPL(sas_eh_device_reset_handler);
+ EXPORT_SYMBOL_GPL(sas_eh_target_reset_handler);
++EXPORT_SYMBOL_GPL(sas_slave_alloc);
+ EXPORT_SYMBOL_GPL(sas_target_destroy);
+ EXPORT_SYMBOL_GPL(sas_ioctl);
+diff --git a/drivers/scsi/mvsas/mv_init.c b/drivers/scsi/mvsas/mv_init.c
+index 8c91637cd598d..98d6608068abd 100644
+--- a/drivers/scsi/mvsas/mv_init.c
++++ b/drivers/scsi/mvsas/mv_init.c
+@@ -62,6 +62,7 @@ static struct scsi_host_template mvs_sht = {
+       .use_clustering         = ENABLE_CLUSTERING,
+       .eh_device_reset_handler = sas_eh_device_reset_handler,
+       .eh_target_reset_handler = sas_eh_target_reset_handler,
++      .slave_alloc            = sas_slave_alloc,
+       .target_destroy         = sas_target_destroy,
+       .ioctl                  = sas_ioctl,
+       .shost_attrs            = mvst_host_attrs,
+diff --git a/drivers/scsi/pm8001/pm8001_init.c 
b/drivers/scsi/pm8001/pm8001_init.c
+index 1d59d7447a1c8..9547cf516d394 100644
+--- a/drivers/scsi/pm8001/pm8001_init.c
++++ b/drivers/scsi/pm8001/pm8001_init.c
+@@ -87,6 +87,7 @@ static struct scsi_host_template pm8001_sht = {
+       .use_clustering         = ENABLE_CLUSTERING,
+       .eh_device_reset_handler = sas_eh_device_reset_handler,
+       .eh_target_reset_handler = sas_eh_target_reset_handler,
++      .slave_alloc            = sas_slave_alloc,
+       .target_destroy         = sas_target_destroy,
+       .ioctl                  = sas_ioctl,
+       .shost_attrs            = pm8001_host_attrs,
+diff --git a/drivers/scsi/scsi_transport_iscsi.c 
b/drivers/scsi/scsi_transport_iscsi.c
+index 2aaa5a2bd6135..20e69052161e6 100644
+--- a/drivers/scsi/scsi_transport_iscsi.c
++++ b/drivers/scsi/scsi_transport_iscsi.c
+@@ -427,39 +427,10 @@ static umode_t iscsi_iface_attr_is_visible(struct 
kobject *kobj,
+       struct device *dev = container_of(kobj, struct device, kobj);
+       struct iscsi_iface *iface = iscsi_dev_to_iface(dev);
+       struct iscsi_transport *t = iface->transport;
+-      int param;
+-      int param_type;
++      int param = -1;
+ 
+       if (attr == &dev_attr_iface_enabled.attr)
+               param = ISCSI_NET_PARAM_IFACE_ENABLE;
+-      else if (attr == &dev_attr_iface_vlan_id.attr)
+-              param = ISCSI_NET_PARAM_VLAN_ID;
+-      else if (attr == &dev_attr_iface_vlan_priority.attr)
+-              param = ISCSI_NET_PARAM_VLAN_PRIORITY;
+-      else if (attr == &dev_attr_iface_vlan_enabled.attr)
+-              param = ISCSI_NET_PARAM_VLAN_ENABLED;
+-      else if (attr == &dev_attr_iface_mtu.attr)
+-              param = ISCSI_NET_PARAM_MTU;
+-      else if (attr == &dev_attr_iface_port.attr)
+-              param = ISCSI_NET_PARAM_PORT;
+-      else if (attr == &dev_attr_iface_ipaddress_state.attr)
+-              param = ISCSI_NET_PARAM_IPADDR_STATE;
+-      else if (attr == &dev_attr_iface_delayed_ack_en.attr)
+-              param = ISCSI_NET_PARAM_DELAYED_ACK_EN;
+-      else if (attr == &dev_attr_iface_tcp_nagle_disable.attr)
+-              param = ISCSI_NET_PARAM_TCP_NAGLE_DISABLE;
+-      else if (attr == &dev_attr_iface_tcp_wsf_disable.attr)
+-              param = ISCSI_NET_PARAM_TCP_WSF_DISABLE;
+-      else if (attr == &dev_attr_iface_tcp_wsf.attr)
+-              param = ISCSI_NET_PARAM_TCP_WSF;
+-      else if (attr == &dev_attr_iface_tcp_timer_scale.attr)
+-              param = ISCSI_NET_PARAM_TCP_TIMER_SCALE;
+-      else if (attr == &dev_attr_iface_tcp_timestamp_en.attr)
+-              param = ISCSI_NET_PARAM_TCP_TIMESTAMP_EN;
+-      else if (attr == &dev_attr_iface_cache_id.attr)
+-              param = ISCSI_NET_PARAM_CACHE_ID;
+-      else if (attr == &dev_attr_iface_redirect_en.attr)
+-              param = ISCSI_NET_PARAM_REDIRECT_EN;
+       else if (attr == &dev_attr_iface_def_taskmgmt_tmo.attr)
+               param = ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO;
+       else if (attr == &dev_attr_iface_header_digest.attr)
+@@ -496,6 +467,38 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject 
*kobj,
+               param = ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN;
+       else if (attr == &dev_attr_iface_initiator_name.attr)
+               param = ISCSI_IFACE_PARAM_INITIATOR_NAME;
++
++      if (param != -1)
++              return t->attr_is_visible(ISCSI_IFACE_PARAM, param);
++
++      if (attr == &dev_attr_iface_vlan_id.attr)
++              param = ISCSI_NET_PARAM_VLAN_ID;
++      else if (attr == &dev_attr_iface_vlan_priority.attr)
++              param = ISCSI_NET_PARAM_VLAN_PRIORITY;
++      else if (attr == &dev_attr_iface_vlan_enabled.attr)
++              param = ISCSI_NET_PARAM_VLAN_ENABLED;
++      else if (attr == &dev_attr_iface_mtu.attr)
++              param = ISCSI_NET_PARAM_MTU;
++      else if (attr == &dev_attr_iface_port.attr)
++              param = ISCSI_NET_PARAM_PORT;
++      else if (attr == &dev_attr_iface_ipaddress_state.attr)
++              param = ISCSI_NET_PARAM_IPADDR_STATE;
++      else if (attr == &dev_attr_iface_delayed_ack_en.attr)
++              param = ISCSI_NET_PARAM_DELAYED_ACK_EN;
++      else if (attr == &dev_attr_iface_tcp_nagle_disable.attr)
++              param = ISCSI_NET_PARAM_TCP_NAGLE_DISABLE;
++      else if (attr == &dev_attr_iface_tcp_wsf_disable.attr)
++              param = ISCSI_NET_PARAM_TCP_WSF_DISABLE;
++      else if (attr == &dev_attr_iface_tcp_wsf.attr)
++              param = ISCSI_NET_PARAM_TCP_WSF;
++      else if (attr == &dev_attr_iface_tcp_timer_scale.attr)
++              param = ISCSI_NET_PARAM_TCP_TIMER_SCALE;
++      else if (attr == &dev_attr_iface_tcp_timestamp_en.attr)
++              param = ISCSI_NET_PARAM_TCP_TIMESTAMP_EN;
++      else if (attr == &dev_attr_iface_cache_id.attr)
++              param = ISCSI_NET_PARAM_CACHE_ID;
++      else if (attr == &dev_attr_iface_redirect_en.attr)
++              param = ISCSI_NET_PARAM_REDIRECT_EN;
+       else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4) {
+               if (attr == &dev_attr_ipv4_iface_ipaddress.attr)
+                       param = ISCSI_NET_PARAM_IPV4_ADDR;
+@@ -586,32 +589,7 @@ static umode_t iscsi_iface_attr_is_visible(struct kobject 
*kobj,
+               return 0;
+       }
+ 
+-      switch (param) {
+-      case ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO:
+-      case ISCSI_IFACE_PARAM_HDRDGST_EN:
+-      case ISCSI_IFACE_PARAM_DATADGST_EN:
+-      case ISCSI_IFACE_PARAM_IMM_DATA_EN:
+-      case ISCSI_IFACE_PARAM_INITIAL_R2T_EN:
+-      case ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN:
+-      case ISCSI_IFACE_PARAM_PDU_INORDER_EN:
+-      case ISCSI_IFACE_PARAM_ERL:
+-      case ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH:
+-      case ISCSI_IFACE_PARAM_FIRST_BURST:
+-      case ISCSI_IFACE_PARAM_MAX_R2T:
+-      case ISCSI_IFACE_PARAM_MAX_BURST:
+-      case ISCSI_IFACE_PARAM_CHAP_AUTH_EN:
+-      case ISCSI_IFACE_PARAM_BIDI_CHAP_EN:
+-      case ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL:
+-      case ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN:
+-      case ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN:
+-      case ISCSI_IFACE_PARAM_INITIATOR_NAME:
+-              param_type = ISCSI_IFACE_PARAM;
+-              break;
+-      default:
+-              param_type = ISCSI_NET_PARAM;
+-      }
+-
+-      return t->attr_is_visible(param_type, param);
++      return t->attr_is_visible(ISCSI_NET_PARAM, param);
+ }
+ 
+ static struct attribute *iscsi_iface_attrs[] = {
+diff --git a/drivers/soc/tegra/fuse/fuse-tegra30.c 
b/drivers/soc/tegra/fuse/fuse-tegra30.c
+index 0ec6385eb15e6..7c47a0cebf3bb 100644
+--- a/drivers/soc/tegra/fuse/fuse-tegra30.c
++++ b/drivers/soc/tegra/fuse/fuse-tegra30.c
+@@ -48,7 +48,8 @@
+     defined(CONFIG_ARCH_TEGRA_132_SOC) || \
+     defined(CONFIG_ARCH_TEGRA_210_SOC) || \
+     defined(CONFIG_ARCH_TEGRA_186_SOC) || \
+-    defined(CONFIG_ARCH_TEGRA_194_SOC)
++    defined(CONFIG_ARCH_TEGRA_194_SOC) || \
++    defined(CONFIG_ARCH_TEGRA_234_SOC)
+ static u32 tegra30_fuse_read_early(struct tegra_fuse *fuse, unsigned int 
offset)
+ {
+       if (WARN_ON(!fuse->base))
+diff --git a/drivers/spi/spi-cadence.c b/drivers/spi/spi-cadence.c
+index f5055ceb7529d..91f83683c15ad 100644
+--- a/drivers/spi/spi-cadence.c
++++ b/drivers/spi/spi-cadence.c
+@@ -585,6 +585,12 @@ static int cdns_spi_probe(struct platform_device *pdev)
+               goto clk_dis_apb;
+       }
+ 
++      pm_runtime_use_autosuspend(&pdev->dev);
++      pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
++      pm_runtime_get_noresume(&pdev->dev);
++      pm_runtime_set_active(&pdev->dev);
++      pm_runtime_enable(&pdev->dev);
++
+       ret = of_property_read_u32(pdev->dev.of_node, "num-cs", &num_cs);
+       if (ret < 0)
+               master->num_chipselect = CDNS_SPI_DEFAULT_NUM_CS;
+@@ -599,11 +605,6 @@ static int cdns_spi_probe(struct platform_device *pdev)
+       /* SPI controller initializations */
+       cdns_spi_init_hw(xspi);
+ 
+-      pm_runtime_set_active(&pdev->dev);
+-      pm_runtime_enable(&pdev->dev);
+-      pm_runtime_use_autosuspend(&pdev->dev);
+-      pm_runtime_set_autosuspend_delay(&pdev->dev, SPI_AUTOSUSPEND_TIMEOUT);
+-
+       irq = platform_get_irq(pdev, 0);
+       if (irq <= 0) {
+               ret = -ENXIO;
+@@ -636,6 +637,9 @@ static int cdns_spi_probe(struct platform_device *pdev)
+ 
+       master->bits_per_word_mask = SPI_BPW_MASK(8);
+ 
++      pm_runtime_mark_last_busy(&pdev->dev);
++      pm_runtime_put_autosuspend(&pdev->dev);
++
+       ret = spi_register_master(master);
+       if (ret) {
+               dev_err(&pdev->dev, "spi_register_master failed\n");
+diff --git a/drivers/spi/spi-fsl-dspi.c b/drivers/spi/spi-fsl-dspi.c
+index 1b003dba86f9f..25486ee8379b6 100644
+--- a/drivers/spi/spi-fsl-dspi.c
++++ b/drivers/spi/spi-fsl-dspi.c
+@@ -1124,11 +1124,13 @@ static int dspi_probe(struct platform_device *pdev)
+       ret = spi_register_master(master);
+       if (ret != 0) {
+               dev_err(&pdev->dev, "Problem registering DSPI master\n");
+-              goto out_free_irq;
++              goto out_release_dma;
+       }
+ 
+       return ret;
+ 
++out_release_dma:
++      dspi_release_dma(dspi);
+ out_free_irq:
+       if (dspi->irq)
+               free_irq(dspi->irq, dspi);
+diff --git a/drivers/spi/spi-mt65xx.c b/drivers/spi/spi-mt65xx.c
+index da28c52c9da19..e2b171057b3b3 100644
+--- a/drivers/spi/spi-mt65xx.c
++++ b/drivers/spi/spi-mt65xx.c
+@@ -392,13 +392,23 @@ static int mtk_spi_fifo_transfer(struct spi_master 
*master,
+       mtk_spi_setup_packet(master);
+ 
+       cnt = xfer->len / 4;
+-      iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt);
++      if (xfer->tx_buf)
++              iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt);
++
++      if (xfer->rx_buf)
++              ioread32_rep(mdata->base + SPI_RX_DATA_REG, xfer->rx_buf, cnt);
+ 
+       remainder = xfer->len % 4;
+       if (remainder > 0) {
+               reg_val = 0;
+-              memcpy(&reg_val, xfer->tx_buf + (cnt * 4), remainder);
+-              writel(reg_val, mdata->base + SPI_TX_DATA_REG);
++              if (xfer->tx_buf) {
++                      memcpy(&reg_val, xfer->tx_buf + (cnt * 4), remainder);
++                      writel(reg_val, mdata->base + SPI_TX_DATA_REG);
++              }
++              if (xfer->rx_buf) {
++                      reg_val = readl(mdata->base + SPI_RX_DATA_REG);
++                      memcpy(xfer->rx_buf + (cnt * 4), &reg_val, remainder);
++              }
+       }
+ 
+       mtk_spi_enable_transfer(master);
+diff --git a/drivers/target/target_core_sbc.c 
b/drivers/target/target_core_sbc.c
+index ebac2b49b9c6e..af9b038da3ba6 100644
+--- a/drivers/target/target_core_sbc.c
++++ b/drivers/target/target_core_sbc.c
+@@ -38,7 +38,7 @@
+ #include "target_core_alua.h"
+ 
+ static sense_reason_t
+-sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char *, u32, 
bool);
++sbc_check_prot(struct se_device *, struct se_cmd *, unsigned char, u32, bool);
+ static sense_reason_t sbc_execute_unmap(struct se_cmd *cmd);
+ 
+ static sense_reason_t
+@@ -292,14 +292,14 @@ static inline unsigned long long 
transport_lba_64_ext(unsigned char *cdb)
+ }
+ 
+ static sense_reason_t
+-sbc_setup_write_same(struct se_cmd *cmd, unsigned char *flags, struct sbc_ops 
*ops)
++sbc_setup_write_same(struct se_cmd *cmd, unsigned char flags, struct sbc_ops 
*ops)
+ {
+       struct se_device *dev = cmd->se_dev;
+       sector_t end_lba = dev->transport->get_blocks(dev) + 1;
+       unsigned int sectors = sbc_get_write_same_sectors(cmd);
+       sense_reason_t ret;
+ 
+-      if ((flags[0] & 0x04) || (flags[0] & 0x02)) {
++      if ((flags & 0x04) || (flags & 0x02)) {
+               pr_err("WRITE_SAME PBDATA and LBDATA"
+                       " bits not supported for Block Discard"
+                       " Emulation\n");
+@@ -321,7 +321,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char 
*flags, struct sbc_ops *o
+       }
+ 
+       /* We always have ANC_SUP == 0 so setting ANCHOR is always an error */
+-      if (flags[0] & 0x10) {
++      if (flags & 0x10) {
+               pr_warn("WRITE SAME with ANCHOR not supported\n");
+               return TCM_INVALID_CDB_FIELD;
+       }
+@@ -329,7 +329,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char 
*flags, struct sbc_ops *o
+        * Special case for WRITE_SAME w/ UNMAP=1 that ends up getting
+        * translated into block discard requests within backend code.
+        */
+-      if (flags[0] & 0x08) {
++      if (flags & 0x08) {
+               if (!ops->execute_unmap)
+                       return TCM_UNSUPPORTED_SCSI_OPCODE;
+ 
+@@ -344,7 +344,7 @@ sbc_setup_write_same(struct se_cmd *cmd, unsigned char 
*flags, struct sbc_ops *o
+       if (!ops->execute_write_same)
+               return TCM_UNSUPPORTED_SCSI_OPCODE;
+ 
+-      ret = sbc_check_prot(dev, cmd, &cmd->t_task_cdb[0], sectors, true);
++      ret = sbc_check_prot(dev, cmd, flags >> 5, sectors, true);
+       if (ret)
+               return ret;
+ 
+@@ -702,10 +702,9 @@ sbc_set_prot_op_checks(u8 protect, bool fabric_prot, enum 
target_prot_type prot_
+ }
+ 
+ static sense_reason_t
+-sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char *cdb,
++sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, unsigned char 
protect,
+              u32 sectors, bool is_write)
+ {
+-      u8 protect = cdb[1] >> 5;
+       int sp_ops = cmd->se_sess->sup_prot_ops;
+       int pi_prot_type = dev->dev_attrib.pi_prot_type;
+       bool fabric_prot = false;
+@@ -753,7 +752,7 @@ sbc_check_prot(struct se_device *dev, struct se_cmd *cmd, 
unsigned char *cdb,
+               /* Fallthrough */
+       default:
+               pr_err("Unable to determine pi_prot_type for CDB: 0x%02x "
+-                     "PROTECT: 0x%02x\n", cdb[0], protect);
++                     "PROTECT: 0x%02x\n", cmd->t_task_cdb[0], protect);
+               return TCM_INVALID_CDB_FIELD;
+       }
+ 
+@@ -828,7 +827,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
+               if (sbc_check_dpofua(dev, cmd, cdb))
+                       return TCM_INVALID_CDB_FIELD;
+ 
+-              ret = sbc_check_prot(dev, cmd, cdb, sectors, false);
++              ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, false);
+               if (ret)
+                       return ret;
+ 
+@@ -842,7 +841,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
+               if (sbc_check_dpofua(dev, cmd, cdb))
+                       return TCM_INVALID_CDB_FIELD;
+ 
+-              ret = sbc_check_prot(dev, cmd, cdb, sectors, false);
++              ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, false);
+               if (ret)
+                       return ret;
+ 
+@@ -856,7 +855,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
+               if (sbc_check_dpofua(dev, cmd, cdb))
+                       return TCM_INVALID_CDB_FIELD;
+ 
+-              ret = sbc_check_prot(dev, cmd, cdb, sectors, false);
++              ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, false);
+               if (ret)
+                       return ret;
+ 
+@@ -877,7 +876,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
+               if (sbc_check_dpofua(dev, cmd, cdb))
+                       return TCM_INVALID_CDB_FIELD;
+ 
+-              ret = sbc_check_prot(dev, cmd, cdb, sectors, true);
++              ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, true);
+               if (ret)
+                       return ret;
+ 
+@@ -891,7 +890,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
+               if (sbc_check_dpofua(dev, cmd, cdb))
+                       return TCM_INVALID_CDB_FIELD;
+ 
+-              ret = sbc_check_prot(dev, cmd, cdb, sectors, true);
++              ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, true);
+               if (ret)
+                       return ret;
+ 
+@@ -906,7 +905,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
+               if (sbc_check_dpofua(dev, cmd, cdb))
+                       return TCM_INVALID_CDB_FIELD;
+ 
+-              ret = sbc_check_prot(dev, cmd, cdb, sectors, true);
++              ret = sbc_check_prot(dev, cmd, cdb[1] >> 5, sectors, true);
+               if (ret)
+                       return ret;
+ 
+@@ -965,7 +964,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
+                       size = sbc_get_size(cmd, 1);
+                       cmd->t_task_lba = get_unaligned_be64(&cdb[12]);
+ 
+-                      ret = sbc_setup_write_same(cmd, &cdb[10], ops);
++                      ret = sbc_setup_write_same(cmd, cdb[10], ops);
+                       if (ret)
+                               return ret;
+                       break;
+@@ -1064,7 +1063,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
+               size = sbc_get_size(cmd, 1);
+               cmd->t_task_lba = get_unaligned_be64(&cdb[2]);
+ 
+-              ret = sbc_setup_write_same(cmd, &cdb[1], ops);
++              ret = sbc_setup_write_same(cmd, cdb[1], ops);
+               if (ret)
+                       return ret;
+               break;
+@@ -1082,7 +1081,7 @@ sbc_parse_cdb(struct se_cmd *cmd, struct sbc_ops *ops)
+                * Follow sbcr26 with WRITE_SAME (10) and check for the 
existence
+                * of byte 1 bit 3 UNMAP instead of original reserved field
+                */
+-              ret = sbc_setup_write_same(cmd, &cdb[1], ops);
++              ret = sbc_setup_write_same(cmd, cdb[1], ops);
+               if (ret)
+                       return ret;
+               break;
+diff --git a/drivers/thermal/thermal_core.c b/drivers/thermal/thermal_core.c
+index 7b0ffc1c0ea92..a24296d68f3ed 100644
+--- a/drivers/thermal/thermal_core.c
++++ b/drivers/thermal/thermal_core.c
+@@ -1303,7 +1303,7 @@ free_tz:
+ EXPORT_SYMBOL_GPL(thermal_zone_device_register);
+ 
+ /**
+- * thermal_device_unregister - removes the registered thermal zone device
++ * thermal_zone_device_unregister - removes the registered thermal zone device
+  * @tz: the thermal zone device to remove
+  */
+ void thermal_zone_device_unregister(struct thermal_zone_device *tz)
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index a7f16dbfffdfa..f1a11032a0a01 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -45,6 +45,7 @@
+ 
+ #define USB_TP_TRANSMISSION_DELAY     40      /* ns */
+ #define USB_TP_TRANSMISSION_DELAY_MAX 65535   /* ns */
++#define USB_PING_RESPONSE_TIME                400     /* ns */
+ 
+ /* Protect struct usb_device->state and ->children members
+  * Note: Both are also protected by ->dev.sem, except that ->state can
+@@ -179,8 +180,9 @@ int usb_device_supports_lpm(struct usb_device *udev)
+ }
+ 
+ /*
+- * Set the Maximum Exit Latency (MEL) for the host to initiate a transition 
from
+- * either U1 or U2.
++ * Set the Maximum Exit Latency (MEL) for the host to wakup up the path from
++ * U1/U2, send a PING to the device and receive a PING_RESPONSE.
++ * See USB 3.1 section C.1.5.2
+  */
+ static void usb_set_lpm_mel(struct usb_device *udev,
+               struct usb3_lpm_parameters *udev_lpm_params,
+@@ -190,35 +192,37 @@ static void usb_set_lpm_mel(struct usb_device *udev,
+               unsigned int hub_exit_latency)
+ {
+       unsigned int total_mel;
+-      unsigned int device_mel;
+-      unsigned int hub_mel;
+ 
+       /*
+-       * Calculate the time it takes to transition all links from the roothub
+-       * to the parent hub into U0.  The parent hub must then decode the
+-       * packet (hub header decode latency) to figure out which port it was
+-       * bound for.
+-       *
+-       * The Hub Header decode latency is expressed in 0.1us intervals (0x1
+-       * means 0.1us).  Multiply that by 100 to get nanoseconds.
++       * tMEL1. time to transition path from host to device into U0.
++       * MEL for parent already contains the delay up to parent, so only add
++       * the exit latency for the last link (pick the slower exit latency),
++       * and the hub header decode latency. See USB 3.1 section C 2.2.1
++       * Store MEL in nanoseconds
+        */
+       total_mel = hub_lpm_params->mel +
+-              (hub->descriptor->u.ss.bHubHdrDecLat * 100);
++              max(udev_exit_latency, hub_exit_latency) * 1000 +
++              hub->descriptor->u.ss.bHubHdrDecLat * 100;
+ 
+       /*
+-       * How long will it take to transition the downstream hub's port into
+-       * U0?  The greater of either the hub exit latency or the device exit
+-       * latency.
+-       *
+-       * The BOS U1/U2 exit latencies are expressed in 1us intervals.
+-       * Multiply that by 1000 to get nanoseconds.
++       * tMEL2. Time to submit PING packet. Sum of tTPTransmissionDelay for
++       * each link + wHubDelay for each hub. Add only for last link.
++       * tMEL4, the time for PING_RESPONSE to traverse upstream is similar.
++       * Multiply by 2 to include it as well.
+        */
+-      device_mel = udev_exit_latency * 1000;
+-      hub_mel = hub_exit_latency * 1000;
+-      if (device_mel > hub_mel)
+-              total_mel += device_mel;
+-      else
+-              total_mel += hub_mel;
++      total_mel += (__le16_to_cpu(hub->descriptor->u.ss.wHubDelay) +
++                    USB_TP_TRANSMISSION_DELAY) * 2;
++
++      /*
++       * tMEL3, tPingResponse. Time taken by device to generate PING_RESPONSE
++       * after receiving PING. Also add 2100ns as stated in USB 3.1 C 1.5.2.4
++       * to cover the delay if the PING_RESPONSE is queued behind a Max Packet
++       * Size DP.
++       * Note these delays should be added only once for the entire path, so
++       * add them to the MEL of the device connected to the roothub.
++       */
++      if (!hub->hdev->parent)
++              total_mel += USB_PING_RESPONSE_TIME + 2100;
+ 
+       udev_lpm_params->mel = total_mel;
+ }
+@@ -3988,6 +3992,47 @@ static int usb_set_lpm_timeout(struct usb_device *udev,
+       return 0;
+ }
+ 
++/*
++ * Don't allow device intiated U1/U2 if the system exit latency + one bus
++ * interval is greater than the minimum service interval of any active
++ * periodic endpoint. See USB 3.2 section 9.4.9
++ */
++static bool usb_device_may_initiate_lpm(struct usb_device *udev,
++                                      enum usb3_link_state state)
++{
++      unsigned int sel;               /* us */
++      int i, j;
++
++      if (state == USB3_LPM_U1)
++              sel = DIV_ROUND_UP(udev->u1_params.sel, 1000);
++      else if (state == USB3_LPM_U2)
++              sel = DIV_ROUND_UP(udev->u2_params.sel, 1000);
++      else
++              return false;
++
++      for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) {
++              struct usb_interface *intf;
++              struct usb_endpoint_descriptor *desc;
++              unsigned int interval;
++
++              intf = udev->actconfig->interface[i];
++              if (!intf)
++                      continue;
++
++              for (j = 0; j < intf->cur_altsetting->desc.bNumEndpoints; j++) {
++                      desc = &intf->cur_altsetting->endpoint[j].desc;
++
++                      if (usb_endpoint_xfer_int(desc) ||
++                          usb_endpoint_xfer_isoc(desc)) {
++                              interval = (1 << (desc->bInterval - 1)) * 125;
++                              if (sel + 125 > interval)
++                                      return false;
++                      }
++              }
++      }
++      return true;
++}
++
+ /*
+  * Enable the hub-initiated U1/U2 idle timeouts, and enable device-initiated
+  * U1/U2 entry.
+@@ -4060,20 +4105,23 @@ static void usb_enable_link_state(struct usb_hcd *hcd, 
struct usb_device *udev,
+        * U1/U2_ENABLE
+        */
+       if (udev->actconfig &&
+-          usb_set_device_initiated_lpm(udev, state, true) == 0) {
+-              if (state == USB3_LPM_U1)
+-                      udev->usb3_lpm_u1_enabled = 1;
+-              else if (state == USB3_LPM_U2)
+-                      udev->usb3_lpm_u2_enabled = 1;
+-      } else {
+-              /* Don't request U1/U2 entry if the device
+-               * cannot transition to U1/U2.
+-               */
+-              usb_set_lpm_timeout(udev, state, 0);
+-              hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state);
++          usb_device_may_initiate_lpm(udev, state)) {
++              if (usb_set_device_initiated_lpm(udev, state, true)) {
++                      /*
++                       * Request to enable device initiated U1/U2 failed,
++                       * better to turn off lpm in this case.
++                       */
++                      usb_set_lpm_timeout(udev, state, 0);
++                      hcd->driver->disable_usb3_lpm_timeout(hcd, udev, state);
++                      return;
++              }
+       }
+-}
+ 
++      if (state == USB3_LPM_U1)
++              udev->usb3_lpm_u1_enabled = 1;
++      else if (state == USB3_LPM_U2)
++              udev->usb3_lpm_u2_enabled = 1;
++}
+ /*
+  * Disable the hub-initiated U1/U2 idle timeouts, and disable device-initiated
+  * U1/U2 entry.
+diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
+index f6a6c54cba35f..d97544fd339b1 100644
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -502,10 +502,6 @@ static const struct usb_device_id usb_quirk_list[] = {
+       /* DJI CineSSD */
+       { USB_DEVICE(0x2ca3, 0x0031), .driver_info = USB_QUIRK_NO_LPM },
+ 
+-      /* Fibocom L850-GL LTE Modem */
+-      { USB_DEVICE(0x2cb7, 0x0007), .driver_info =
+-                      USB_QUIRK_IGNORE_REMOTE_WAKEUP },
+-
+       /* INTEL VALUE SSD */
+       { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
+ 
+diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c
+index d0edb7e453c07..7fff96dff0a03 100644
+--- a/drivers/usb/dwc2/gadget.c
++++ b/drivers/usb/dwc2/gadget.c
+@@ -2645,12 +2645,14 @@ static void dwc2_hsotg_complete_in(struct dwc2_hsotg 
*hsotg,
+               return;
+       }
+ 
+-      /* Zlp for all endpoints, for ep0 only in DATA IN stage */
++      /* Zlp for all endpoints in non DDMA, for ep0 only in DATA IN stage */
+       if (hs_ep->send_zlp) {
+-              dwc2_hsotg_program_zlp(hsotg, hs_ep);
+               hs_ep->send_zlp = 0;
+-              /* transfer will be completed on next complete interrupt */
+-              return;
++              if (!using_desc_dma(hsotg)) {
++                      dwc2_hsotg_program_zlp(hsotg, hs_ep);
++                      /* transfer will be completed on next complete 
interrupt */
++                      return;
++              }
+       }
+ 
+       if (hs_ep->index == 0 && hsotg->ep0_state == DWC2_EP0_DATA_IN) {
+diff --git a/drivers/usb/host/max3421-hcd.c b/drivers/usb/host/max3421-hcd.c
+index c9acc59f4addd..16efe37b7558c 100644
+--- a/drivers/usb/host/max3421-hcd.c
++++ b/drivers/usb/host/max3421-hcd.c
+@@ -153,8 +153,6 @@ struct max3421_hcd {
+        */
+       struct urb *curr_urb;
+       enum scheduling_pass sched_pass;
+-      struct usb_device *loaded_dev;  /* dev that's loaded into the chip */
+-      int loaded_epnum;               /* epnum whose toggles are loaded */
+       int urb_done;                   /* > 0 -> no errors, < 0: errno */
+       size_t curr_len;
+       u8 hien;
+@@ -492,39 +490,17 @@ max3421_set_speed(struct usb_hcd *hcd, struct usb_device 
*dev)
+  * Caller must NOT hold HCD spinlock.
+  */
+ static void
+-max3421_set_address(struct usb_hcd *hcd, struct usb_device *dev, int epnum,
+-                  int force_toggles)
++max3421_set_address(struct usb_hcd *hcd, struct usb_device *dev, int epnum)
+ {
+-      struct max3421_hcd *max3421_hcd = hcd_to_max3421(hcd);
+-      int old_epnum, same_ep, rcvtog, sndtog;
+-      struct usb_device *old_dev;
++      int rcvtog, sndtog;
+       u8 hctl;
+ 
+-      old_dev = max3421_hcd->loaded_dev;
+-      old_epnum = max3421_hcd->loaded_epnum;
+-
+-      same_ep = (dev == old_dev && epnum == old_epnum);
+-      if (same_ep && !force_toggles)
+-              return;
+-
+-      if (old_dev && !same_ep) {
+-              /* save the old end-points toggles: */
+-              u8 hrsl = spi_rd8(hcd, MAX3421_REG_HRSL);
+-
+-              rcvtog = (hrsl >> MAX3421_HRSL_RCVTOGRD_BIT) & 1;
+-              sndtog = (hrsl >> MAX3421_HRSL_SNDTOGRD_BIT) & 1;
+-
+-              /* no locking: HCD (i.e., we) own toggles, don't we? */
+-              usb_settoggle(old_dev, old_epnum, 0, rcvtog);
+-              usb_settoggle(old_dev, old_epnum, 1, sndtog);
+-      }
+       /* setup new endpoint's toggle bits: */
+       rcvtog = usb_gettoggle(dev, epnum, 0);
+       sndtog = usb_gettoggle(dev, epnum, 1);
+       hctl = (BIT(rcvtog + MAX3421_HCTL_RCVTOG0_BIT) |
+               BIT(sndtog + MAX3421_HCTL_SNDTOG0_BIT));
+ 
+-      max3421_hcd->loaded_epnum = epnum;
+       spi_wr8(hcd, MAX3421_REG_HCTL, hctl);
+ 
+       /*
+@@ -532,7 +508,6 @@ max3421_set_address(struct usb_hcd *hcd, struct usb_device 
*dev, int epnum,
+        * address-assignment so it's best to just always load the
+        * address whenever the end-point changed/was forced.
+        */
+-      max3421_hcd->loaded_dev = dev;
+       spi_wr8(hcd, MAX3421_REG_PERADDR, dev->devnum);
+ }
+ 
+@@ -667,7 +642,7 @@ max3421_select_and_start_urb(struct usb_hcd *hcd)
+       struct max3421_hcd *max3421_hcd = hcd_to_max3421(hcd);
+       struct urb *urb, *curr_urb = NULL;
+       struct max3421_ep *max3421_ep;
+-      int epnum, force_toggles = 0;
++      int epnum;
+       struct usb_host_endpoint *ep;
+       struct list_head *pos;
+       unsigned long flags;
+@@ -777,7 +752,6 @@ done:
+                       usb_settoggle(urb->dev, epnum, 0, 1);
+                       usb_settoggle(urb->dev, epnum, 1, 1);
+                       max3421_ep->pkt_state = PKT_STATE_SETUP;
+-                      force_toggles = 1;
+               } else
+                       max3421_ep->pkt_state = PKT_STATE_TRANSFER;
+       }
+@@ -785,7 +759,7 @@ done:
+       spin_unlock_irqrestore(&max3421_hcd->lock, flags);
+ 
+       max3421_ep->last_active = max3421_hcd->frame_number;
+-      max3421_set_address(hcd, urb->dev, epnum, force_toggles);
++      max3421_set_address(hcd, urb->dev, epnum);
+       max3421_set_speed(hcd, urb->dev);
+       max3421_next_transfer(hcd, 0);
+       return 1;
+@@ -1380,6 +1354,16 @@ max3421_urb_done(struct usb_hcd *hcd)
+               status = 0;
+       urb = max3421_hcd->curr_urb;
+       if (urb) {
++              /* save the old end-points toggles: */
++              u8 hrsl = spi_rd8(hcd, MAX3421_REG_HRSL);
++              int rcvtog = (hrsl >> MAX3421_HRSL_RCVTOGRD_BIT) & 1;
++              int sndtog = (hrsl >> MAX3421_HRSL_SNDTOGRD_BIT) & 1;
++              int epnum = usb_endpoint_num(&urb->ep->desc);
++
++              /* no locking: HCD (i.e., we) own toggles, don't we? */
++              usb_settoggle(urb->dev, epnum, 0, rcvtog);
++              usb_settoggle(urb->dev, epnum, 1, sndtog);
++
+               max3421_hcd->curr_urb = NULL;
+               spin_lock_irqsave(&max3421_hcd->lock, flags);
+               usb_hcd_unlink_urb_from_ep(hcd, urb);
+diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
+index e6e8bed11aeab..9143e74b70512 100644
+--- a/drivers/usb/host/xhci-hub.c
++++ b/drivers/usb/host/xhci-hub.c
+@@ -1458,11 +1458,12 @@ int xhci_hub_status_data(struct usb_hcd *hcd, char 
*buf)
+        * Inform the usbcore about resume-in-progress by returning
+        * a non-zero value even if there are no status changes.
+        */
++      spin_lock_irqsave(&xhci->lock, flags);
++
+       status = bus_state->resuming_ports;
+ 
+       mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC | PORT_WRC | PORT_CEC;
+ 
+-      spin_lock_irqsave(&xhci->lock, flags);
+       /* For each port, did anything change?  If so, set that bit in buf. */
+       for (i = 0; i < max_ports; i++) {
+               temp = readl(ports[i]->addr);
+diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
+index 22b1de99d02d1..7c981ad34251d 100644
+--- a/drivers/usb/host/xhci-ring.c
++++ b/drivers/usb/host/xhci-ring.c
+@@ -433,6 +433,26 @@ static void ring_doorbell_for_active_rings(struct 
xhci_hcd *xhci,
+       }
+ }
+ 
++static struct xhci_virt_ep *xhci_get_virt_ep(struct xhci_hcd *xhci,
++                                           unsigned int slot_id,
++                                           unsigned int ep_index)
++{
++      if (slot_id == 0 || slot_id >= MAX_HC_SLOTS) {
++              xhci_warn(xhci, "Invalid slot_id %u\n", slot_id);
++              return NULL;
++      }
++      if (ep_index >= EP_CTX_PER_DEV) {
++              xhci_warn(xhci, "Invalid endpoint index %u\n", ep_index);
++              return NULL;
++      }
++      if (!xhci->devs[slot_id]) {
++              xhci_warn(xhci, "No xhci virt device for slot_id %u\n", 
slot_id);
++              return NULL;
++      }
++
++      return &xhci->devs[slot_id]->eps[ep_index];
++}
++
+ /* Get the right ring for the given slot_id, ep_index and stream_id.
+  * If the endpoint supports streams, boundary check the URB's stream ID.
+  * If the endpoint doesn't support streams, return the singular endpoint ring.
+@@ -443,7 +463,10 @@ struct xhci_ring *xhci_triad_to_transfer_ring(struct 
xhci_hcd *xhci,
+ {
+       struct xhci_virt_ep *ep;
+ 
+-      ep = &xhci->devs[slot_id]->eps[ep_index];
++      ep = xhci_get_virt_ep(xhci, slot_id, ep_index);
++      if (!ep)
++              return NULL;
++
+       /* Common case: no streams */
+       if (!(ep->ep_state & EP_HAS_STREAMS))
+               return ep->ring;
+@@ -718,11 +741,14 @@ static void xhci_handle_cmd_stop_ep(struct xhci_hcd 
*xhci, int slot_id,
+       memset(&deq_state, 0, sizeof(deq_state));
+       ep_index = TRB_TO_EP_INDEX(le32_to_cpu(trb->generic.field[3]));
+ 
++      ep = xhci_get_virt_ep(xhci, slot_id, ep_index);
++      if (!ep)
++              return;
++
+       vdev = xhci->devs[slot_id];
+       ep_ctx = xhci_get_ep_ctx(xhci, vdev->out_ctx, ep_index);
+       trace_xhci_handle_cmd_stop_ep(ep_ctx);
+ 
+-      ep = &xhci->devs[slot_id]->eps[ep_index];
+       last_unlinked_td = list_last_entry(&ep->cancelled_td_list,
+                       struct xhci_td, cancelled_td_list);
+ 
+@@ -1043,9 +1069,11 @@ static void xhci_handle_cmd_set_deq(struct xhci_hcd 
*xhci, int slot_id,
+ 
+       ep_index = TRB_TO_EP_INDEX(le32_to_cpu(trb->generic.field[3]));
+       stream_id = TRB_TO_STREAM_ID(le32_to_cpu(trb->generic.field[2]));
+-      dev = xhci->devs[slot_id];
+-      ep = &dev->eps[ep_index];
++      ep = xhci_get_virt_ep(xhci, slot_id, ep_index);
++      if (!ep)
++              return;
+ 
++      dev = xhci->devs[slot_id];
+       ep_ring = xhci_stream_id_to_ring(dev, ep_index, stream_id);
+       if (!ep_ring) {
+               xhci_warn(xhci, "WARN Set TR deq ptr command for freed stream 
ID %u\n",
+@@ -1118,9 +1146,9 @@ static void xhci_handle_cmd_set_deq(struct xhci_hcd 
*xhci, int slot_id,
+       }
+ 
+ cleanup:
+-      dev->eps[ep_index].ep_state &= ~SET_DEQ_PENDING;
+-      dev->eps[ep_index].queued_deq_seg = NULL;
+-      dev->eps[ep_index].queued_deq_ptr = NULL;
++      ep->ep_state &= ~SET_DEQ_PENDING;
++      ep->queued_deq_seg = NULL;
++      ep->queued_deq_ptr = NULL;
+       /* Restart any rings with pending URBs */
+       ring_doorbell_for_active_rings(xhci, slot_id, ep_index);
+ }
+@@ -1129,10 +1157,15 @@ static void xhci_handle_cmd_reset_ep(struct xhci_hcd 
*xhci, int slot_id,
+               union xhci_trb *trb, u32 cmd_comp_code)
+ {
+       struct xhci_virt_device *vdev;
++      struct xhci_virt_ep *ep;
+       struct xhci_ep_ctx *ep_ctx;
+       unsigned int ep_index;
+ 
+       ep_index = TRB_TO_EP_INDEX(le32_to_cpu(trb->generic.field[3]));
++      ep = xhci_get_virt_ep(xhci, slot_id, ep_index);
++      if (!ep)
++              return;
++
+       vdev = xhci->devs[slot_id];
+       ep_ctx = xhci_get_ep_ctx(xhci, vdev->out_ctx, ep_index);
+       trace_xhci_handle_cmd_reset_ep(ep_ctx);
+@@ -1162,7 +1195,7 @@ static void xhci_handle_cmd_reset_ep(struct xhci_hcd 
*xhci, int slot_id,
+               xhci_ring_cmd_db(xhci);
+       } else {
+               /* Clear our internal halted state */
+-              xhci->devs[slot_id]->eps[ep_index].ep_state &= ~EP_HALTED;
++              ep->ep_state &= ~EP_HALTED;
+       }
+ }
+ 
+@@ -2281,14 +2314,13 @@ static int handle_tx_event(struct xhci_hcd *xhci,
+       trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len));
+       ep_trb_dma = le64_to_cpu(event->buffer);
+ 
+-      xdev = xhci->devs[slot_id];
+-      if (!xdev) {
+-              xhci_err(xhci, "ERROR Transfer event pointed to bad slot %u\n",
+-                       slot_id);
++      ep = xhci_get_virt_ep(xhci, slot_id, ep_index);
++      if (!ep) {
++              xhci_err(xhci, "ERROR Invalid Transfer event\n");
+               goto err_out;
+       }
+ 
+-      ep = &xdev->eps[ep_index];
++      xdev = xhci->devs[slot_id];
+       ep_ring = xhci_dma_to_transfer_ring(ep, ep_trb_dma);
+       ep_ctx = xhci_get_ep_ctx(xhci, xdev->out_ctx, ep_index);
+ 
+diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
+index 7a4195f8cd1cc..dfc914713704f 100644
+--- a/drivers/usb/host/xhci.h
++++ b/drivers/usb/host/xhci.h
+@@ -991,6 +991,7 @@ struct xhci_interval_bw_table {
+       unsigned int            ss_bw_out;
+ };
+ 
++#define EP_CTX_PER_DEV                31
+ 
+ struct xhci_virt_device {
+       struct usb_device               *udev;
+@@ -1005,7 +1006,7 @@ struct xhci_virt_device {
+       struct xhci_container_ctx       *out_ctx;
+       /* Used for addressing devices and configuration changes */
+       struct xhci_container_ctx       *in_ctx;
+-      struct xhci_virt_ep             eps[31];
++      struct xhci_virt_ep             eps[EP_CTX_PER_DEV];
+       u8                              fake_port;
+       u8                              real_port;
+       struct xhci_interval_bw_table   *bw_table;
+diff --git a/drivers/usb/renesas_usbhs/fifo.c 
b/drivers/usb/renesas_usbhs/fifo.c
+index 6b92a57382db3..e49f6d41f5ec4 100644
+--- a/drivers/usb/renesas_usbhs/fifo.c
++++ b/drivers/usb/renesas_usbhs/fifo.c
+@@ -101,6 +101,8 @@ static struct dma_chan *usbhsf_dma_chan_get(struct 
usbhs_fifo *fifo,
+ #define usbhsf_dma_map(p)     __usbhsf_dma_map_ctrl(p, 1)
+ #define usbhsf_dma_unmap(p)   __usbhsf_dma_map_ctrl(p, 0)
+ static int __usbhsf_dma_map_ctrl(struct usbhs_pkt *pkt, int map);
++static void usbhsf_tx_irq_ctrl(struct usbhs_pipe *pipe, int enable);
++static void usbhsf_rx_irq_ctrl(struct usbhs_pipe *pipe, int enable);
+ struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, struct usbhs_pkt 
*pkt)
+ {
+       struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe);
+@@ -123,6 +125,11 @@ struct usbhs_pkt *usbhs_pkt_pop(struct usbhs_pipe *pipe, 
struct usbhs_pkt *pkt)
+               if (chan) {
+                       dmaengine_terminate_all(chan);
+                       usbhsf_dma_unmap(pkt);
++              } else {
++                      if (usbhs_pipe_is_dir_in(pipe))
++                              usbhsf_rx_irq_ctrl(pipe, 0);
++                      else
++                              usbhsf_tx_irq_ctrl(pipe, 0);
+               }
+ 
+               usbhs_pipe_clear_without_sequence(pipe, 0, 0);
+diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c
+index 851f178ff56fc..eaf9155663027 100644
+--- a/drivers/usb/serial/cp210x.c
++++ b/drivers/usb/serial/cp210x.c
+@@ -156,6 +156,7 @@ static const struct usb_device_id id_table[] = {
+       { USB_DEVICE(0x10C4, 0x89A4) }, /* CESINEL FTBC Flexible Thyristor 
Bridge Controller */
+       { USB_DEVICE(0x10C4, 0x89FB) }, /* Qivicon ZigBee USB Radio Stick */
+       { USB_DEVICE(0x10C4, 0x8A2A) }, /* HubZ dual ZigBee and Z-Wave dongle */
++      { USB_DEVICE(0x10C4, 0x8A5B) }, /* CEL EM3588 ZigBee USB Stick */
+       { USB_DEVICE(0x10C4, 0x8A5E) }, /* CEL EM3588 ZigBee USB Stick Long 
Range */
+       { USB_DEVICE(0x10C4, 0x8B34) }, /* Qivicon ZigBee USB Radio Stick */
+       { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */
+@@ -203,8 +204,8 @@ static const struct usb_device_id id_table[] = {
+       { USB_DEVICE(0x1901, 0x0194) }, /* GE Healthcare Remote Alarm Box */
+       { USB_DEVICE(0x1901, 0x0195) }, /* GE B850/B650/B450 CP2104 DP UART 
interface */
+       { USB_DEVICE(0x1901, 0x0196) }, /* GE B850 CP2105 DP UART interface */
+-      { USB_DEVICE(0x1901, 0x0197) }, /* GE CS1000 Display serial interface */
+-      { USB_DEVICE(0x1901, 0x0198) }, /* GE CS1000 M.2 Key E serial interface 
*/
++      { USB_DEVICE(0x1901, 0x0197) }, /* GE CS1000 M.2 Key E serial interface 
*/
++      { USB_DEVICE(0x1901, 0x0198) }, /* GE CS1000 Display serial interface */
+       { USB_DEVICE(0x199B, 0xBA30) }, /* LORD WSDA-200-USB */
+       { USB_DEVICE(0x19CF, 0x3000) }, /* Parrot NMEA GPS Flight Recorder */
+       { USB_DEVICE(0x1ADB, 0x0001) }, /* Schweitzer Engineering C662 Cable */
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 5e3430d456f36..9370c6fa7bc80 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -238,6 +238,7 @@ static void option_instat_callback(struct urb *urb);
+ #define QUECTEL_PRODUCT_UC15                  0x9090
+ /* These u-blox products use Qualcomm's vendor ID */
+ #define UBLOX_PRODUCT_R410M                   0x90b2
++#define UBLOX_PRODUCT_R6XX                    0x90fa
+ /* These Yuga products use Qualcomm's vendor ID */
+ #define YUGA_PRODUCT_CLM920_NC5                       0x9625
+ 
+@@ -1101,6 +1102,8 @@ static const struct usb_device_id option_ids[] = {
+       /* u-blox products using Qualcomm vendor ID */
+       { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R410M),
+         .driver_info = RSVD(1) | RSVD(3) },
++      { USB_DEVICE(QUALCOMM_VENDOR_ID, UBLOX_PRODUCT_R6XX),
++        .driver_info = RSVD(3) },
+       /* Quectel products using Quectel vendor ID */
+       { USB_DEVICE_AND_INTERFACE_INFO(QUECTEL_VENDOR_ID, 
QUECTEL_PRODUCT_EC21, 0xff, 0xff, 0xff),
+         .driver_info = NUMEP2 },
+diff --git a/drivers/usb/storage/unusual_uas.h 
b/drivers/usb/storage/unusual_uas.h
+index cb7b15ecb7aba..c7db6c943ba51 100644
+--- a/drivers/usb/storage/unusual_uas.h
++++ b/drivers/usb/storage/unusual_uas.h
+@@ -45,6 +45,13 @@ UNUSUAL_DEV(0x059f, 0x105f, 0x0000, 0x9999,
+               USB_SC_DEVICE, USB_PR_DEVICE, NULL,
+               US_FL_NO_REPORT_OPCODES | US_FL_NO_SAME),
+ 
++/* Reported-by: Julian Sikorski <beleg...@gmail.com> */
++UNUSUAL_DEV(0x059f, 0x1061, 0x0000, 0x9999,
++              "LaCie",
++              "Rugged USB3-FW",
++              USB_SC_DEVICE, USB_PR_DEVICE, NULL,
++              US_FL_IGNORE_UAS),
++
+ /*
+  * Apricorn USB3 dongle sometimes returns "USBSUSBSUSBS" in response to SCSI
+  * commands in UAS mode.  Observed with the 1.28 firmware; are there others?
+diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
+index bf0e0e3e09c5d..d29f4cf125d27 100644
+--- a/fs/btrfs/inode.c
++++ b/fs/btrfs/inode.c
+@@ -530,7 +530,7 @@ again:
+        * inode has not been flagged as nocompress.  This flag can
+        * change at any time if we discover bad compression ratios.
+        */
+-      if (inode_need_compress(inode, start, end)) {
++      if (nr_pages > 1 && inode_need_compress(inode, start, end)) {
+               WARN_ON(pages);
+               pages = kcalloc(nr_pages, sizeof(struct page *), GFP_NOFS);
+               if (!pages) {
+diff --git a/fs/proc/base.c b/fs/proc/base.c
+index 317a0762fc5f2..e3f10c110b74e 100644
+--- a/fs/proc/base.c
++++ b/fs/proc/base.c
+@@ -835,7 +835,7 @@ static ssize_t mem_rw(struct file *file, char __user *buf,
+       flags = FOLL_FORCE | (write ? FOLL_WRITE : 0);
+ 
+       while (count > 0) {
+-              int this_len = min_t(int, count, PAGE_SIZE);
++              size_t this_len = min_t(size_t, count, PAGE_SIZE);
+ 
+               if (write && copy_from_user(page, buf, this_len)) {
+                       copied = -EFAULT;
+diff --git a/include/drm/drm_ioctl.h b/include/drm/drm_ioctl.h
+index fafb6f592c4b9..b722757a5dc24 100644
+--- a/include/drm/drm_ioctl.h
++++ b/include/drm/drm_ioctl.h
+@@ -68,6 +68,7 @@ typedef int drm_ioctl_compat_t(struct file *filp, unsigned 
int cmd,
+                              unsigned long arg);
+ 
+ #define DRM_IOCTL_NR(n)                _IOC_NR(n)
++#define DRM_IOCTL_TYPE(n)              _IOC_TYPE(n)
+ #define DRM_MAJOR       226
+ 
+ /**
+diff --git a/include/net/dst_metadata.h b/include/net/dst_metadata.h
+index 56cb3c38569a7..14efa0ded75dd 100644
+--- a/include/net/dst_metadata.h
++++ b/include/net/dst_metadata.h
+@@ -45,7 +45,9 @@ skb_tunnel_info(const struct sk_buff *skb)
+               return &md_dst->u.tun_info;
+ 
+       dst = skb_dst(skb);
+-      if (dst && dst->lwtstate)
++      if (dst && dst->lwtstate &&
++          (dst->lwtstate->type == LWTUNNEL_ENCAP_IP ||
++           dst->lwtstate->type == LWTUNNEL_ENCAP_IP6))
+               return lwt_tun_info(dst->lwtstate);
+ 
+       return NULL;
+diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h
+index 5c38a80cee3a2..a8f5410ae0d4b 100644
+--- a/include/net/ip6_route.h
++++ b/include/net/ip6_route.h
+@@ -241,7 +241,7 @@ static inline bool ipv6_anycast_destination(const struct 
dst_entry *dst,
+ int ip6_fragment(struct net *net, struct sock *sk, struct sk_buff *skb,
+                int (*output)(struct net *, struct sock *, struct sk_buff *));
+ 
+-static inline int ip6_skb_dst_mtu(struct sk_buff *skb)
++static inline unsigned int ip6_skb_dst_mtu(struct sk_buff *skb)
+ {
+       int mtu;
+ 
+diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
+index 9cdbc07bb70f3..84e7efda98daf 100644
+--- a/kernel/sched/fair.c
++++ b/kernel/sched/fair.c
+@@ -4714,7 +4714,7 @@ static const u64 cfs_bandwidth_slack_period = 5 * 
NSEC_PER_MSEC;
+ static int runtime_refresh_within(struct cfs_bandwidth *cfs_b, u64 min_expire)
+ {
+       struct hrtimer *refresh_timer = &cfs_b->period_timer;
+-      u64 remaining;
++      s64 remaining;
+ 
+       /* if the call-back is running a quota refresh is already occurring */
+       if (hrtimer_callback_running(refresh_timer))
+@@ -4722,7 +4722,7 @@ static int runtime_refresh_within(struct cfs_bandwidth 
*cfs_b, u64 min_expire)
+ 
+       /* is a quota refresh about to occur? */
+       remaining = ktime_to_ns(hrtimer_expires_remaining(refresh_timer));
+-      if (remaining < min_expire)
++      if (remaining < (s64)min_expire)
+               return 1;
+ 
+       return 0;
+diff --git a/kernel/trace/ring_buffer.c b/kernel/trace/ring_buffer.c
+index 360129e475407..987d3447bf2a1 100644
+--- a/kernel/trace/ring_buffer.c
++++ b/kernel/trace/ring_buffer.c
+@@ -3172,10 +3172,30 @@ static bool rb_per_cpu_empty(struct 
ring_buffer_per_cpu *cpu_buffer)
+       if (unlikely(!head))
+               return true;
+ 
+-      return reader->read == rb_page_commit(reader) &&
+-              (commit == reader ||
+-               (commit == head &&
+-                head->read == rb_page_commit(commit)));
++      /* Reader should exhaust content in reader page */
++      if (reader->read != rb_page_commit(reader))
++              return false;
++
++      /*
++       * If writers are committing on the reader page, knowing all
++       * committed content has been read, the ring buffer is empty.
++       */
++      if (commit == reader)
++              return true;
++
++      /*
++       * If writers are committing on a page other than reader page
++       * and head page, there should always be content to read.
++       */
++      if (commit != head)
++              return false;
++
++      /*
++       * Writers are committing on the head page, we just need
++       * to care about there're committed data, and the reader will
++       * swap reader page with head page when it is to read data.
++       */
++      return rb_page_commit(commit) == 0;
+ }
+ 
+ /**
+diff --git a/mm/slab_common.c b/mm/slab_common.c
+index a94b9981eb172..282ac40c50704 100644
+--- a/mm/slab_common.c
++++ b/mm/slab_common.c
+@@ -311,14 +311,6 @@ int slab_unmergeable(struct kmem_cache *s)
+       if (s->refcount < 0)
+               return 1;
+ 
+-#ifdef CONFIG_MEMCG_KMEM
+-      /*
+-       * Skip the dying kmem_cache.
+-       */
+-      if (s->memcg_params.dying)
+-              return 1;
+-#endif
+-
+       return 0;
+ }
+ 
+@@ -918,6 +910,16 @@ void kmem_cache_destroy(struct kmem_cache *s)
+       get_online_mems();
+ 
+       mutex_lock(&slab_mutex);
++
++      /*
++       * Another thread referenced it again
++       */
++      if (READ_ONCE(s->refcount)) {
++              spin_lock_irq(&memcg_kmem_wq_lock);
++              s->memcg_params.dying = false;
++              spin_unlock_irq(&memcg_kmem_wq_lock);
++              goto out_unlock;
++      }
+ #endif
+ 
+       err = shutdown_memcg_caches(s);
+diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
+index ed2b6002ae537..5aa508a08a691 100644
+--- a/net/bridge/br_if.c
++++ b/net/bridge/br_if.c
+@@ -564,7 +564,7 @@ int br_add_if(struct net_bridge *br, struct net_device 
*dev,
+       struct net_bridge_port *p;
+       int err = 0;
+       unsigned br_hr, dev_hr;
+-      bool changed_addr;
++      bool changed_addr, fdb_synced = false;
+ 
+       /* Don't allow bridging non-ethernet like devices, or DSA-enabled
+        * master network devices since the bridge layer rx_handler prevents
+@@ -640,6 +640,19 @@ int br_add_if(struct net_bridge *br, struct net_device 
*dev,
+       list_add_rcu(&p->list, &br->port_list);
+ 
+       nbp_update_port_count(br);
++      if (!br_promisc_port(p) && (p->dev->priv_flags & IFF_UNICAST_FLT)) {
++              /* When updating the port count we also update all ports'
++               * promiscuous mode.
++               * A port leaving promiscuous mode normally gets the bridge's
++               * fdb synced to the unicast filter (if supported), however,
++               * `br_port_clear_promisc` does not distinguish between
++               * non-promiscuous ports and *new* ports, so we need to
++               * sync explicitly here.
++               */
++              fdb_synced = br_fdb_sync_static(br, p) == 0;
++              if (!fdb_synced)
++                      netdev_err(dev, "failed to sync bridge static fdb 
addresses to this port\n");
++      }
+ 
+       netdev_update_features(br->dev);
+ 
+@@ -680,6 +693,8 @@ int br_add_if(struct net_bridge *br, struct net_device 
*dev,
+       return 0;
+ 
+ err7:
++      if (fdb_synced)
++              br_fdb_unsync_static(br, p);
+       list_del_rcu(&p->list);
+       br_fdb_delete_by_port(br, p, 0, 1);
+       nbp_update_port_count(br);
+diff --git a/net/caif/caif_socket.c b/net/caif/caif_socket.c
+index 4b31f0aaa96d9..348b8cb0bc24c 100644
+--- a/net/caif/caif_socket.c
++++ b/net/caif/caif_socket.c
+@@ -539,7 +539,8 @@ static int caif_seqpkt_sendmsg(struct socket *sock, struct 
msghdr *msg,
+               goto err;
+ 
+       ret = -EINVAL;
+-      if (unlikely(msg->msg_iter.iov->iov_base == NULL))
++      if (unlikely(msg->msg_iter.nr_segs == 0) ||
++          unlikely(msg->msg_iter.iov->iov_base == NULL))
+               goto err;
+       noblock = msg->msg_flags & MSG_DONTWAIT;
+ 
+diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c
+index 0e6f32defd67b..cc70771059698 100644
+--- a/net/decnet/af_decnet.c
++++ b/net/decnet/af_decnet.c
+@@ -823,7 +823,7 @@ static int dn_auto_bind(struct socket *sock)
+ static int dn_confirm_accept(struct sock *sk, long *timeo, gfp_t allocation)
+ {
+       struct dn_scp *scp = DN_SK(sk);
+-      DEFINE_WAIT(wait);
++      DEFINE_WAIT_FUNC(wait, woken_wake_function);
+       int err;
+ 
+       if (scp->state != DN_CR)
+@@ -833,11 +833,11 @@ static int dn_confirm_accept(struct sock *sk, long 
*timeo, gfp_t allocation)
+       scp->segsize_loc = dst_metric_advmss(__sk_dst_get(sk));
+       dn_send_conn_conf(sk, allocation);
+ 
+-      prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
++      add_wait_queue(sk_sleep(sk), &wait);
+       for(;;) {
+               release_sock(sk);
+               if (scp->state == DN_CC)
+-                      *timeo = schedule_timeout(*timeo);
++                      *timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo);
+               lock_sock(sk);
+               err = 0;
+               if (scp->state == DN_RUN)
+@@ -851,9 +851,8 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, 
gfp_t allocation)
+               err = -EAGAIN;
+               if (!*timeo)
+                       break;
+-              prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
+       }
+-      finish_wait(sk_sleep(sk), &wait);
++      remove_wait_queue(sk_sleep(sk), &wait);
+       if (err == 0) {
+               sk->sk_socket->state = SS_CONNECTED;
+       } else if (scp->state != DN_CC) {
+@@ -865,7 +864,7 @@ static int dn_confirm_accept(struct sock *sk, long *timeo, 
gfp_t allocation)
+ static int dn_wait_run(struct sock *sk, long *timeo)
+ {
+       struct dn_scp *scp = DN_SK(sk);
+-      DEFINE_WAIT(wait);
++      DEFINE_WAIT_FUNC(wait, woken_wake_function);
+       int err = 0;
+ 
+       if (scp->state == DN_RUN)
+@@ -874,11 +873,11 @@ static int dn_wait_run(struct sock *sk, long *timeo)
+       if (!*timeo)
+               return -EALREADY;
+ 
+-      prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
++      add_wait_queue(sk_sleep(sk), &wait);
+       for(;;) {
+               release_sock(sk);
+               if (scp->state == DN_CI || scp->state == DN_CC)
+-                      *timeo = schedule_timeout(*timeo);
++                      *timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo);
+               lock_sock(sk);
+               err = 0;
+               if (scp->state == DN_RUN)
+@@ -892,9 +891,8 @@ static int dn_wait_run(struct sock *sk, long *timeo)
+               err = -ETIMEDOUT;
+               if (!*timeo)
+                       break;
+-              prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
+       }
+-      finish_wait(sk_sleep(sk), &wait);
++      remove_wait_queue(sk_sleep(sk), &wait);
+ out:
+       if (err == 0) {
+               sk->sk_socket->state = SS_CONNECTED;
+@@ -1039,16 +1037,16 @@ static void dn_user_copy(struct sk_buff *skb, struct 
optdata_dn *opt)
+ 
+ static struct sk_buff *dn_wait_for_connect(struct sock *sk, long *timeo)
+ {
+-      DEFINE_WAIT(wait);
++      DEFINE_WAIT_FUNC(wait, woken_wake_function);
+       struct sk_buff *skb = NULL;
+       int err = 0;
+ 
+-      prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
++      add_wait_queue(sk_sleep(sk), &wait);
+       for(;;) {
+               release_sock(sk);
+               skb = skb_dequeue(&sk->sk_receive_queue);
+               if (skb == NULL) {
+-                      *timeo = schedule_timeout(*timeo);
++                      *timeo = wait_woken(&wait, TASK_INTERRUPTIBLE, *timeo);
+                       skb = skb_dequeue(&sk->sk_receive_queue);
+               }
+               lock_sock(sk);
+@@ -1063,9 +1061,8 @@ static struct sk_buff *dn_wait_for_connect(struct sock 
*sk, long *timeo)
+               err = -EAGAIN;
+               if (!*timeo)
+                       break;
+-              prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
+       }
+-      finish_wait(sk_sleep(sk), &wait);
++      remove_wait_queue(sk_sleep(sk), &wait);
+ 
+       return skb == NULL ? ERR_PTR(err) : skb;
+ }
+diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c
+index bdd073ea300ae..30e93b4f831f6 100644
+--- a/net/ipv4/ip_tunnel.c
++++ b/net/ipv4/ip_tunnel.c
+@@ -330,7 +330,7 @@ static int ip_tunnel_bind_dev(struct net_device *dev)
+       }
+ 
+       dev->needed_headroom = t_hlen + hlen;
+-      mtu -= t_hlen;
++      mtu -= t_hlen + (dev->type == ARPHRD_ETHER ? dev->hard_header_len : 0);
+ 
+       if (mtu < IPV4_MIN_MTU)
+               mtu = IPV4_MIN_MTU;
+@@ -361,6 +361,9 @@ static struct ip_tunnel *ip_tunnel_create(struct net *net,
+       t_hlen = nt->hlen + sizeof(struct iphdr);
+       dev->min_mtu = ETH_MIN_MTU;
+       dev->max_mtu = IP_MAX_MTU - t_hlen;
++      if (dev->type == ARPHRD_ETHER)
++              dev->max_mtu -= dev->hard_header_len;
++
+       ip_tunnel_add(itn, nt);
+       return nt;
+ 
+@@ -502,13 +505,18 @@ static int tnl_update_pmtu(struct net_device *dev, 
struct sk_buff *skb,
+                           const struct iphdr *inner_iph)
+ {
+       struct ip_tunnel *tunnel = netdev_priv(dev);
+-      int pkt_size = skb->len - tunnel->hlen;
++      int pkt_size;
+       int mtu;
+ 
+-      if (df)
++      pkt_size = skb->len - tunnel->hlen;
++      pkt_size -= dev->type == ARPHRD_ETHER ? dev->hard_header_len : 0;
++
++      if (df) {
+               mtu = dst_mtu(&rt->dst) - (sizeof(struct iphdr) + tunnel->hlen);
+-      else
++              mtu -= dev->type == ARPHRD_ETHER ? dev->hard_header_len : 0;
++      } else {
+               mtu = skb_dst(skb) ? dst_mtu(skb_dst(skb)) : dev->mtu;
++      }
+ 
+       skb_dst_update_pmtu_no_confirm(skb, mtu);
+ 
+@@ -936,6 +944,9 @@ int __ip_tunnel_change_mtu(struct net_device *dev, int 
new_mtu, bool strict)
+       int t_hlen = tunnel->hlen + sizeof(struct iphdr);
+       int max_mtu = IP_MAX_MTU - t_hlen;
+ 
++      if (dev->type == ARPHRD_ETHER)
++              max_mtu -= dev->hard_header_len;
++
+       if (new_mtu < ETH_MIN_MTU)
+               return -EINVAL;
+ 
+@@ -1113,6 +1124,9 @@ int ip_tunnel_newlink(struct net_device *dev, struct 
nlattr *tb[],
+       if (tb[IFLA_MTU]) {
+               unsigned int max = IP_MAX_MTU - (nt->hlen + sizeof(struct 
iphdr));
+ 
++              if (dev->type == ARPHRD_ETHER)
++                      max -= dev->hard_header_len;
++
+               mtu = clamp(dev->mtu, (unsigned int)ETH_MIN_MTU, max);
+       }
+ 
+diff --git a/net/ipv4/tcp_fastopen.c b/net/ipv4/tcp_fastopen.c
+index 018a484773551..2ab371f555250 100644
+--- a/net/ipv4/tcp_fastopen.c
++++ b/net/ipv4/tcp_fastopen.c
+@@ -454,8 +454,15 @@ void tcp_fastopen_active_disable(struct sock *sk)
+ {
+       struct net *net = sock_net(sk);
+ 
++      /* Paired with READ_ONCE() in tcp_fastopen_active_should_disable() */
++      WRITE_ONCE(net->ipv4.tfo_active_disable_stamp, jiffies);
++
++      /* Paired with smp_rmb() in tcp_fastopen_active_should_disable().
++       * We want net->ipv4.tfo_active_disable_stamp to be updated first.
++       */
++      smp_mb__before_atomic();
+       atomic_inc(&net->ipv4.tfo_active_disable_times);
+-      net->ipv4.tfo_active_disable_stamp = jiffies;
++
+       NET_INC_STATS(net, LINUX_MIB_TCPFASTOPENBLACKHOLE);
+ }
+ 
+@@ -473,10 +480,16 @@ bool tcp_fastopen_active_should_disable(struct sock *sk)
+       if (!tfo_da_times)
+               return false;
+ 
++      /* Paired with smp_mb__before_atomic() in tcp_fastopen_active_disable() 
*/
++      smp_rmb();
++
+       /* Limit timout to max: 2^6 * initial timeout */
+       multiplier = 1 << min(tfo_da_times - 1, 6);
+-      timeout = multiplier * tfo_bh_timeout * HZ;
+-      if (time_before(jiffies, sock_net(sk)->ipv4.tfo_active_disable_stamp + 
timeout))
++
++      /* Paired with the WRITE_ONCE() in tcp_fastopen_active_disable(). */
++      timeout = READ_ONCE(sock_net(sk)->ipv4.tfo_active_disable_stamp) +
++                multiplier * tfo_bh_timeout * HZ;
++      if (time_before(jiffies, timeout))
+               return true;
+ 
+       /* Mark check bit so we can check for successful active TFO
+diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
+index ac6135555e24a..71236aa7388d7 100644
+--- a/net/ipv4/tcp_ipv4.c
++++ b/net/ipv4/tcp_ipv4.c
+@@ -348,7 +348,7 @@ void tcp_v4_mtu_reduced(struct sock *sk)
+ 
+       if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
+               return;
+-      mtu = tcp_sk(sk)->mtu_info;
++      mtu = READ_ONCE(tcp_sk(sk)->mtu_info);
+       dst = inet_csk_update_pmtu(sk, mtu);
+       if (!dst)
+               return;
+@@ -516,7 +516,7 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info)
+                       if (sk->sk_state == TCP_LISTEN)
+                               goto out;
+ 
+-                      tp->mtu_info = info;
++                      WRITE_ONCE(tp->mtu_info, info);
+                       if (!sock_owned_by_user(sk)) {
+                               tcp_v4_mtu_reduced(sk);
+                       } else {
+diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
+index 9b74041e8dd10..d55ee43cd1b8f 100644
+--- a/net/ipv4/tcp_output.c
++++ b/net/ipv4/tcp_output.c
+@@ -1472,6 +1472,7 @@ int tcp_mtu_to_mss(struct sock *sk, int pmtu)
+       return __tcp_mtu_to_mss(sk, pmtu) -
+              (tcp_sk(sk)->tcp_header_len - sizeof(struct tcphdr));
+ }
++EXPORT_SYMBOL(tcp_mtu_to_mss);
+ 
+ /* Inverse of above */
+ int tcp_mss_to_mtu(struct sock *sk, int mss)
+diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
+index 2ff9f774d4463..32f0d1bb3b6d5 100644
+--- a/net/ipv4/udp.c
++++ b/net/ipv4/udp.c
+@@ -997,7 +997,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, 
size_t len)
+       }
+ 
+       ipcm_init_sk(&ipc, inet);
+-      ipc.gso_size = up->gso_size;
++      ipc.gso_size = READ_ONCE(up->gso_size);
+ 
+       if (msg->msg_controllen) {
+               err = udp_cmsg_send(sk, msg, &ipc.gso_size);
+@@ -2505,7 +2505,7 @@ int udp_lib_setsockopt(struct sock *sk, int level, int 
optname,
+       case UDP_SEGMENT:
+               if (val < 0 || val > USHRT_MAX)
+                       return -EINVAL;
+-              up->gso_size = val;
++              WRITE_ONCE(up->gso_size, val);
+               break;
+ 
+       /*
+@@ -2599,7 +2599,7 @@ int udp_lib_getsockopt(struct sock *sk, int level, int 
optname,
+               break;
+ 
+       case UDP_SEGMENT:
+-              val = up->gso_size;
++              val = READ_ONCE(up->gso_size);
+               break;
+ 
+       /* The following two cannot be changed on UDP sockets, the return is
+diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
+index aa8f19f852cc7..fc36f3b0dceb3 100644
+--- a/net/ipv6/ip6_output.c
++++ b/net/ipv6/ip6_output.c
+@@ -459,7 +459,9 @@ int ip6_forward(struct sk_buff *skb)
+       if (skb_warn_if_lro(skb))
+               goto drop;
+ 
+-      if (!xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) {
++      if (!net->ipv6.devconf_all->disable_policy &&
++          !idev->cnf.disable_policy &&
++          !xfrm6_policy_check(NULL, XFRM_POLICY_FWD, skb)) {
+               __IP6_INC_STATS(net, idev, IPSTATS_MIB_INDISCARDS);
+               goto drop;
+       }
+diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
+index 8d822df83b082..e8d206725cb75 100644
+--- a/net/ipv6/tcp_ipv6.c
++++ b/net/ipv6/tcp_ipv6.c
+@@ -336,11 +336,20 @@ failure:
+ static void tcp_v6_mtu_reduced(struct sock *sk)
+ {
+       struct dst_entry *dst;
++      u32 mtu;
+ 
+       if ((1 << sk->sk_state) & (TCPF_LISTEN | TCPF_CLOSE))
+               return;
+ 
+-      dst = inet6_csk_update_pmtu(sk, tcp_sk(sk)->mtu_info);
++      mtu = READ_ONCE(tcp_sk(sk)->mtu_info);
++
++      /* Drop requests trying to increase our current mss.
++       * Check done in __ip6_rt_update_pmtu() is too late.
++       */
++      if (tcp_mtu_to_mss(sk, mtu) >= tcp_sk(sk)->mss_cache)
++              return;
++
++      dst = inet6_csk_update_pmtu(sk, mtu);
+       if (!dst)
+               return;
+ 
+@@ -419,6 +428,8 @@ static void tcp_v6_err(struct sk_buff *skb, struct 
inet6_skb_parm *opt,
+       }
+ 
+       if (type == ICMPV6_PKT_TOOBIG) {
++              u32 mtu = ntohl(info);
++
+               /* We are not interested in TCP_LISTEN and open_requests
+                * (SYN-ACKs send out by Linux are always <576bytes so
+                * they should go through unfragmented).
+@@ -429,7 +440,11 @@ static void tcp_v6_err(struct sk_buff *skb, struct 
inet6_skb_parm *opt,
+               if (!ip6_sk_accept_pmtu(sk))
+                       goto out;
+ 
+-              tp->mtu_info = ntohl(info);
++              if (mtu < IPV6_MIN_MTU)
++                      goto out;
++
++              WRITE_ONCE(tp->mtu_info, mtu);
++
+               if (!sock_owned_by_user(sk))
+                       tcp_v6_mtu_reduced(sk);
+               else if (!test_and_set_bit(TCP_MTU_REDUCED_DEFERRED,
+@@ -503,7 +518,8 @@ static int tcp_v6_send_synack(const struct sock *sk, 
struct dst_entry *dst,
+               opt = ireq->ipv6_opt;
+               if (!opt)
+                       opt = rcu_dereference(np->opt);
+-              err = ip6_xmit(sk, skb, fl6, sk->sk_mark, opt, np->tclass);
++              err = ip6_xmit(sk, skb, fl6, skb->mark ? : sk->sk_mark, opt,
++                             np->tclass);
+               rcu_read_unlock();
+               err = net_xmit_eval(err);
+       }
+diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
+index c4a76c6af205d..042ab5428a4ff 100644
+--- a/net/ipv6/udp.c
++++ b/net/ipv6/udp.c
+@@ -1175,7 +1175,7 @@ int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, 
size_t len)
+       int (*getfrag)(void *, char *, int, int, int, struct sk_buff *);
+ 
+       ipcm6_init(&ipc6);
+-      ipc6.gso_size = up->gso_size;
++      ipc6.gso_size = READ_ONCE(up->gso_size);
+       ipc6.sockc.tsflags = sk->sk_tsflags;
+ 
+       /* destination address check */
+diff --git a/net/ipv6/xfrm6_output.c b/net/ipv6/xfrm6_output.c
+index 71d022704923c..b5941c9475f36 100644
+--- a/net/ipv6/xfrm6_output.c
++++ b/net/ipv6/xfrm6_output.c
+@@ -146,7 +146,7 @@ static int __xfrm6_output(struct net *net, struct sock 
*sk, struct sk_buff *skb)
+ {
+       struct dst_entry *dst = skb_dst(skb);
+       struct xfrm_state *x = dst->xfrm;
+-      int mtu;
++      unsigned int mtu;
+       bool toobig;
+ 
+ #ifdef CONFIG_NETFILTER
+diff --git a/net/netfilter/nf_conntrack_netlink.c 
b/net/netfilter/nf_conntrack_netlink.c
+index 15c9fbcd32f29..2850a638401d5 100644
+--- a/net/netfilter/nf_conntrack_netlink.c
++++ b/net/netfilter/nf_conntrack_netlink.c
+@@ -213,6 +213,7 @@ static int ctnetlink_dump_helpinfo(struct sk_buff *skb,
+       if (!help)
+               return 0;
+ 
++      rcu_read_lock();
+       helper = rcu_dereference(help->helper);
+       if (!helper)
+               goto out;
+@@ -228,9 +229,11 @@ static int ctnetlink_dump_helpinfo(struct sk_buff *skb,
+ 
+       nla_nest_end(skb, nest_helper);
+ out:
++      rcu_read_unlock();
+       return 0;
+ 
+ nla_put_failure:
++      rcu_read_unlock();
+       return -1;
+ }
+ 
+diff --git a/net/netrom/nr_timer.c b/net/netrom/nr_timer.c
+index 908e53ab47a47..426d496095244 100644
+--- a/net/netrom/nr_timer.c
++++ b/net/netrom/nr_timer.c
+@@ -124,11 +124,9 @@ static void nr_heartbeat_expiry(struct timer_list *t)
+                  is accepted() it isn't 'dead' so doesn't get removed. */
+               if (sock_flag(sk, SOCK_DESTROY) ||
+                   (sk->sk_state == TCP_LISTEN && sock_flag(sk, SOCK_DEAD))) {
+-                      sock_hold(sk);
+                       bh_unlock_sock(sk);
+                       nr_destroy_socket(sk);
+-                      sock_put(sk);
+-                      return;
++                      goto out;
+               }
+               break;
+ 
+@@ -149,6 +147,8 @@ static void nr_heartbeat_expiry(struct timer_list *t)
+ 
+       nr_start_heartbeat(sk);
+       bh_unlock_sock(sk);
++out:
++      sock_put(sk);
+ }
+ 
+ static void nr_t2timer_expiry(struct timer_list *t)
+@@ -162,6 +162,7 @@ static void nr_t2timer_expiry(struct timer_list *t)
+               nr_enquiry_response(sk);
+       }
+       bh_unlock_sock(sk);
++      sock_put(sk);
+ }
+ 
+ static void nr_t4timer_expiry(struct timer_list *t)
+@@ -172,6 +173,7 @@ static void nr_t4timer_expiry(struct timer_list *t)
+       bh_lock_sock(sk);
+       nr_sk(sk)->condition &= ~NR_COND_PEER_RX_BUSY;
+       bh_unlock_sock(sk);
++      sock_put(sk);
+ }
+ 
+ static void nr_idletimer_expiry(struct timer_list *t)
+@@ -200,6 +202,7 @@ static void nr_idletimer_expiry(struct timer_list *t)
+               sock_set_flag(sk, SOCK_DEAD);
+       }
+       bh_unlock_sock(sk);
++      sock_put(sk);
+ }
+ 
+ static void nr_t1timer_expiry(struct timer_list *t)
+@@ -212,8 +215,7 @@ static void nr_t1timer_expiry(struct timer_list *t)
+       case NR_STATE_1:
+               if (nr->n2count == nr->n2) {
+                       nr_disconnect(sk, ETIMEDOUT);
+-                      bh_unlock_sock(sk);
+-                      return;
++                      goto out;
+               } else {
+                       nr->n2count++;
+                       nr_write_internal(sk, NR_CONNREQ);
+@@ -223,8 +225,7 @@ static void nr_t1timer_expiry(struct timer_list *t)
+       case NR_STATE_2:
+               if (nr->n2count == nr->n2) {
+                       nr_disconnect(sk, ETIMEDOUT);
+-                      bh_unlock_sock(sk);
+-                      return;
++                      goto out;
+               } else {
+                       nr->n2count++;
+                       nr_write_internal(sk, NR_DISCREQ);
+@@ -234,8 +235,7 @@ static void nr_t1timer_expiry(struct timer_list *t)
+       case NR_STATE_3:
+               if (nr->n2count == nr->n2) {
+                       nr_disconnect(sk, ETIMEDOUT);
+-                      bh_unlock_sock(sk);
+-                      return;
++                      goto out;
+               } else {
+                       nr->n2count++;
+                       nr_requeue_frames(sk);
+@@ -244,5 +244,7 @@ static void nr_t1timer_expiry(struct timer_list *t)
+       }
+ 
+       nr_start_t1timer(sk);
++out:
+       bh_unlock_sock(sk);
++      sock_put(sk);
+ }
+diff --git a/net/sched/act_skbmod.c b/net/sched/act_skbmod.c
+index 21d1952961217..03a272af664ae 100644
+--- a/net/sched/act_skbmod.c
++++ b/net/sched/act_skbmod.c
+@@ -10,6 +10,7 @@
+ */
+ 
+ #include <linux/module.h>
++#include <linux/if_arp.h>
+ #include <linux/init.h>
+ #include <linux/kernel.h>
+ #include <linux/skbuff.h>
+@@ -36,6 +37,13 @@ static int tcf_skbmod_act(struct sk_buff *skb, const struct 
tc_action *a,
+       tcf_lastuse_update(&d->tcf_tm);
+       bstats_cpu_update(this_cpu_ptr(d->common.cpu_bstats), skb);
+ 
++      action = READ_ONCE(d->tcf_action);
++      if (unlikely(action == TC_ACT_SHOT))
++              goto drop;
++
++      if (!skb->dev || skb->dev->type != ARPHRD_ETHER)
++              return action;
++
+       /* XXX: if you are going to edit more fields beyond ethernet header
+        * (example when you add IP header replacement or vlan swap)
+        * then MAX_EDIT_LEN needs to change appropriately
+@@ -44,10 +52,6 @@ static int tcf_skbmod_act(struct sk_buff *skb, const struct 
tc_action *a,
+       if (unlikely(err)) /* best policy is to drop on the floor */
+               goto drop;
+ 
+-      action = READ_ONCE(d->tcf_action);
+-      if (unlikely(action == TC_ACT_SHOT))
+-              goto drop;
+-
+       p = rcu_dereference_bh(d->skbmod_p);
+       flags = p->flags;
+       if (flags & SKBMOD_F_DMAC)
+diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
+index 184c20b86393b..4413aa8d4e829 100644
+--- a/net/sched/cls_api.c
++++ b/net/sched/cls_api.c
+@@ -1918,7 +1918,7 @@ replay:
+               break;
+       case RTM_GETCHAIN:
+               err = tc_chain_notify(chain, skb, n->nlmsg_seq,
+-                                    n->nlmsg_seq, n->nlmsg_type, true);
++                                    n->nlmsg_flags, n->nlmsg_type, true);
+               if (err < 0)
+                       NL_SET_ERR_MSG(extack, "Failed to send chain notify 
message");
+               break;
+diff --git a/net/sctp/auth.c b/net/sctp/auth.c
+index 2bd8c80bd85fb..b2ca66c4a21d2 100644
+--- a/net/sctp/auth.c
++++ b/net/sctp/auth.c
+@@ -883,6 +883,8 @@ int sctp_auth_set_key(struct sctp_endpoint *ep,
+       if (replace) {
+               list_del_init(&shkey->key_list);
+               sctp_auth_shkey_release(shkey);
++              if (asoc && asoc->active_key_id == auth_key->sca_keynumber)
++                      sctp_auth_asoc_init_active_key(asoc, GFP_KERNEL);
+       }
+       list_add(&cur_key->key_list, sh_keys);
+ 
+diff --git a/scripts/mkcompile_h b/scripts/mkcompile_h
+index 87f1fc9801d73..662fe19da990b 100755
+--- a/scripts/mkcompile_h
++++ b/scripts/mkcompile_h
+@@ -78,15 +78,23 @@ UTS_TRUNCATE="cut -b -$UTS_LEN"
+ # Only replace the real compile.h if the new one is different,
+ # in order to preserve the timestamp and avoid unnecessary
+ # recompilations.
+-# We don't consider the file changed if only the date/time changed.
++# We don't consider the file changed if only the date/time changed,
++# unless KBUILD_BUILD_TIMESTAMP was explicitly set (e.g. for
++# reproducible builds with that value referring to a commit timestamp).
+ # A kernel config change will increase the generation number, thus
+ # causing compile.h to be updated (including date/time) due to the
+ # changed comment in the
+ # first line.
+ 
++if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then
++   IGNORE_PATTERN="UTS_VERSION"
++else
++   IGNORE_PATTERN="NOT_A_PATTERN_TO_BE_MATCHED"
++fi
++
+ if [ -r $TARGET ] && \
+-      grep -v 'UTS_VERSION' $TARGET > .tmpver.1 && \
+-      grep -v 'UTS_VERSION' .tmpcompile > .tmpver.2 && \
++      grep -v $IGNORE_PATTERN $TARGET > .tmpver.1 && \
++      grep -v $IGNORE_PATTERN .tmpcompile > .tmpver.2 && \
+       cmp -s .tmpver.1 .tmpver.2; then
+    rm -f .tmpcompile
+ else
+diff --git a/sound/isa/sb/sb16_csp.c b/sound/isa/sb/sb16_csp.c
+index b3eecde0b6125..c16c8151160c3 100644
+--- a/sound/isa/sb/sb16_csp.c
++++ b/sound/isa/sb/sb16_csp.c
+@@ -828,6 +828,7 @@ static int snd_sb_csp_start(struct snd_sb_csp * p, int 
sample_width, int channel
+       mixR = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV + 1);
+       snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL & 0x7);
+       snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR & 0x7);
++      spin_unlock_irqrestore(&p->chip->mixer_lock, flags);
+ 
+       spin_lock(&p->chip->reg_lock);
+       set_mode_register(p->chip, 0xc0);       /* c0 = STOP */
+@@ -867,6 +868,7 @@ static int snd_sb_csp_start(struct snd_sb_csp * p, int 
sample_width, int channel
+       spin_unlock(&p->chip->reg_lock);
+ 
+       /* restore PCM volume */
++      spin_lock_irqsave(&p->chip->mixer_lock, flags);
+       snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL);
+       snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR);
+       spin_unlock_irqrestore(&p->chip->mixer_lock, flags);
+@@ -892,6 +894,7 @@ static int snd_sb_csp_stop(struct snd_sb_csp * p)
+       mixR = snd_sbmixer_read(p->chip, SB_DSP4_PCM_DEV + 1);
+       snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL & 0x7);
+       snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR & 0x7);
++      spin_unlock_irqrestore(&p->chip->mixer_lock, flags);
+ 
+       spin_lock(&p->chip->reg_lock);
+       if (p->running & SNDRV_SB_CSP_ST_QSOUND) {
+@@ -906,6 +909,7 @@ static int snd_sb_csp_stop(struct snd_sb_csp * p)
+       spin_unlock(&p->chip->reg_lock);
+ 
+       /* restore PCM volume */
++      spin_lock_irqsave(&p->chip->mixer_lock, flags);
+       snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV, mixL);
+       snd_sbmixer_write(p->chip, SB_DSP4_PCM_DEV + 1, mixR);
+       spin_unlock_irqrestore(&p->chip->mixer_lock, flags);
+diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
+index b5f2b18b8b422..87d3ea9796384 100644
+--- a/sound/usb/quirks.c
++++ b/sound/usb/quirks.c
+@@ -1553,6 +1553,9 @@ static const struct registration_quirk 
registration_quirks[] = {
+       REG_QUIRK_ENTRY(0x0951, 0x16d8, 2),     /* Kingston HyperX AMP */
+       REG_QUIRK_ENTRY(0x0951, 0x16ed, 2),     /* Kingston HyperX Cloud Alpha 
S */
+       REG_QUIRK_ENTRY(0x0951, 0x16ea, 2),     /* Kingston HyperX Cloud Flight 
S */
++      REG_QUIRK_ENTRY(0x0ecb, 0x1f46, 2),     /* JBL Quantum 600 */
++      REG_QUIRK_ENTRY(0x0ecb, 0x2039, 2),     /* JBL Quantum 400 */
++      REG_QUIRK_ENTRY(0x0ecb, 0x203e, 2),     /* JBL Quantum 800 */
+       { 0 }                                   /* terminator */
+ };
+ 
+diff --git a/tools/bpf/bpftool/common.c b/tools/bpf/bpftool/common.c
+index 158469f57461d..7faf24ef3c80b 100644
+--- a/tools/bpf/bpftool/common.c
++++ b/tools/bpf/bpftool/common.c
+@@ -182,6 +182,11 @@ int do_pin_fd(int fd, const char *name)
+               goto out;
+ 
+       file = malloc(strlen(name) + 1);
++      if (!file) {
++              p_err("mem alloc failed");
++              return -1;
++      }
++
+       strcpy(file, name);
+       dir = dirname(file);
+ 
+diff --git a/tools/bpf/bpftool/jit_disasm.c b/tools/bpf/bpftool/jit_disasm.c
+index 73d7252729fad..e4cfbecf02189 100644
+--- a/tools/bpf/bpftool/jit_disasm.c
++++ b/tools/bpf/bpftool/jit_disasm.c
+@@ -51,11 +51,13 @@ static int fprintf_json(void *out, const char *fmt, ...)
+ {
+       va_list ap;
+       char *s;
++      int err;
+ 
+       va_start(ap, fmt);
+-      if (vasprintf(&s, fmt, ap) < 0)
+-              return -1;
++      err = vasprintf(&s, fmt, ap);
+       va_end(ap);
++      if (err < 0)
++              return -1;
+ 
+       if (!oper_count) {
+               int i;
+diff --git a/tools/perf/tests/bpf.c b/tools/perf/tests/bpf.c
+index 79b54f8ddebf7..df478f67b6b63 100644
+--- a/tools/perf/tests/bpf.c
++++ b/tools/perf/tests/bpf.c
+@@ -1,5 +1,6 @@
+ #include <errno.h>
+ #include <stdio.h>
++#include <stdlib.h>
+ #include <sys/epoll.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
+@@ -277,6 +278,7 @@ static int __test__bpf(int idx)
+       }
+ 
+ out:
++      free(obj_buf);
+       bpf__clear();
+       return ret;
+ }
+diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
+index 56f86317694d2..1231f31810413 100644
+--- a/tools/perf/util/dso.c
++++ b/tools/perf/util/dso.c
+@@ -1025,8 +1025,10 @@ struct map *dso__new_map(const char *name)
+       struct map *map = NULL;
+       struct dso *dso = dso__new(name);
+ 
+-      if (dso)
++      if (dso) {
+               map = map__new2(0, dso);
++              dso__put(dso);
++      }
+ 
+       return map;
+ }
+diff --git a/tools/perf/util/lzma.c b/tools/perf/util/lzma.c
+index b1dd29a9d915e..6c844110fc250 100644
+--- a/tools/perf/util/lzma.c
++++ b/tools/perf/util/lzma.c
+@@ -68,7 +68,7 @@ int lzma_decompress_to_file(const char *input, int output_fd)
+ 
+                       if (ferror(infile)) {
+                               pr_err("lzma: read error: %s\n", 
strerror(errno));
+-                              goto err_fclose;
++                              goto err_lzma_end;
+                       }
+ 
+                       if (feof(infile))
+@@ -82,7 +82,7 @@ int lzma_decompress_to_file(const char *input, int output_fd)
+ 
+                       if (writen(output_fd, buf_out, write_size) != 
write_size) {
+                               pr_err("lzma: write error: %s\n", 
strerror(errno));
+-                              goto err_fclose;
++                              goto err_lzma_end;
+                       }
+ 
+                       strm.next_out  = buf_out;
+@@ -94,11 +94,13 @@ int lzma_decompress_to_file(const char *input, int 
output_fd)
+                               break;
+ 
+                       pr_err("lzma: failed %s\n", lzma_strerror(ret));
+-                      goto err_fclose;
++                      goto err_lzma_end;
+               }
+       }
+ 
+       err = 0;
++err_lzma_end:
++      lzma_end(&strm);
+ err_fclose:
+       fclose(infile);
+       return err;
+diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
+index 769d11575a7b3..603086692290f 100644
+--- a/tools/perf/util/map.c
++++ b/tools/perf/util/map.c
+@@ -209,6 +209,8 @@ struct map *map__new(struct machine *machine, u64 start, 
u64 len,
+                       if (!(prot & PROT_EXEC))
+                               dso__set_loaded(dso);
+               }
++
++              nsinfo__put(dso->nsinfo);
+               dso->nsinfo = nsi;
+               dso__put(dso);
+       }
+diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c
+index 4ac3c89bfac82..633fa5425fd9d 100644
+--- a/tools/perf/util/probe-event.c
++++ b/tools/perf/util/probe-event.c
+@@ -184,8 +184,10 @@ struct map *get_target_map(const char *target, struct 
nsinfo *nsi, bool user)
+               struct map *map;
+ 
+               map = dso__new_map(target);
+-              if (map && map->dso)
++              if (map && map->dso) {
++                      nsinfo__put(map->dso->nsinfo);
+                       map->dso->nsinfo = nsinfo__get(nsi);
++              }
+               return map;
+       } else {
+               return kernel_get_module_map(target);
+diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c
+index 6a6548890d5a1..b67ae3b8d9960 100644
+--- a/tools/perf/util/probe-file.c
++++ b/tools/perf/util/probe-file.c
+@@ -342,11 +342,11 @@ int probe_file__del_events(int fd, struct strfilter 
*filter)
+ 
+       ret = probe_file__get_events(fd, filter, namelist);
+       if (ret < 0)
+-              return ret;
++              goto out;
+ 
+       ret = probe_file__del_strlist(fd, namelist);
++out:
+       strlist__delete(namelist);
+-
+       return ret;
+ }
+ 
+diff --git a/tools/testing/selftests/vm/userfaultfd.c 
b/tools/testing/selftests/vm/userfaultfd.c
+index 7b8171e3128a8..16d42b2de424e 100644
+--- a/tools/testing/selftests/vm/userfaultfd.c
++++ b/tools/testing/selftests/vm/userfaultfd.c
+@@ -129,8 +129,10 @@ static int anon_release_pages(char *rel_area)
+ 
+ static void anon_allocate_area(void **alloc_area)
+ {
+-      if (posix_memalign(alloc_area, page_size, nr_pages * page_size)) {
+-              fprintf(stderr, "out of memory\n");
++      *alloc_area = mmap(NULL, nr_pages * page_size, PROT_READ | PROT_WRITE,
++                         MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
++      if (*alloc_area == MAP_FAILED)
++              fprintf(stderr, "mmap of anonymous memory failed");
+               *alloc_area = NULL;
+       }
+ }
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index 1ecb27b3421a7..a3d82113ae1ce 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -1489,15 +1489,24 @@ static bool vma_is_valid(struct vm_area_struct *vma, 
bool write_fault)
+       return true;
+ }
+ 
++static int kvm_try_get_pfn(kvm_pfn_t pfn)
++{
++      if (kvm_is_reserved_pfn(pfn))
++              return 1;
++      return get_page_unless_zero(pfn_to_page(pfn));
++}
++
+ static int hva_to_pfn_remapped(struct vm_area_struct *vma,
+                              unsigned long addr, bool *async,
+                              bool write_fault, bool *writable,
+                              kvm_pfn_t *p_pfn)
+ {
+-      unsigned long pfn;
++      kvm_pfn_t pfn;
++      pte_t *ptep;
++      spinlock_t *ptl;
+       int r;
+ 
+-      r = follow_pfn(vma, addr, &pfn);
++      r = follow_pte_pmd(vma->vm_mm, addr, NULL, NULL, &ptep, NULL, &ptl);
+       if (r) {
+               /*
+                * get_user_pages fails for VM_IO and VM_PFNMAP vmas and does
+@@ -1512,14 +1521,19 @@ static int hva_to_pfn_remapped(struct vm_area_struct 
*vma,
+               if (r)
+                       return r;
+ 
+-              r = follow_pfn(vma, addr, &pfn);
++              r = follow_pte_pmd(vma->vm_mm, addr, NULL, NULL, &ptep, NULL, 
&ptl);
+               if (r)
+                       return r;
++      }
+ 
++      if (write_fault && !pte_write(*ptep)) {
++              pfn = KVM_PFN_ERR_RO_FAULT;
++              goto out;
+       }
+ 
+       if (writable)
+-              *writable = true;
++              *writable = pte_write(*ptep);
++      pfn = pte_pfn(*ptep);
+ 
+       /*
+        * Get a reference here because callers of *hva_to_pfn* and
+@@ -1531,11 +1545,21 @@ static int hva_to_pfn_remapped(struct vm_area_struct 
*vma,
+        * Whoever called remap_pfn_range is also going to call e.g.
+        * unmap_mapping_range before the underlying pages are freed,
+        * causing a call to our MMU notifier.
++       *
++       * Certain IO or PFNMAP mappings can be backed with valid
++       * struct pages, but be allocated without refcounting e.g.,
++       * tail pages of non-compound higher order allocations, which
++       * would then underflow the refcount when the caller does the
++       * required put_page. Don't allow those pages here.
+        */ 
+-      kvm_get_pfn(pfn);
++      if (!kvm_try_get_pfn(pfn))
++              r = -EFAULT;
+ 
++out:
++      pte_unmap_unlock(ptep, ptl);
+       *p_pfn = pfn;
+-      return 0;
++
++      return r;
+ }
+ 
+ /*

Reply via email to