commit:     32bd5f68e22d35c9e6ba5f37eebfbcc26657c289
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Thu Feb  6 11:06:51 2020 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Thu Feb  6 11:06:51 2020 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=32bd5f68

Linux patch 5.4.18

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

 0000_README             |    4 +
 1017_linux-5.4.18.patch | 3992 +++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3996 insertions(+)

diff --git a/0000_README b/0000_README
index 7269f88..a0fadf6 100644
--- a/0000_README
+++ b/0000_README
@@ -111,6 +111,10 @@ Patch:  1016_linux-5.4.17.patch
 From:   http://www.kernel.org
 Desc:   Linux 5.4.17
 
+Patch:  1017_linux-5.4.18.patch
+From:   http://www.kernel.org
+Desc:   Linux 5.4.18
+
 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/1017_linux-5.4.18.patch b/1017_linux-5.4.18.patch
new file mode 100644
index 0000000..aa79549
--- /dev/null
+++ b/1017_linux-5.4.18.patch
@@ -0,0 +1,3992 @@
+diff --git a/Documentation/ABI/testing/sysfs-class-devfreq 
b/Documentation/ABI/testing/sysfs-class-devfreq
+index 01196e19afca..75897e2fde43 100644
+--- a/Documentation/ABI/testing/sysfs-class-devfreq
++++ b/Documentation/ABI/testing/sysfs-class-devfreq
+@@ -7,6 +7,13 @@ Description:
+               The name of devfreq object denoted as ... is same as the
+               name of device using devfreq.
+ 
++What:         /sys/class/devfreq/.../name
++Date:         November 2019
++Contact:      Chanwoo Choi <[email protected]>
++Description:
++              The /sys/class/devfreq/.../name shows the name of device
++              of the corresponding devfreq object.
++
+ What:         /sys/class/devfreq/.../governor
+ Date:         September 2011
+ Contact:      MyungJoo Ham <[email protected]>
+diff --git a/Makefile b/Makefile
+index a363a539a092..b6c151fd5227 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 4
+-SUBLEVEL = 17
++SUBLEVEL = 18
+ EXTRAVERSION =
+ NAME = Kleptomaniac Octopus
+ 
+diff --git a/arch/arm/boot/dts/am335x-boneblack-common.dtsi 
b/arch/arm/boot/dts/am335x-boneblack-common.dtsi
+index 7ad079861efd..91f93bc89716 100644
+--- a/arch/arm/boot/dts/am335x-boneblack-common.dtsi
++++ b/arch/arm/boot/dts/am335x-boneblack-common.dtsi
+@@ -131,6 +131,11 @@
+ };
+ 
+ / {
++      memory@80000000 {
++              device_type = "memory";
++              reg = <0x80000000 0x20000000>; /* 512 MB */
++      };
++
+       clk_mcasp0_fixed: clk_mcasp0_fixed {
+               #clock-cells = <0>;
+               compatible = "fixed-clock";
+diff --git a/arch/arm/boot/dts/am43x-epos-evm.dts 
b/arch/arm/boot/dts/am43x-epos-evm.dts
+index 078cb473fa7d..a6fbc088daa8 100644
+--- a/arch/arm/boot/dts/am43x-epos-evm.dts
++++ b/arch/arm/boot/dts/am43x-epos-evm.dts
+@@ -848,6 +848,7 @@
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&spi0_pins_default>;
+       pinctrl-1 = <&spi0_pins_sleep>;
++      ti,pindir-d0-out-d1-in = <1>;
+ };
+ 
+ &spi1 {
+@@ -855,6 +856,7 @@
+       pinctrl-names = "default", "sleep";
+       pinctrl-0 = <&spi1_pins_default>;
+       pinctrl-1 = <&spi1_pins_sleep>;
++      ti,pindir-d0-out-d1-in = <1>;
+ };
+ 
+ &usb2_phy1 {
+diff --git a/arch/arm/boot/dts/am571x-idk.dts 
b/arch/arm/boot/dts/am571x-idk.dts
+index 9d6a872c2b23..10105a497c1a 100644
+--- a/arch/arm/boot/dts/am571x-idk.dts
++++ b/arch/arm/boot/dts/am571x-idk.dts
+@@ -170,10 +170,6 @@
+       gpios = <&gpio5 18 GPIO_ACTIVE_HIGH>;
+ };
+ 
+-&pcie1_ep {
+-      gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+-};
+-
+ &mmc1 {
+       pinctrl-names = "default", "hs";
+       pinctrl-0 = <&mmc1_pins_default_no_clk_pu>;
+diff --git a/arch/arm/boot/dts/am572x-idk-common.dtsi 
b/arch/arm/boot/dts/am572x-idk-common.dtsi
+index a064f13b3880..ddf123620e96 100644
+--- a/arch/arm/boot/dts/am572x-idk-common.dtsi
++++ b/arch/arm/boot/dts/am572x-idk-common.dtsi
+@@ -147,10 +147,6 @@
+       gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+ };
+ 
+-&pcie1_ep {
+-      gpios = <&gpio3 23 GPIO_ACTIVE_HIGH>;
+-};
+-
+ &mailbox5 {
+       status = "okay";
+       mbox_ipu1_ipc3x: mbox_ipu1_ipc3x {
+diff --git a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi 
b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi
+index bc76f1705c0f..a813a0cf3ff3 100644
+--- a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi
++++ b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi
+@@ -29,6 +29,27 @@
+               reg = <0x0 0x80000000 0x0 0x80000000>;
+       };
+ 
++      main_12v0: fixedregulator-main_12v0 {
++              /* main supply */
++              compatible = "regulator-fixed";
++              regulator-name = "main_12v0";
++              regulator-min-microvolt = <12000000>;
++              regulator-max-microvolt = <12000000>;
++              regulator-always-on;
++              regulator-boot-on;
++      };
++
++      evm_5v0: fixedregulator-evm_5v0 {
++              /* Output of TPS54531D */
++              compatible = "regulator-fixed";
++              regulator-name = "evm_5v0";
++              regulator-min-microvolt = <5000000>;
++              regulator-max-microvolt = <5000000>;
++              vin-supply = <&main_12v0>;
++              regulator-always-on;
++              regulator-boot-on;
++      };
++
+       vdd_3v3: fixedregulator-vdd_3v3 {
+               compatible = "regulator-fixed";
+               regulator-name = "vdd_3v3";
+@@ -547,10 +568,6 @@
+       gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
+ };
+ 
+-&pcie1_ep {
+-      gpios = <&gpio2 8 GPIO_ACTIVE_LOW>;
+-};
+-
+ &mcasp3 {
+       #sound-dai-cells = <0>;
+       assigned-clocks = <&l4per2_clkctrl DRA7_L4PER2_MCASP3_CLKCTRL 24>;
+diff --git a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts 
b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
+index fb928503ad45..d9be511f054f 100644
+--- a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
++++ b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
+@@ -101,7 +101,7 @@
+               initial-mode = <1>; /* initialize in HUB mode */
+               disabled-ports = <1>;
+               intn-gpios = <&pio 7 5 GPIO_ACTIVE_HIGH>; /* PH5 */
+-              reset-gpios = <&pio 4 16 GPIO_ACTIVE_HIGH>; /* PE16 */
++              reset-gpios = <&pio 4 16 GPIO_ACTIVE_LOW>; /* PE16 */
+               connect-gpios = <&pio 4 17 GPIO_ACTIVE_HIGH>; /* PE17 */
+               refclk-frequency = <19200000>;
+       };
+diff --git a/arch/arm/kernel/hyp-stub.S b/arch/arm/kernel/hyp-stub.S
+index ae5020302de4..6607fa817bba 100644
+--- a/arch/arm/kernel/hyp-stub.S
++++ b/arch/arm/kernel/hyp-stub.S
+@@ -146,10 +146,9 @@ ARM_BE8(orr       r7, r7, #(1 << 25))     @ HSCTLR.EE
+ #if !defined(ZIMAGE) && defined(CONFIG_ARM_ARCH_TIMER)
+       @ make CNTP_* and CNTPCT accessible from PL1
+       mrc     p15, 0, r7, c0, c1, 1   @ ID_PFR1
+-      lsr     r7, #16
+-      and     r7, #0xf
+-      cmp     r7, #1
+-      bne     1f
++      ubfx    r7, r7, #16, #4
++      teq     r7, #0
++      beq     1f
+       mrc     p15, 4, r7, c14, c1, 0  @ CNTHCTL
+       orr     r7, r7, #3              @ PL1PCEN | PL1PCTEN
+       mcr     p15, 4, r7, c14, c1, 0  @ CNTHCTL
+diff --git a/arch/arm64/boot/Makefile b/arch/arm64/boot/Makefile
+index 1f012c506434..cd3414898d10 100644
+--- a/arch/arm64/boot/Makefile
++++ b/arch/arm64/boot/Makefile
+@@ -16,7 +16,7 @@
+ 
+ OBJCOPYFLAGS_Image :=-O binary -R .note -R .note.gnu.build-id -R .comment -S
+ 
+-targets := Image Image.gz
++targets := Image Image.bz2 Image.gz Image.lz4 Image.lzma Image.lzo
+ 
+ $(obj)/Image: vmlinux FORCE
+       $(call if_changed,objcopy)
+diff --git a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts 
b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts
+index 3435aaa4e8db..5d6a8dafe8dc 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts
++++ b/arch/arm64/boot/dts/amlogic/meson-sm1-sei610.dts
+@@ -361,6 +361,8 @@
+ 
+       bluetooth {
+               compatible = "brcm,bcm43438-bt";
++              interrupt-parent = <&gpio_intc>;
++              interrupts = <95 IRQ_TYPE_LEVEL_HIGH>;
+               shutdown-gpios = <&gpio GPIOX_17 GPIO_ACTIVE_HIGH>;
+               max-speed = <2000000>;
+               clocks = <&wifi32k>;
+diff --git a/arch/parisc/kernel/drivers.c b/arch/parisc/kernel/drivers.c
+index a6c9f49c6612..a5f3e50fe976 100644
+--- a/arch/parisc/kernel/drivers.c
++++ b/arch/parisc/kernel/drivers.c
+@@ -889,8 +889,8 @@ static void print_parisc_device(struct parisc_device *dev)
+       static int count;
+ 
+       print_pa_hwpath(dev, hw_path);
+-      pr_info("%d. %s at 0x%px [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }",
+-              ++count, dev->name, (void*) dev->hpa.start, hw_path, 
dev->id.hw_type,
++      pr_info("%d. %s at %pap [%s] { %d, 0x%x, 0x%.3x, 0x%.5x }",
++              ++count, dev->name, &(dev->hpa.start), hw_path, dev->id.hw_type,
+               dev->id.hversion_rev, dev->id.hversion, dev->id.sversion);
+ 
+       if (dev->num_addrs) {
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi
+index e1a961f05dcd..baa0c503e741 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0-best-effort.dtsi
+@@ -63,6 +63,7 @@ fman@400000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe1000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy0: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi
+index c288f3c6c637..93095600e808 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-0.dtsi
+@@ -60,6 +60,7 @@ fman@400000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xf1000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy6: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi
+index 94f3e7175012..ff4bd38f0645 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1-best-effort.dtsi
+@@ -63,6 +63,7 @@ fman@400000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe3000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy1: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi
+index 94a76982d214..1fa38ed6f59e 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-10g-1.dtsi
+@@ -60,6 +60,7 @@ fman@400000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xf3000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy7: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi
+index b5ff5f71c6b8..a8cc9780c0c4 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-0.dtsi
+@@ -59,6 +59,7 @@ fman@400000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe1000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy0: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi
+index ee44182c6348..8b8bd70c9382 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-1.dtsi
+@@ -59,6 +59,7 @@ fman@400000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe3000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy1: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi
+index f05f0d775039..619c880b54d8 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-2.dtsi
+@@ -59,6 +59,7 @@ fman@400000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe5000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy2: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi
+index a9114ec51075..d7ebb73a400d 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-3.dtsi
+@@ -59,6 +59,7 @@ fman@400000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe7000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy3: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi
+index 44dd00ac7367..b151d696a069 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-4.dtsi
+@@ -59,6 +59,7 @@ fman@400000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe9000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy4: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi
+index 5b1b84b58602..adc0ae0013a3 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-0-1g-5.dtsi
+@@ -59,6 +59,7 @@ fman@400000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xeb000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy5: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi
+index 0e1daaef9e74..435047e0e250 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-0.dtsi
+@@ -60,6 +60,7 @@ fman@500000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xf1000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy14: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi
+index 68c5ef779266..c098657cca0a 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-10g-1.dtsi
+@@ -60,6 +60,7 @@ fman@500000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xf3000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy15: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi
+index 605363cc1117..9d06824815f3 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-0.dtsi
+@@ -59,6 +59,7 @@ fman@500000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe1000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy8: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi
+index 1955dfa13634..70e947730c4b 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-1.dtsi
+@@ -59,6 +59,7 @@ fman@500000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe3000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy9: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi
+index 2c1476454ee0..ad96e6529595 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-2.dtsi
+@@ -59,6 +59,7 @@ fman@500000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe5000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy10: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi
+index b8b541ff5fb0..034bc4b71f7a 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-3.dtsi
+@@ -59,6 +59,7 @@ fman@500000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe7000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy11: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi
+index 4b2cfddd1b15..93ca23d82b39 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-4.dtsi
+@@ -59,6 +59,7 @@ fman@500000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xe9000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy12: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi 
b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi
+index 0a52ddf7cc17..23b3117a2fd2 100644
+--- a/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi
++++ b/arch/powerpc/boot/dts/fsl/qoriq-fman3-1-1g-5.dtsi
+@@ -59,6 +59,7 @@ fman@500000 {
+               #size-cells = <0>;
+               compatible = "fsl,fman-memac-mdio", "fsl,fman-xmdio";
+               reg = <0xeb000 0x1000>;
++              fsl,erratum-a011043; /* must ignore read errors */
+ 
+               pcsphy13: ethernet-phy@0 {
+                       reg = <0x0>;
+diff --git a/arch/riscv/kernel/vdso/Makefile b/arch/riscv/kernel/vdso/Makefile
+index 49a5852fd07d..33b16f4212f7 100644
+--- a/arch/riscv/kernel/vdso/Makefile
++++ b/arch/riscv/kernel/vdso/Makefile
+@@ -58,7 +58,8 @@ quiet_cmd_vdsold = VDSOLD  $@
+       cmd_vdsold = $(CC) $(KBUILD_CFLAGS) $(call cc-option, -no-pie) 
-nostdlib -nostartfiles $(SYSCFLAGS_$(@F)) \
+                            -Wl,-T,$(filter-out FORCE,$^) -o [email protected] && \
+                    $(CROSS_COMPILE)objcopy \
+-                           $(patsubst %, -G __vdso_%, $(vdso-syms)) [email protected] $@
++                           $(patsubst %, -G __vdso_%, $(vdso-syms)) [email protected] $@ 
&& \
++                   rm [email protected]
+ 
+ # install commands for the unstripped file
+ quiet_cmd_vdso_install = INSTALL $@
+diff --git a/arch/x86/events/intel/uncore_snb.c 
b/arch/x86/events/intel/uncore_snb.c
+index dbaa1b088a30..c37cb12d0ef6 100644
+--- a/arch/x86/events/intel/uncore_snb.c
++++ b/arch/x86/events/intel/uncore_snb.c
+@@ -15,6 +15,7 @@
+ #define PCI_DEVICE_ID_INTEL_SKL_HQ_IMC                0x1910
+ #define PCI_DEVICE_ID_INTEL_SKL_SD_IMC                0x190f
+ #define PCI_DEVICE_ID_INTEL_SKL_SQ_IMC                0x191f
++#define PCI_DEVICE_ID_INTEL_SKL_E3_IMC                0x1918
+ #define PCI_DEVICE_ID_INTEL_KBL_Y_IMC         0x590c
+ #define PCI_DEVICE_ID_INTEL_KBL_U_IMC         0x5904
+ #define PCI_DEVICE_ID_INTEL_KBL_UQ_IMC                0x5914
+@@ -657,6 +658,10 @@ static const struct pci_device_id skl_uncore_pci_ids[] = {
+               PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_SQ_IMC),
+               .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0),
+       },
++      { /* IMC */
++              PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_SKL_E3_IMC),
++              .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0),
++      },
+       { /* IMC */
+               PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_KBL_Y_IMC),
+               .driver_data = UNCORE_PCI_DEV_DATA(SNB_PCI_UNCORE_IMC, 0),
+@@ -826,6 +831,7 @@ static const struct imc_uncore_pci_dev 
desktop_imc_pci_ids[] = {
+       IMC_DEV(SKL_HQ_IMC, &skl_uncore_pci_driver),  /* 6th Gen Core H Quad 
Core */
+       IMC_DEV(SKL_SD_IMC, &skl_uncore_pci_driver),  /* 6th Gen Core S Dual 
Core */
+       IMC_DEV(SKL_SQ_IMC, &skl_uncore_pci_driver),  /* 6th Gen Core S Quad 
Core */
++      IMC_DEV(SKL_E3_IMC, &skl_uncore_pci_driver),  /* Xeon E3 V5 Gen Core 
processor */
+       IMC_DEV(KBL_Y_IMC, &skl_uncore_pci_driver),  /* 7th Gen Core Y */
+       IMC_DEV(KBL_U_IMC, &skl_uncore_pci_driver),  /* 7th Gen Core U */
+       IMC_DEV(KBL_UQ_IMC, &skl_uncore_pci_driver),  /* 7th Gen Core U Quad 
Core */
+diff --git a/arch/x86/events/intel/uncore_snbep.c 
b/arch/x86/events/intel/uncore_snbep.c
+index 011644802ce7..ad20220af303 100644
+--- a/arch/x86/events/intel/uncore_snbep.c
++++ b/arch/x86/events/intel/uncore_snbep.c
+@@ -369,11 +369,6 @@
+ #define SNR_M2M_PCI_PMON_BOX_CTL              0x438
+ #define SNR_M2M_PCI_PMON_UMASK_EXT            0xff
+ 
+-/* SNR PCIE3 */
+-#define SNR_PCIE3_PCI_PMON_CTL0                       0x508
+-#define SNR_PCIE3_PCI_PMON_CTR0                       0x4e8
+-#define SNR_PCIE3_PCI_PMON_BOX_CTL            0x4e4
+-
+ /* SNR IMC */
+ #define SNR_IMC_MMIO_PMON_FIXED_CTL           0x54
+ #define SNR_IMC_MMIO_PMON_FIXED_CTR           0x38
+@@ -4328,27 +4323,12 @@ static struct intel_uncore_type snr_uncore_m2m = {
+       .format_group   = &snr_m2m_uncore_format_group,
+ };
+ 
+-static struct intel_uncore_type snr_uncore_pcie3 = {
+-      .name           = "pcie3",
+-      .num_counters   = 4,
+-      .num_boxes      = 1,
+-      .perf_ctr_bits  = 48,
+-      .perf_ctr       = SNR_PCIE3_PCI_PMON_CTR0,
+-      .event_ctl      = SNR_PCIE3_PCI_PMON_CTL0,
+-      .event_mask     = SNBEP_PMON_RAW_EVENT_MASK,
+-      .box_ctl        = SNR_PCIE3_PCI_PMON_BOX_CTL,
+-      .ops            = &ivbep_uncore_pci_ops,
+-      .format_group   = &ivbep_uncore_format_group,
+-};
+-
+ enum {
+       SNR_PCI_UNCORE_M2M,
+-      SNR_PCI_UNCORE_PCIE3,
+ };
+ 
+ static struct intel_uncore_type *snr_pci_uncores[] = {
+       [SNR_PCI_UNCORE_M2M]            = &snr_uncore_m2m,
+-      [SNR_PCI_UNCORE_PCIE3]          = &snr_uncore_pcie3,
+       NULL,
+ };
+ 
+@@ -4357,10 +4337,6 @@ static const struct pci_device_id snr_uncore_pci_ids[] 
= {
+               PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x344a),
+               .driver_data = UNCORE_PCI_DEV_FULL_DATA(12, 0, 
SNR_PCI_UNCORE_M2M, 0),
+       },
+-      { /* PCIe3 */
+-              PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x334a),
+-              .driver_data = UNCORE_PCI_DEV_FULL_DATA(4, 0, 
SNR_PCI_UNCORE_PCIE3, 0),
+-      },
+       { /* end: all zeroes */ }
+ };
+ 
+diff --git a/arch/x86/kernel/cpu/resctrl/rdtgroup.c 
b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
+index dac7209a0708..954fd048ad9b 100644
+--- a/arch/x86/kernel/cpu/resctrl/rdtgroup.c
++++ b/arch/x86/kernel/cpu/resctrl/rdtgroup.c
+@@ -1970,7 +1970,7 @@ static int rdt_get_tree(struct fs_context *fc)
+ 
+       if (rdt_mon_capable) {
+               ret = mongroup_create_dir(rdtgroup_default.kn,
+-                                        NULL, "mon_groups",
++                                        &rdtgroup_default, "mon_groups",
+                                         &kn_mongrp);
+               if (ret < 0)
+                       goto out_info;
+@@ -2205,7 +2205,11 @@ static void free_all_child_rdtgrp(struct rdtgroup 
*rdtgrp)
+       list_for_each_entry_safe(sentry, stmp, head, mon.crdtgrp_list) {
+               free_rmid(sentry->mon.rmid);
+               list_del(&sentry->mon.crdtgrp_list);
+-              kfree(sentry);
++
++              if (atomic_read(&sentry->waitcount) != 0)
++                      sentry->flags = RDT_DELETED;
++              else
++                      kfree(sentry);
+       }
+ }
+ 
+@@ -2243,7 +2247,11 @@ static void rmdir_all_sub(void)
+ 
+               kernfs_remove(rdtgrp->kn);
+               list_del(&rdtgrp->rdtgroup_list);
+-              kfree(rdtgrp);
++
++              if (atomic_read(&rdtgrp->waitcount) != 0)
++                      rdtgrp->flags = RDT_DELETED;
++              else
++                      kfree(rdtgrp);
+       }
+       /* Notify online CPUs to update per cpu storage and PQR_ASSOC MSR */
+       update_closid_rmid(cpu_online_mask, &rdtgroup_default);
+@@ -2446,7 +2454,7 @@ static int mkdir_mondata_all(struct kernfs_node 
*parent_kn,
+       /*
+        * Create the mon_data directory first.
+        */
+-      ret = mongroup_create_dir(parent_kn, NULL, "mon_data", &kn);
++      ret = mongroup_create_dir(parent_kn, prgrp, "mon_data", &kn);
+       if (ret)
+               return ret;
+ 
+@@ -2645,7 +2653,7 @@ static int mkdir_rdt_prepare(struct kernfs_node 
*parent_kn,
+       uint files = 0;
+       int ret;
+ 
+-      prdtgrp = rdtgroup_kn_lock_live(prgrp_kn);
++      prdtgrp = rdtgroup_kn_lock_live(parent_kn);
+       if (!prdtgrp) {
+               ret = -ENODEV;
+               goto out_unlock;
+@@ -2718,7 +2726,7 @@ static int mkdir_rdt_prepare(struct kernfs_node 
*parent_kn,
+       kernfs_activate(kn);
+ 
+       /*
+-       * The caller unlocks the prgrp_kn upon success.
++       * The caller unlocks the parent_kn upon success.
+        */
+       return 0;
+ 
+@@ -2729,7 +2737,7 @@ out_destroy:
+ out_free_rgrp:
+       kfree(rdtgrp);
+ out_unlock:
+-      rdtgroup_kn_unlock(prgrp_kn);
++      rdtgroup_kn_unlock(parent_kn);
+       return ret;
+ }
+ 
+@@ -2767,7 +2775,7 @@ static int rdtgroup_mkdir_mon(struct kernfs_node 
*parent_kn,
+        */
+       list_add_tail(&rdtgrp->mon.crdtgrp_list, &prgrp->mon.crdtgrp_list);
+ 
+-      rdtgroup_kn_unlock(prgrp_kn);
++      rdtgroup_kn_unlock(parent_kn);
+       return ret;
+ }
+ 
+@@ -2810,7 +2818,7 @@ static int rdtgroup_mkdir_ctrl_mon(struct kernfs_node 
*parent_kn,
+                * Create an empty mon_groups directory to hold the subset
+                * of tasks and cpus to monitor.
+                */
+-              ret = mongroup_create_dir(kn, NULL, "mon_groups", NULL);
++              ret = mongroup_create_dir(kn, rdtgrp, "mon_groups", NULL);
+               if (ret) {
+                       rdt_last_cmd_puts("kernfs subdir error\n");
+                       goto out_del_list;
+@@ -2826,7 +2834,7 @@ out_id_free:
+ out_common_fail:
+       mkdir_rdt_prepare_clean(rdtgrp);
+ out_unlock:
+-      rdtgroup_kn_unlock(prgrp_kn);
++      rdtgroup_kn_unlock(parent_kn);
+       return ret;
+ }
+ 
+@@ -2952,13 +2960,13 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, 
struct rdtgroup *rdtgrp,
+       closid_free(rdtgrp->closid);
+       free_rmid(rdtgrp->mon.rmid);
+ 
++      rdtgroup_ctrl_remove(kn, rdtgrp);
++
+       /*
+        * Free all the child monitor group rmids.
+        */
+       free_all_child_rdtgrp(rdtgrp);
+ 
+-      rdtgroup_ctrl_remove(kn, rdtgrp);
+-
+       return 0;
+ }
+ 
+diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c
+index 4f24e46ebe7c..56db949a7b70 100644
+--- a/drivers/char/ttyprintk.c
++++ b/drivers/char/ttyprintk.c
+@@ -15,10 +15,11 @@
+ #include <linux/serial.h>
+ #include <linux/tty.h>
+ #include <linux/module.h>
++#include <linux/spinlock.h>
+ 
+ struct ttyprintk_port {
+       struct tty_port port;
+-      struct mutex port_write_mutex;
++      spinlock_t spinlock;
+ };
+ 
+ static struct ttyprintk_port tpk_port;
+@@ -99,11 +100,12 @@ static int tpk_open(struct tty_struct *tty, struct file 
*filp)
+ static void tpk_close(struct tty_struct *tty, struct file *filp)
+ {
+       struct ttyprintk_port *tpkp = tty->driver_data;
++      unsigned long flags;
+ 
+-      mutex_lock(&tpkp->port_write_mutex);
++      spin_lock_irqsave(&tpkp->spinlock, flags);
+       /* flush tpk_printk buffer */
+       tpk_printk(NULL, 0);
+-      mutex_unlock(&tpkp->port_write_mutex);
++      spin_unlock_irqrestore(&tpkp->spinlock, flags);
+ 
+       tty_port_close(&tpkp->port, tty, filp);
+ }
+@@ -115,13 +117,14 @@ static int tpk_write(struct tty_struct *tty,
+               const unsigned char *buf, int count)
+ {
+       struct ttyprintk_port *tpkp = tty->driver_data;
++      unsigned long flags;
+       int ret;
+ 
+ 
+       /* exclusive use of tpk_printk within this tty */
+-      mutex_lock(&tpkp->port_write_mutex);
++      spin_lock_irqsave(&tpkp->spinlock, flags);
+       ret = tpk_printk(buf, count);
+-      mutex_unlock(&tpkp->port_write_mutex);
++      spin_unlock_irqrestore(&tpkp->spinlock, flags);
+ 
+       return ret;
+ }
+@@ -171,7 +174,7 @@ static int __init ttyprintk_init(void)
+ {
+       int ret = -ENOMEM;
+ 
+-      mutex_init(&tpk_port.port_write_mutex);
++      spin_lock_init(&tpk_port.spinlock);
+ 
+       ttyprintk_driver = tty_alloc_driver(1,
+                       TTY_DRIVER_RESET_TERMIOS |
+diff --git a/drivers/clk/mmp/clk-of-mmp2.c b/drivers/clk/mmp/clk-of-mmp2.c
+index a60a1be937ad..b4a95cbbda98 100644
+--- a/drivers/clk/mmp/clk-of-mmp2.c
++++ b/drivers/clk/mmp/clk-of-mmp2.c
+@@ -134,7 +134,7 @@ static DEFINE_SPINLOCK(ssp3_lock);
+ static const char *ssp_parent_names[] = {"vctcxo_4", "vctcxo_2", "vctcxo", 
"pll1_16"};
+ 
+ static DEFINE_SPINLOCK(timer_lock);
+-static const char *timer_parent_names[] = {"clk32", "vctcxo_2", "vctcxo_4", 
"vctcxo"};
++static const char *timer_parent_names[] = {"clk32", "vctcxo_4", "vctcxo_2", 
"vctcxo"};
+ 
+ static DEFINE_SPINLOCK(reset_lock);
+ 
+diff --git a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c 
b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
+index 45a1ed3fe674..ab194143e06c 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
++++ b/drivers/clk/sunxi-ng/ccu-sun50i-h6-r.c
+@@ -23,9 +23,9 @@
+  */
+ 
+ static const char * const ar100_r_apb2_parents[] = { "osc24M", "osc32k",
+-                                           "pll-periph0", "iosc" };
++                                                   "iosc", "pll-periph0" };
+ static const struct ccu_mux_var_prediv ar100_r_apb2_predivs[] = {
+-      { .index = 2, .shift = 0, .width = 5 },
++      { .index = 3, .shift = 0, .width = 5 },
+ };
+ 
+ static struct ccu_div ar100_clk = {
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-r.c 
b/drivers/clk/sunxi-ng/ccu-sun8i-r.c
+index 4646fdc61053..4c8c491b87c2 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-r.c
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-r.c
+@@ -51,19 +51,7 @@ static struct ccu_div ar100_clk = {
+ 
+ static CLK_FIXED_FACTOR_HW(ahb0_clk, "ahb0", &ar100_clk.common.hw, 1, 1, 0);
+ 
+-static struct ccu_div apb0_clk = {
+-      .div            = _SUNXI_CCU_DIV_FLAGS(0, 2, CLK_DIVIDER_POWER_OF_TWO),
+-
+-      .common         = {
+-              .reg            = 0x0c,
+-              .hw.init        = CLK_HW_INIT_HW("apb0",
+-                                               &ahb0_clk.hw,
+-                                               &ccu_div_ops,
+-                                               0),
+-      },
+-};
+-
+-static SUNXI_CCU_M(a83t_apb0_clk, "apb0", "ahb0", 0x0c, 0, 2, 0);
++static SUNXI_CCU_M(apb0_clk, "apb0", "ahb0", 0x0c, 0, 2, 0);
+ 
+ /*
+  * Define the parent as an array that can be reused to save space
+@@ -127,7 +115,7 @@ static struct ccu_mp a83t_ir_clk = {
+ 
+ static struct ccu_common *sun8i_a83t_r_ccu_clks[] = {
+       &ar100_clk.common,
+-      &a83t_apb0_clk.common,
++      &apb0_clk.common,
+       &apb0_pio_clk.common,
+       &apb0_ir_clk.common,
+       &apb0_timer_clk.common,
+@@ -167,7 +155,7 @@ static struct clk_hw_onecell_data sun8i_a83t_r_hw_clks = {
+       .hws    = {
+               [CLK_AR100]             = &ar100_clk.common.hw,
+               [CLK_AHB0]              = &ahb0_clk.hw,
+-              [CLK_APB0]              = &a83t_apb0_clk.common.hw,
++              [CLK_APB0]              = &apb0_clk.common.hw,
+               [CLK_APB0_PIO]          = &apb0_pio_clk.common.hw,
+               [CLK_APB0_IR]           = &apb0_ir_clk.common.hw,
+               [CLK_APB0_TIMER]        = &apb0_timer_clk.common.hw,
+@@ -282,9 +270,6 @@ static void __init sunxi_r_ccu_init(struct device_node 
*node,
+ 
+ static void __init sun8i_a83t_r_ccu_setup(struct device_node *node)
+ {
+-      /* Fix apb0 bus gate parents here */
+-      apb0_gate_parent[0] = &a83t_apb0_clk.common.hw;
+-
+       sunxi_r_ccu_init(node, &sun8i_a83t_r_ccu_desc);
+ }
+ CLK_OF_DECLARE(sun8i_a83t_r_ccu, "allwinner,sun8i-a83t-r-ccu",
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c 
b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c
+index 5c779eec454b..0e36ca3bf3d5 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.c
+@@ -618,7 +618,7 @@ static struct clk_hw_onecell_data sun8i_v3s_hw_clks = {
+               [CLK_MBUS]              = &mbus_clk.common.hw,
+               [CLK_MIPI_CSI]          = &mipi_csi_clk.common.hw,
+       },
+-      .num    = CLK_NUMBER,
++      .num    = CLK_PLL_DDR1 + 1,
+ };
+ 
+ static struct clk_hw_onecell_data sun8i_v3_hw_clks = {
+@@ -700,7 +700,7 @@ static struct clk_hw_onecell_data sun8i_v3_hw_clks = {
+               [CLK_MBUS]              = &mbus_clk.common.hw,
+               [CLK_MIPI_CSI]          = &mipi_csi_clk.common.hw,
+       },
+-      .num    = CLK_NUMBER,
++      .num    = CLK_I2S0 + 1,
+ };
+ 
+ static struct ccu_reset_map sun8i_v3s_ccu_resets[] = {
+diff --git a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h 
b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h
+index b0160d305a67..108eeeedcbf7 100644
+--- a/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h
++++ b/drivers/clk/sunxi-ng/ccu-sun8i-v3s.h
+@@ -51,6 +51,4 @@
+ 
+ #define CLK_PLL_DDR1          74
+ 
+-#define CLK_NUMBER            (CLK_I2S0 + 1)
+-
+ #endif /* _CCU_SUN8I_H3_H_ */
+diff --git a/drivers/cpuidle/governors/teo.c b/drivers/cpuidle/governors/teo.c
+index 703047434ee1..c71773c88890 100644
+--- a/drivers/cpuidle/governors/teo.c
++++ b/drivers/cpuidle/governors/teo.c
+@@ -234,7 +234,7 @@ static int teo_select(struct cpuidle_driver *drv, struct 
cpuidle_device *dev,
+       struct teo_cpu *cpu_data = per_cpu_ptr(&teo_cpus, dev->cpu);
+       int latency_req = cpuidle_governor_latency_req(dev->cpu);
+       unsigned int duration_us, hits, misses, early_hits;
+-      int max_early_idx, constraint_idx, idx, i;
++      int max_early_idx, prev_max_early_idx, constraint_idx, idx, i;
+       ktime_t delta_tick;
+ 
+       if (dev->last_state_idx >= 0) {
+@@ -251,6 +251,7 @@ static int teo_select(struct cpuidle_driver *drv, struct 
cpuidle_device *dev,
+       misses = 0;
+       early_hits = 0;
+       max_early_idx = -1;
++      prev_max_early_idx = -1;
+       constraint_idx = drv->state_count;
+       idx = -1;
+ 
+@@ -303,6 +304,7 @@ static int teo_select(struct cpuidle_driver *drv, struct 
cpuidle_device *dev,
+                        */
+                       if (!(tick_nohz_tick_stopped() &&
+                             drv->states[idx].target_residency < TICK_USEC)) {
++                              prev_max_early_idx = max_early_idx;
+                               early_hits = cpu_data->states[i].early_hits;
+                               max_early_idx = idx;
+                       }
+@@ -329,6 +331,7 @@ static int teo_select(struct cpuidle_driver *drv, struct 
cpuidle_device *dev,
+               if (early_hits < cpu_data->states[i].early_hits &&
+                   !(tick_nohz_tick_stopped() &&
+                     drv->states[i].target_residency < TICK_USEC)) {
++                      prev_max_early_idx = max_early_idx;
+                       early_hits = cpu_data->states[i].early_hits;
+                       max_early_idx = i;
+               }
+@@ -342,9 +345,19 @@ static int teo_select(struct cpuidle_driver *drv, struct 
cpuidle_device *dev,
+        * "early hits" metric, but if that cannot be determined, just use the
+        * state selected so far.
+        */
+-      if (hits <= misses && max_early_idx >= 0) {
+-              idx = max_early_idx;
+-              duration_us = drv->states[idx].target_residency;
++      if (hits <= misses) {
++              /*
++               * The current candidate state is not suitable, so take the one
++               * whose "early hits" metric is the maximum for the range of
++               * shallower states.
++               */
++              if (idx == max_early_idx)
++                      max_early_idx = prev_max_early_idx;
++
++              if (max_early_idx >= 0) {
++                      idx = max_early_idx;
++                      duration_us = drv->states[idx].target_residency;
++              }
+       }
+ 
+       /*
+diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
+index c64d20fdc187..174795ecbd3b 100644
+--- a/drivers/devfreq/devfreq.c
++++ b/drivers/devfreq/devfreq.c
+@@ -1112,6 +1112,14 @@ err_out:
+ }
+ EXPORT_SYMBOL(devfreq_remove_governor);
+ 
++static ssize_t name_show(struct device *dev,
++                      struct device_attribute *attr, char *buf)
++{
++      struct devfreq *devfreq = to_devfreq(dev);
++      return sprintf(buf, "%s\n", dev_name(devfreq->dev.parent));
++}
++static DEVICE_ATTR_RO(name);
++
+ static ssize_t governor_show(struct device *dev,
+                            struct device_attribute *attr, char *buf)
+ {
+@@ -1440,6 +1448,7 @@ static ssize_t trans_stat_show(struct device *dev,
+ static DEVICE_ATTR_RO(trans_stat);
+ 
+ static struct attribute *devfreq_attrs[] = {
++      &dev_attr_name.attr,
+       &dev_attr_governor.attr,
+       &dev_attr_available_governors.attr,
+       &dev_attr_cur_freq.attr,
+diff --git a/drivers/input/evdev.c b/drivers/input/evdev.c
+index f918fca9ada3..cb6e3a5f509c 100644
+--- a/drivers/input/evdev.c
++++ b/drivers/input/evdev.c
+@@ -484,10 +484,7 @@ static int evdev_open(struct inode *inode, struct file 
*file)
+       struct evdev_client *client;
+       int error;
+ 
+-      client = kzalloc(struct_size(client, buffer, bufsize),
+-                       GFP_KERNEL | __GFP_NOWARN);
+-      if (!client)
+-              client = vzalloc(struct_size(client, buffer, bufsize));
++      client = kvzalloc(struct_size(client, buffer, bufsize), GFP_KERNEL);
+       if (!client)
+               return -ENOMEM;
+ 
+diff --git a/drivers/input/misc/max77650-onkey.c 
b/drivers/input/misc/max77650-onkey.c
+index 4d875f2ac13d..ee55f22dbca5 100644
+--- a/drivers/input/misc/max77650-onkey.c
++++ b/drivers/input/misc/max77650-onkey.c
+@@ -108,9 +108,16 @@ static int max77650_onkey_probe(struct platform_device 
*pdev)
+       return input_register_device(onkey->input);
+ }
+ 
++static const struct of_device_id max77650_onkey_of_match[] = {
++      { .compatible = "maxim,max77650-onkey" },
++      { }
++};
++MODULE_DEVICE_TABLE(of, max77650_onkey_of_match);
++
+ static struct platform_driver max77650_onkey_driver = {
+       .driver = {
+               .name = "max77650-onkey",
++              .of_match_table = max77650_onkey_of_match,
+       },
+       .probe = max77650_onkey_probe,
+ };
+diff --git a/drivers/leds/leds-max77650.c b/drivers/leds/leds-max77650.c
+index 4c2d0b3c6dad..a0d4b725c917 100644
+--- a/drivers/leds/leds-max77650.c
++++ b/drivers/leds/leds-max77650.c
+@@ -135,9 +135,16 @@ err_node_put:
+       return rv;
+ }
+ 
++static const struct of_device_id max77650_led_of_match[] = {
++      { .compatible = "maxim,max77650-led" },
++      { }
++};
++MODULE_DEVICE_TABLE(of, max77650_led_of_match);
++
+ static struct platform_driver max77650_led_driver = {
+       .driver = {
+               .name = "max77650-led",
++              .of_match_table = max77650_led_of_match,
+       },
+       .probe = max77650_led_probe,
+ };
+diff --git a/drivers/md/dm-thin.c b/drivers/md/dm-thin.c
+index 1696bfd23ad1..69201bdf7f4c 100644
+--- a/drivers/md/dm-thin.c
++++ b/drivers/md/dm-thin.c
+@@ -3420,10 +3420,6 @@ static int pool_ctr(struct dm_target *ti, unsigned 
argc, char **argv)
+       if (r)
+               goto out_flags_changed;
+ 
+-      dm_pool_register_pre_commit_callback(pt->pool->pmd,
+-                                           metadata_pre_commit_callback,
+-                                           pt);
+-
+       pt->callbacks.congested_fn = pool_is_congested;
+       dm_table_add_target_callbacks(ti->table, &pt->callbacks);
+ 
+@@ -3587,6 +3583,9 @@ static int pool_preresume(struct dm_target *ti)
+       if (r)
+               return r;
+ 
++      dm_pool_register_pre_commit_callback(pool->pmd,
++                                           metadata_pre_commit_callback, pt);
++
+       r = maybe_resize_data_dev(ti, &need_commit1);
+       if (r)
+               return r;
+diff --git a/drivers/media/usb/dvb-usb/af9005.c 
b/drivers/media/usb/dvb-usb/af9005.c
+index ac93e88d7038..89b4b5d84cdf 100644
+--- a/drivers/media/usb/dvb-usb/af9005.c
++++ b/drivers/media/usb/dvb-usb/af9005.c
+@@ -554,7 +554,7 @@ static int af9005_boot_packet(struct usb_device *udev, int 
type, u8 *reply,
+                             u8 *buf, int size)
+ {
+       u16 checksum;
+-      int act_len, i, ret;
++      int act_len = 0, i, ret;
+ 
+       memset(buf, 0, size);
+       buf[0] = (u8) (FW_BULKOUT_SIZE & 0xff);
+diff --git a/drivers/media/usb/dvb-usb/digitv.c 
b/drivers/media/usb/dvb-usb/digitv.c
+index dd5bb230cec1..99a39339d45d 100644
+--- a/drivers/media/usb/dvb-usb/digitv.c
++++ b/drivers/media/usb/dvb-usb/digitv.c
+@@ -230,18 +230,22 @@ static struct rc_map_table rc_map_digitv_table[] = {
+ 
+ static int digitv_rc_query(struct dvb_usb_device *d, u32 *event, int *state)
+ {
+-      int i;
++      int ret, i;
+       u8 key[5];
+       u8 b[4] = { 0 };
+ 
+       *event = 0;
+       *state = REMOTE_NO_KEY_PRESSED;
+ 
+-      digitv_ctrl_msg(d,USB_READ_REMOTE,0,NULL,0,&key[1],4);
++      ret = digitv_ctrl_msg(d, USB_READ_REMOTE, 0, NULL, 0, &key[1], 4);
++      if (ret)
++              return ret;
+ 
+       /* Tell the device we've read the remote. Not sure how necessary
+          this is, but the Nebula SDK does it. */
+-      digitv_ctrl_msg(d,USB_WRITE_REMOTE,0,b,4,NULL,0);
++      ret = digitv_ctrl_msg(d, USB_WRITE_REMOTE, 0, b, 4, NULL, 0);
++      if (ret)
++              return ret;
+ 
+       /* if something is inside the buffer, simulate key press */
+       if (key[1] != 0)
+diff --git a/drivers/media/usb/dvb-usb/dvb-usb-urb.c 
b/drivers/media/usb/dvb-usb/dvb-usb-urb.c
+index c1b4e94a37f8..2aabf90d8697 100644
+--- a/drivers/media/usb/dvb-usb/dvb-usb-urb.c
++++ b/drivers/media/usb/dvb-usb/dvb-usb-urb.c
+@@ -12,7 +12,7 @@
+ int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf,
+       u16 rlen, int delay_ms)
+ {
+-      int actlen,ret = -ENOMEM;
++      int actlen = 0, ret = -ENOMEM;
+ 
+       if (!d || wbuf == NULL || wlen == 0)
+               return -EINVAL;
+diff --git a/drivers/media/usb/dvb-usb/vp7045.c 
b/drivers/media/usb/dvb-usb/vp7045.c
+index 80c1cf05384b..2baf57216d19 100644
+--- a/drivers/media/usb/dvb-usb/vp7045.c
++++ b/drivers/media/usb/dvb-usb/vp7045.c
+@@ -96,10 +96,14 @@ static int vp7045_power_ctrl(struct dvb_usb_device *d, int 
onoff)
+ 
+ static int vp7045_rc_query(struct dvb_usb_device *d)
+ {
++      int ret;
+       u8 key;
+-      vp7045_usb_op(d,RC_VAL_READ,NULL,0,&key,1,20);
+ 
+-      deb_rc("remote query key: %x %d\n",key,key);
++      ret = vp7045_usb_op(d, RC_VAL_READ, NULL, 0, &key, 1, 20);
++      if (ret)
++              return ret;
++
++      deb_rc("remote query key: %x\n", key);
+ 
+       if (key != 0x44) {
+               /*
+@@ -115,15 +119,18 @@ static int vp7045_rc_query(struct dvb_usb_device *d)
+ 
+ static int vp7045_read_eeprom(struct dvb_usb_device *d,u8 *buf, int len, int 
offset)
+ {
+-      int i = 0;
+-      u8 v,br[2];
++      int i, ret;
++      u8 v, br[2];
+       for (i=0; i < len; i++) {
+               v = offset + i;
+-              vp7045_usb_op(d,GET_EE_VALUE,&v,1,br,2,5);
++              ret = vp7045_usb_op(d, GET_EE_VALUE, &v, 1, br, 2, 5);
++              if (ret)
++                      return ret;
++
+               buf[i] = br[1];
+       }
+-      deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ",offset, i);
+-      debug_dump(buf,i,deb_info);
++      deb_info("VP7045 EEPROM read (offs: %d, len: %d) : ", offset, i);
++      debug_dump(buf, i, deb_info);
+       return 0;
+ }
+ 
+diff --git a/drivers/media/usb/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c
+index 4add2b12d330..c1b307bbe540 100644
+--- a/drivers/media/usb/gspca/gspca.c
++++ b/drivers/media/usb/gspca/gspca.c
+@@ -1461,7 +1461,7 @@ int gspca_dev_probe2(struct usb_interface *intf,
+               pr_err("couldn't kzalloc gspca struct\n");
+               return -ENOMEM;
+       }
+-      gspca_dev->usb_buf = kmalloc(USB_BUF_SZ, GFP_KERNEL);
++      gspca_dev->usb_buf = kzalloc(USB_BUF_SZ, GFP_KERNEL);
+       if (!gspca_dev->usb_buf) {
+               pr_err("out of memory\n");
+               ret = -ENOMEM;
+diff --git a/drivers/misc/lkdtm/bugs.c b/drivers/misc/lkdtm/bugs.c
+index 7284a22b1a09..4d5a512769e9 100644
+--- a/drivers/misc/lkdtm/bugs.c
++++ b/drivers/misc/lkdtm/bugs.c
+@@ -274,7 +274,7 @@ void lkdtm_STACK_GUARD_PAGE_TRAILING(void)
+ 
+ void lkdtm_UNSET_SMEP(void)
+ {
+-#ifdef CONFIG_X86_64
++#if IS_ENABLED(CONFIG_X86_64) && !IS_ENABLED(CONFIG_UML)
+ #define MOV_CR4_DEPTH 64
+       void (*direct_write_cr4)(unsigned long val);
+       unsigned char *insn;
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c 
b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
+index fb8ade9a05a9..2ce96cc1bad4 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
+@@ -70,8 +70,7 @@ static void *seq_tab_start(struct seq_file *seq, loff_t *pos)
+ static void *seq_tab_next(struct seq_file *seq, void *v, loff_t *pos)
+ {
+       v = seq_tab_get_idx(seq->private, *pos + 1);
+-      if (v)
+-              ++*pos;
++      ++(*pos);
+       return v;
+ }
+ 
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/l2t.c 
b/drivers/net/ethernet/chelsio/cxgb4/l2t.c
+index 1a407d3c1d67..e6fe2870137b 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/l2t.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/l2t.c
+@@ -682,8 +682,7 @@ static void *l2t_seq_start(struct seq_file *seq, loff_t 
*pos)
+ static void *l2t_seq_next(struct seq_file *seq, void *v, loff_t *pos)
+ {
+       v = l2t_get_idx(seq, *pos);
+-      if (v)
+-              ++*pos;
++      ++(*pos);
+       return v;
+ }
+ 
+diff --git a/drivers/net/ethernet/freescale/fman/fman_memac.c 
b/drivers/net/ethernet/freescale/fman/fman_memac.c
+index 41c6fa200e74..e1901874c19f 100644
+--- a/drivers/net/ethernet/freescale/fman/fman_memac.c
++++ b/drivers/net/ethernet/freescale/fman/fman_memac.c
+@@ -110,7 +110,7 @@ do {                                                       
                \
+ /* Interface Mode Register (IF_MODE) */
+ 
+ #define IF_MODE_MASK          0x00000003 /* 30-31 Mask on i/f mode bits */
+-#define IF_MODE_XGMII         0x00000000 /* 30-31 XGMII (10G) interface */
++#define IF_MODE_10G           0x00000000 /* 30-31 10G interface */
+ #define IF_MODE_GMII          0x00000002 /* 30-31 GMII (1G) interface */
+ #define IF_MODE_RGMII         0x00000004
+ #define IF_MODE_RGMII_AUTO    0x00008000
+@@ -440,7 +440,7 @@ static int init(struct memac_regs __iomem *regs, struct 
memac_cfg *cfg,
+       tmp = 0;
+       switch (phy_if) {
+       case PHY_INTERFACE_MODE_XGMII:
+-              tmp |= IF_MODE_XGMII;
++              tmp |= IF_MODE_10G;
+               break;
+       default:
+               tmp |= IF_MODE_GMII;
+diff --git a/drivers/net/ethernet/freescale/xgmac_mdio.c 
b/drivers/net/ethernet/freescale/xgmac_mdio.c
+index e03b30c60dcf..c82c85ef5fb3 100644
+--- a/drivers/net/ethernet/freescale/xgmac_mdio.c
++++ b/drivers/net/ethernet/freescale/xgmac_mdio.c
+@@ -49,6 +49,7 @@ struct tgec_mdio_controller {
+ struct mdio_fsl_priv {
+       struct  tgec_mdio_controller __iomem *mdio_base;
+       bool    is_little_endian;
++      bool    has_a011043;
+ };
+ 
+ static u32 xgmac_read32(void __iomem *regs,
+@@ -226,7 +227,8 @@ static int xgmac_mdio_read(struct mii_bus *bus, int 
phy_id, int regnum)
+               return ret;
+ 
+       /* Return all Fs if nothing was there */
+-      if (xgmac_read32(&regs->mdio_stat, endian) & MDIO_STAT_RD_ER) {
++      if ((xgmac_read32(&regs->mdio_stat, endian) & MDIO_STAT_RD_ER) &&
++          !priv->has_a011043) {
+               dev_err(&bus->dev,
+                       "Error while reading PHY%d reg at %d.%hhu\n",
+                       phy_id, dev_addr, regnum);
+@@ -274,6 +276,9 @@ static int xgmac_mdio_probe(struct platform_device *pdev)
+       priv->is_little_endian = of_property_read_bool(pdev->dev.of_node,
+                                                      "little-endian");
+ 
++      priv->has_a011043 = of_property_read_bool(pdev->dev.of_node,
++                                                "fsl,erratum-a011043");
++
+       ret = of_mdiobus_register(bus, np);
+       if (ret) {
+               dev_err(&pdev->dev, "cannot register MDIO bus\n");
+diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h 
b/drivers/net/ethernet/intel/e1000e/e1000.h
+index 6c51b1bad8c4..37a2314d3e6b 100644
+--- a/drivers/net/ethernet/intel/e1000e/e1000.h
++++ b/drivers/net/ethernet/intel/e1000e/e1000.h
+@@ -185,13 +185,12 @@ struct e1000_phy_regs {
+ 
+ /* board specific private data structure */
+ struct e1000_adapter {
++      struct timer_list watchdog_timer;
+       struct timer_list phy_info_timer;
+       struct timer_list blink_timer;
+ 
+       struct work_struct reset_task;
+-      struct delayed_work watchdog_task;
+-
+-      struct workqueue_struct *e1000_workqueue;
++      struct work_struct watchdog_task;
+ 
+       const struct e1000_info *ei;
+ 
+diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c 
b/drivers/net/ethernet/intel/e1000e/netdev.c
+index d7d56e42a6aa..c27ed7363768 100644
+--- a/drivers/net/ethernet/intel/e1000e/netdev.c
++++ b/drivers/net/ethernet/intel/e1000e/netdev.c
+@@ -1780,8 +1780,7 @@ static irqreturn_t e1000_intr_msi(int __always_unused 
irq, void *data)
+               }
+               /* guard against interrupt when we're going down */
+               if (!test_bit(__E1000_DOWN, &adapter->state))
+-                      mod_delayed_work(adapter->e1000_workqueue,
+-                                       &adapter->watchdog_task, HZ);
++                      mod_timer(&adapter->watchdog_timer, jiffies + 1);
+       }
+ 
+       /* Reset on uncorrectable ECC error */
+@@ -1861,8 +1860,7 @@ static irqreturn_t e1000_intr(int __always_unused irq, 
void *data)
+               }
+               /* guard against interrupt when we're going down */
+               if (!test_bit(__E1000_DOWN, &adapter->state))
+-                      mod_delayed_work(adapter->e1000_workqueue,
+-                                       &adapter->watchdog_task, HZ);
++                      mod_timer(&adapter->watchdog_timer, jiffies + 1);
+       }
+ 
+       /* Reset on uncorrectable ECC error */
+@@ -1907,8 +1905,7 @@ static irqreturn_t e1000_msix_other(int __always_unused 
irq, void *data)
+               hw->mac.get_link_status = true;
+               /* guard against interrupt when we're going down */
+               if (!test_bit(__E1000_DOWN, &adapter->state))
+-                      mod_delayed_work(adapter->e1000_workqueue,
+-                                       &adapter->watchdog_task, HZ);
++                      mod_timer(&adapter->watchdog_timer, jiffies + 1);
+       }
+ 
+       if (!test_bit(__E1000_DOWN, &adapter->state))
+@@ -4281,6 +4278,7 @@ void e1000e_down(struct e1000_adapter *adapter, bool 
reset)
+ 
+       napi_synchronize(&adapter->napi);
+ 
++      del_timer_sync(&adapter->watchdog_timer);
+       del_timer_sync(&adapter->phy_info_timer);
+ 
+       spin_lock(&adapter->stats64_lock);
+@@ -5152,11 +5150,25 @@ static void e1000e_check_82574_phy_workaround(struct 
e1000_adapter *adapter)
+       }
+ }
+ 
++/**
++ * e1000_watchdog - Timer Call-back
++ * @data: pointer to adapter cast into an unsigned long
++ **/
++static void e1000_watchdog(struct timer_list *t)
++{
++      struct e1000_adapter *adapter = from_timer(adapter, t, watchdog_timer);
++
++      /* Do the rest outside of interrupt context */
++      schedule_work(&adapter->watchdog_task);
++
++      /* TODO: make this use queue_delayed_work() */
++}
++
+ static void e1000_watchdog_task(struct work_struct *work)
+ {
+       struct e1000_adapter *adapter = container_of(work,
+                                                    struct e1000_adapter,
+-                                                   watchdog_task.work);
++                                                   watchdog_task);
+       struct net_device *netdev = adapter->netdev;
+       struct e1000_mac_info *mac = &adapter->hw.mac;
+       struct e1000_phy_info *phy = &adapter->hw.phy;
+@@ -5404,9 +5416,8 @@ link_up:
+ 
+       /* Reset the timer */
+       if (!test_bit(__E1000_DOWN, &adapter->state))
+-              queue_delayed_work(adapter->e1000_workqueue,
+-                                 &adapter->watchdog_task,
+-                                 round_jiffies(2 * HZ));
++              mod_timer(&adapter->watchdog_timer,
++                        round_jiffies(jiffies + 2 * HZ));
+ }
+ 
+ #define E1000_TX_FLAGS_CSUM           0x00000001
+@@ -7259,21 +7270,11 @@ static int e1000_probe(struct pci_dev *pdev, const 
struct pci_device_id *ent)
+               goto err_eeprom;
+       }
+ 
+-      adapter->e1000_workqueue = alloc_workqueue("%s", WQ_MEM_RECLAIM, 0,
+-                                                 e1000e_driver_name);
+-
+-      if (!adapter->e1000_workqueue) {
+-              err = -ENOMEM;
+-              goto err_workqueue;
+-      }
+-
+-      INIT_DELAYED_WORK(&adapter->watchdog_task, e1000_watchdog_task);
+-      queue_delayed_work(adapter->e1000_workqueue, &adapter->watchdog_task,
+-                         0);
+-
++      timer_setup(&adapter->watchdog_timer, e1000_watchdog, 0);
+       timer_setup(&adapter->phy_info_timer, e1000_update_phy_info, 0);
+ 
+       INIT_WORK(&adapter->reset_task, e1000_reset_task);
++      INIT_WORK(&adapter->watchdog_task, e1000_watchdog_task);
+       INIT_WORK(&adapter->downshift_task, e1000e_downshift_workaround);
+       INIT_WORK(&adapter->update_phy_task, e1000e_update_phy_task);
+       INIT_WORK(&adapter->print_hang_task, e1000_print_hw_hang);
+@@ -7367,9 +7368,6 @@ static int e1000_probe(struct pci_dev *pdev, const 
struct pci_device_id *ent)
+       return 0;
+ 
+ err_register:
+-      flush_workqueue(adapter->e1000_workqueue);
+-      destroy_workqueue(adapter->e1000_workqueue);
+-err_workqueue:
+       if (!(adapter->flags & FLAG_HAS_AMT))
+               e1000e_release_hw_control(adapter);
+ err_eeprom:
+@@ -7407,26 +7405,22 @@ static void e1000_remove(struct pci_dev *pdev)
+ {
+       struct net_device *netdev = pci_get_drvdata(pdev);
+       struct e1000_adapter *adapter = netdev_priv(netdev);
+-      bool down = test_bit(__E1000_DOWN, &adapter->state);
+ 
+       e1000e_ptp_remove(adapter);
+ 
+       /* The timers may be rescheduled, so explicitly disable them
+        * from being rescheduled.
+        */
+-      if (!down)
+-              set_bit(__E1000_DOWN, &adapter->state);
++      set_bit(__E1000_DOWN, &adapter->state);
++      del_timer_sync(&adapter->watchdog_timer);
+       del_timer_sync(&adapter->phy_info_timer);
+ 
+       cancel_work_sync(&adapter->reset_task);
++      cancel_work_sync(&adapter->watchdog_task);
+       cancel_work_sync(&adapter->downshift_task);
+       cancel_work_sync(&adapter->update_phy_task);
+       cancel_work_sync(&adapter->print_hang_task);
+ 
+-      cancel_delayed_work(&adapter->watchdog_task);
+-      flush_workqueue(adapter->e1000_workqueue);
+-      destroy_workqueue(adapter->e1000_workqueue);
+-
+       if (adapter->flags & FLAG_HAS_HW_TIMESTAMP) {
+               cancel_work_sync(&adapter->tx_hwtstamp_work);
+               if (adapter->tx_hwtstamp_skb) {
+@@ -7435,9 +7429,6 @@ static void e1000_remove(struct pci_dev *pdev)
+               }
+       }
+ 
+-      /* Don't lie to e1000_close() down the road. */
+-      if (!down)
+-              clear_bit(__E1000_DOWN, &adapter->state);
+       unregister_netdev(netdev);
+ 
+       if (pci_dev_run_wake(pdev))
+diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c 
b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+index 3d2440838822..3515ace0f020 100644
+--- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
++++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c
+@@ -2322,6 +2322,22 @@ static int i40e_ctrl_vf_rx_rings(struct i40e_vsi *vsi, 
unsigned long q_map,
+       return ret;
+ }
+ 
++/**
++ * i40e_vc_validate_vqs_bitmaps - validate Rx/Tx queue bitmaps from VIRTHCHNL
++ * @vqs: virtchnl_queue_select structure containing bitmaps to validate
++ *
++ * Returns true if validation was successful, else false.
++ */
++static bool i40e_vc_validate_vqs_bitmaps(struct virtchnl_queue_select *vqs)
++{
++      if ((!vqs->rx_queues && !vqs->tx_queues) ||
++          vqs->rx_queues >= BIT(I40E_MAX_VF_QUEUES) ||
++          vqs->tx_queues >= BIT(I40E_MAX_VF_QUEUES))
++              return false;
++
++      return true;
++}
++
+ /**
+  * i40e_vc_enable_queues_msg
+  * @vf: pointer to the VF info
+@@ -2347,7 +2363,7 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, 
u8 *msg)
+               goto error_param;
+       }
+ 
+-      if ((0 == vqs->rx_queues) && (0 == vqs->tx_queues)) {
++      if (i40e_vc_validate_vqs_bitmaps(vqs)) {
+               aq_ret = I40E_ERR_PARAM;
+               goto error_param;
+       }
+@@ -2409,9 +2425,7 @@ static int i40e_vc_disable_queues_msg(struct i40e_vf 
*vf, u8 *msg)
+               goto error_param;
+       }
+ 
+-      if ((vqs->rx_queues == 0 && vqs->tx_queues == 0) ||
+-          vqs->rx_queues > I40E_MAX_VF_QUEUES ||
+-          vqs->tx_queues > I40E_MAX_VF_QUEUES) {
++      if (i40e_vc_validate_vqs_bitmaps(vqs)) {
+               aq_ret = I40E_ERR_PARAM;
+               goto error_param;
+       }
+diff --git a/drivers/net/ethernet/intel/iavf/iavf.h 
b/drivers/net/ethernet/intel/iavf/iavf.h
+index 29de3ae96ef2..bd1b1ed323f4 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf.h
++++ b/drivers/net/ethernet/intel/iavf/iavf.h
+@@ -415,4 +415,6 @@ void iavf_enable_channels(struct iavf_adapter *adapter);
+ void iavf_disable_channels(struct iavf_adapter *adapter);
+ void iavf_add_cloud_filter(struct iavf_adapter *adapter);
+ void iavf_del_cloud_filter(struct iavf_adapter *adapter);
++struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter,
++                                      const u8 *macaddr);
+ #endif /* _IAVF_H_ */
+diff --git a/drivers/net/ethernet/intel/iavf/iavf_main.c 
b/drivers/net/ethernet/intel/iavf/iavf_main.c
+index 821987da5698..8e16be960e96 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf_main.c
++++ b/drivers/net/ethernet/intel/iavf/iavf_main.c
+@@ -743,9 +743,8 @@ iavf_mac_filter *iavf_find_filter(struct iavf_adapter 
*adapter,
+  *
+  * Returns ptr to the filter object or NULL when no memory available.
+  **/
+-static struct
+-iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter,
+-                               const u8 *macaddr)
++struct iavf_mac_filter *iavf_add_filter(struct iavf_adapter *adapter,
++                                      const u8 *macaddr)
+ {
+       struct iavf_mac_filter *f;
+ 
+@@ -2065,9 +2064,9 @@ static void iavf_reset_task(struct work_struct *work)
+       struct virtchnl_vf_resource *vfres = adapter->vf_res;
+       struct net_device *netdev = adapter->netdev;
+       struct iavf_hw *hw = &adapter->hw;
++      struct iavf_mac_filter *f, *ftmp;
+       struct iavf_vlan_filter *vlf;
+       struct iavf_cloud_filter *cf;
+-      struct iavf_mac_filter *f;
+       u32 reg_val;
+       int i = 0, err;
+       bool running;
+@@ -2181,6 +2180,16 @@ continue_reset:
+ 
+       spin_lock_bh(&adapter->mac_vlan_list_lock);
+ 
++      /* Delete filter for the current MAC address, it could have
++       * been changed by the PF via administratively set MAC.
++       * Will be re-added via VIRTCHNL_OP_GET_VF_RESOURCES.
++       */
++      list_for_each_entry_safe(f, ftmp, &adapter->mac_filter_list, list) {
++              if (ether_addr_equal(f->macaddr, adapter->hw.mac.addr)) {
++                      list_del(&f->list);
++                      kfree(f);
++              }
++      }
+       /* re-add all MAC filters */
+       list_for_each_entry(f, &adapter->mac_filter_list, list) {
+               f->add = true;
+diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c 
b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
+index c46770eba320..1ab9cb339acb 100644
+--- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
++++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c
+@@ -1359,6 +1359,9 @@ void iavf_virtchnl_completion(struct iavf_adapter 
*adapter,
+                       ether_addr_copy(netdev->perm_addr,
+                                       adapter->hw.mac.addr);
+               }
++              spin_lock_bh(&adapter->mac_vlan_list_lock);
++              iavf_add_filter(adapter, adapter->hw.mac.addr);
++              spin_unlock_bh(&adapter->mac_vlan_list_lock);
+               iavf_process_config(adapter);
+               }
+               break;
+diff --git a/drivers/net/ethernet/intel/igb/e1000_82575.c 
b/drivers/net/ethernet/intel/igb/e1000_82575.c
+index 8a6ef3514129..438b42ce2cd9 100644
+--- a/drivers/net/ethernet/intel/igb/e1000_82575.c
++++ b/drivers/net/ethernet/intel/igb/e1000_82575.c
+@@ -530,7 +530,7 @@ static s32 igb_set_sfp_media_type_82575(struct e1000_hw 
*hw)
+               dev_spec->module_plugged = true;
+               if (eth_flags->e1000_base_lx || eth_flags->e1000_base_sx) {
+                       hw->phy.media_type = e1000_media_type_internal_serdes;
+-              } else if (eth_flags->e100_base_fx) {
++              } else if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) {
+                       dev_spec->sgmii_active = true;
+                       hw->phy.media_type = e1000_media_type_internal_serdes;
+               } else if (eth_flags->e1000_base_t) {
+@@ -657,14 +657,10 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
+                       break;
+               }
+ 
+-              /* do not change link mode for 100BaseFX */
+-              if (dev_spec->eth_flags.e100_base_fx)
+-                      break;
+-
+               /* change current link mode setting */
+               ctrl_ext &= ~E1000_CTRL_EXT_LINK_MODE_MASK;
+ 
+-              if (hw->phy.media_type == e1000_media_type_copper)
++              if (dev_spec->sgmii_active)
+                       ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_SGMII;
+               else
+                       ctrl_ext |= E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES;
+diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c 
b/drivers/net/ethernet/intel/igb/igb_ethtool.c
+index 3182b059bf55..8959418776f6 100644
+--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
++++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
+@@ -181,7 +181,7 @@ static int igb_get_link_ksettings(struct net_device 
*netdev,
+                               advertising &= ~ADVERTISED_1000baseKX_Full;
+                       }
+               }
+-              if (eth_flags->e100_base_fx) {
++              if (eth_flags->e100_base_fx || eth_flags->e100_base_lx) {
+                       supported |= SUPPORTED_100baseT_Full;
+                       advertising |= ADVERTISED_100baseT_Full;
+               }
+diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c 
b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+index c6404abf2dd1..a26f9fb95ac0 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+@@ -5239,7 +5239,7 @@ static void ixgbe_fdir_filter_restore(struct 
ixgbe_adapter *adapter)
+       struct ixgbe_hw *hw = &adapter->hw;
+       struct hlist_node *node2;
+       struct ixgbe_fdir_filter *filter;
+-      u64 action;
++      u8 queue;
+ 
+       spin_lock(&adapter->fdir_perfect_lock);
+ 
+@@ -5248,17 +5248,34 @@ static void ixgbe_fdir_filter_restore(struct 
ixgbe_adapter *adapter)
+ 
+       hlist_for_each_entry_safe(filter, node2,
+                                 &adapter->fdir_filter_list, fdir_node) {
+-              action = filter->action;
+-              if (action != IXGBE_FDIR_DROP_QUEUE && action != 0)
+-                      action =
+-                      (action >> ETHTOOL_RX_FLOW_SPEC_RING_VF_OFF) - 1;
++              if (filter->action == IXGBE_FDIR_DROP_QUEUE) {
++                      queue = IXGBE_FDIR_DROP_QUEUE;
++              } else {
++                      u32 ring = ethtool_get_flow_spec_ring(filter->action);
++                      u8 vf = ethtool_get_flow_spec_ring_vf(filter->action);
++
++                      if (!vf && (ring >= adapter->num_rx_queues)) {
++                              e_err(drv, "FDIR restore failed without VF, 
ring: %u\n",
++                                    ring);
++                              continue;
++                      } else if (vf &&
++                                 ((vf > adapter->num_vfs) ||
++                                   ring >= adapter->num_rx_queues_per_pool)) {
++                              e_err(drv, "FDIR restore failed with VF, vf: 
%hhu, ring: %u\n",
++                                    vf, ring);
++                              continue;
++                      }
++
++                      /* Map the ring onto the absolute queue index */
++                      if (!vf)
++                              queue = adapter->rx_ring[ring]->reg_idx;
++                      else
++                              queue = ((vf - 1) *
++                                      adapter->num_rx_queues_per_pool) + ring;
++              }
+ 
+               ixgbe_fdir_write_perfect_filter_82599(hw,
+-                              &filter->filter,
+-                              filter->sw_idx,
+-                              (action == IXGBE_FDIR_DROP_QUEUE) ?
+-                              IXGBE_FDIR_DROP_QUEUE :
+-                              adapter->rx_ring[action]->reg_idx);
++                              &filter->filter, filter->sw_idx, queue);
+       }
+ 
+       spin_unlock(&adapter->fdir_perfect_lock);
+diff --git a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c 
b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+index 076f2da36f27..64ec0e7c64b4 100644
+--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
++++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+@@ -2081,11 +2081,6 @@ static int ixgbevf_write_uc_addr_list(struct net_device 
*netdev)
+       struct ixgbe_hw *hw = &adapter->hw;
+       int count = 0;
+ 
+-      if ((netdev_uc_count(netdev)) > 10) {
+-              pr_err("Too many unicast filters - No Space\n");
+-              return -ENOSPC;
+-      }
+-
+       if (!netdev_uc_empty(netdev)) {
+               struct netdev_hw_addr *ha;
+ 
+diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c 
b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+index a496390b8632..07f9067affc6 100644
+--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_83xx_init.c
+@@ -2043,6 +2043,7 @@ static void qlcnic_83xx_exec_template_cmd(struct 
qlcnic_adapter *p_dev,
+                       break;
+               }
+               entry += p_hdr->size;
++              cond_resched();
+       }
+       p_dev->ahw->reset.seq_index = index;
+ }
+diff --git a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c 
b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
+index afa10a163da1..f34ae8c75bc5 100644
+--- a/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
++++ b/drivers/net/ethernet/qlogic/qlcnic/qlcnic_minidump.c
+@@ -703,6 +703,7 @@ static u32 qlcnic_read_memory_test_agent(struct 
qlcnic_adapter *adapter,
+               addr += 16;
+               reg_read -= 16;
+               ret += 16;
++              cond_resched();
+       }
+ out:
+       mutex_unlock(&adapter->ahw->mem_lock);
+@@ -1383,6 +1384,7 @@ int qlcnic_dump_fw(struct qlcnic_adapter *adapter)
+               buf_offset += entry->hdr.cap_size;
+               entry_offset += entry->hdr.offset;
+               buffer = fw_dump->data + buf_offset;
++              cond_resched();
+       }
+ 
+       fw_dump->clr = 1;
+diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c
+index 4196c0e32740..9485c8d1de8a 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -1062,6 +1062,7 @@ static const struct usb_device_id products[] = {
+       {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0125)},     /* Quectel EC25, EC20 
R2.0  Mini PCIe */
+       {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0306)},     /* Quectel 
EP06/EG06/EM06 */
+       {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0512)},     /* Quectel EG12/EM12 */
++      {QMI_QUIRK_QUECTEL_DYNCFG(0x2c7c, 0x0800)},     /* Quectel RM500Q-GL */
+ 
+       /* 3. Combined interface devices matching on interface number */
+       {QMI_FIXED_INTF(0x0408, 0xea42, 4)},    /* Yota / Megafon M100-1 */
+diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
+index 9e4b7a400284..6912624eed4a 100644
+--- a/drivers/net/usb/r8152.c
++++ b/drivers/net/usb/r8152.c
+@@ -29,7 +29,7 @@
+ #define NETNEXT_VERSION               "10"
+ 
+ /* Information for net */
+-#define NET_VERSION           "10"
++#define NET_VERSION           "11"
+ 
+ #define DRIVER_VERSION                "v1." NETNEXT_VERSION "." NET_VERSION
+ #define DRIVER_AUTHOR "Realtek linux nic maintainers <[email protected]>"
+@@ -63,6 +63,7 @@
+ #define PLA_LED_FEATURE               0xdd92
+ #define PLA_PHYAR             0xde00
+ #define PLA_BOOT_CTRL         0xe004
++#define PLA_LWAKE_CTRL_REG    0xe007
+ #define PLA_GPHY_INTR_IMR     0xe022
+ #define PLA_EEE_CR            0xe040
+ #define PLA_EEEP_CR           0xe080
+@@ -90,6 +91,7 @@
+ #define PLA_TALLYCNT          0xe890
+ #define PLA_SFF_STS_7         0xe8de
+ #define PLA_PHYSTATUS         0xe908
++#define PLA_CONFIG6           0xe90a /* CONFIG6 */
+ #define PLA_BP_BA             0xfc26
+ #define PLA_BP_0              0xfc28
+ #define PLA_BP_1              0xfc2a
+@@ -102,6 +104,7 @@
+ #define PLA_BP_EN             0xfc38
+ 
+ #define USB_USB2PHY           0xb41e
++#define USB_SSPHYLINK1                0xb426
+ #define USB_SSPHYLINK2                0xb428
+ #define USB_U2P3_CTRL         0xb460
+ #define USB_CSR_DUMMY1                0xb464
+@@ -286,6 +289,9 @@
+ #define LINK_ON_WAKE_EN               0x0010
+ #define LINK_OFF_WAKE_EN      0x0008
+ 
++/* PLA_CONFIG6 */
++#define LANWAKE_CLR_EN                BIT(0)
++
+ /* PLA_CONFIG5 */
+ #define BWF_EN                        0x0040
+ #define MWF_EN                        0x0020
+@@ -298,6 +304,7 @@
+ /* PLA_PHY_PWR */
+ #define TX_10M_IDLE_EN                0x0080
+ #define PFM_PWM_SWITCH                0x0040
++#define TEST_IO_OFF           BIT(4)
+ 
+ /* PLA_MAC_PWR_CTRL */
+ #define D3_CLK_GATED_EN               0x00004000
+@@ -310,6 +317,7 @@
+ #define MAC_CLK_SPDWN_EN      BIT(15)
+ 
+ /* PLA_MAC_PWR_CTRL3 */
++#define PLA_MCU_SPDWN_EN      BIT(14)
+ #define PKT_AVAIL_SPDWN_EN    0x0100
+ #define SUSPEND_SPDWN_EN      0x0004
+ #define U1U2_SPDWN_EN         0x0002
+@@ -340,6 +348,9 @@
+ /* PLA_BOOT_CTRL */
+ #define AUTOLOAD_DONE         0x0002
+ 
++/* PLA_LWAKE_CTRL_REG */
++#define LANWAKE_PIN           BIT(7)
++
+ /* PLA_SUSPEND_FLAG */
+ #define LINK_CHG_EVENT                BIT(0)
+ 
+@@ -353,6 +364,9 @@
+ #define USB2PHY_SUSPEND               0x0001
+ #define USB2PHY_L1            0x0002
+ 
++/* USB_SSPHYLINK1 */
++#define DELAY_PHY_PWR_CHG     BIT(1)
++
+ /* USB_SSPHYLINK2 */
+ #define pwd_dn_scale_mask     0x3ffe
+ #define pwd_dn_scale(x)               ((x) << 1)
+@@ -3175,7 +3189,6 @@ static void rtl8153b_runtime_enable(struct r8152 *tp, 
bool enable)
+               r8153b_ups_en(tp, false);
+               r8153_queue_wake(tp, false);
+               rtl_runtime_suspend_enable(tp, false);
+-              r8153_u2p3en(tp, true);
+               r8153b_u1u2en(tp, true);
+       }
+ }
+@@ -3703,7 +3716,6 @@ static void r8153b_hw_phy_cfg(struct r8152 *tp)
+ 
+       r8153_aldps_en(tp, true);
+       r8152b_enable_fc(tp);
+-      r8153_u2p3en(tp, true);
+ 
+       set_bit(PHY_RESET, &tp->flags);
+ }
+@@ -4004,6 +4016,8 @@ static void rtl8152_down(struct r8152 *tp)
+ 
+ static void rtl8153_up(struct r8152 *tp)
+ {
++      u32 ocp_data;
++
+       if (test_bit(RTL8152_UNPLUG, &tp->flags))
+               return;
+ 
+@@ -4011,6 +4025,19 @@ static void rtl8153_up(struct r8152 *tp)
+       r8153_u2p3en(tp, false);
+       r8153_aldps_en(tp, false);
+       r8153_first_init(tp);
++
++      ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6);
++      ocp_data |= LANWAKE_CLR_EN;
++      ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data);
++
++      ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG);
++      ocp_data &= ~LANWAKE_PIN;
++      ocp_write_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG, ocp_data);
++
++      ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_SSPHYLINK1);
++      ocp_data &= ~DELAY_PHY_PWR_CHG;
++      ocp_write_word(tp, MCU_TYPE_USB, USB_SSPHYLINK1, ocp_data);
++
+       r8153_aldps_en(tp, true);
+ 
+       switch (tp->version) {
+@@ -4029,11 +4056,17 @@ static void rtl8153_up(struct r8152 *tp)
+ 
+ static void rtl8153_down(struct r8152 *tp)
+ {
++      u32 ocp_data;
++
+       if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
+               rtl_drop_queued_tx(tp);
+               return;
+       }
+ 
++      ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6);
++      ocp_data &= ~LANWAKE_CLR_EN;
++      ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data);
++
+       r8153_u1u2en(tp, false);
+       r8153_u2p3en(tp, false);
+       r8153_power_cut_en(tp, false);
+@@ -4044,6 +4077,8 @@ static void rtl8153_down(struct r8152 *tp)
+ 
+ static void rtl8153b_up(struct r8152 *tp)
+ {
++      u32 ocp_data;
++
+       if (test_bit(RTL8152_UNPLUG, &tp->flags))
+               return;
+ 
+@@ -4054,18 +4089,27 @@ static void rtl8153b_up(struct r8152 *tp)
+       r8153_first_init(tp);
+       ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, RX_THR_B);
+ 
++      ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3);
++      ocp_data &= ~PLA_MCU_SPDWN_EN;
++      ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data);
++
+       r8153_aldps_en(tp, true);
+-      r8153_u2p3en(tp, true);
+       r8153b_u1u2en(tp, true);
+ }
+ 
+ static void rtl8153b_down(struct r8152 *tp)
+ {
++      u32 ocp_data;
++
+       if (test_bit(RTL8152_UNPLUG, &tp->flags)) {
+               rtl_drop_queued_tx(tp);
+               return;
+       }
+ 
++      ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3);
++      ocp_data |= PLA_MCU_SPDWN_EN;
++      ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data);
++
+       r8153b_u1u2en(tp, false);
+       r8153_u2p3en(tp, false);
+       r8153b_power_cut_en(tp, false);
+@@ -4454,6 +4498,14 @@ static void r8153_init(struct r8152 *tp)
+       r8153_mac_clk_spd(tp, false);
+       usb_enable_lpm(tp->udev);
+ 
++      ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6);
++      ocp_data |= LANWAKE_CLR_EN;
++      ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CONFIG6, ocp_data);
++
++      ocp_data = ocp_read_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG);
++      ocp_data &= ~LANWAKE_PIN;
++      ocp_write_byte(tp, MCU_TYPE_PLA, PLA_LWAKE_CTRL_REG, ocp_data);
++
+       /* rx aggregation */
+       ocp_data = ocp_read_word(tp, MCU_TYPE_USB, USB_USB_CTRL);
+       ocp_data &= ~(RX_AGG_DISABLE | RX_ZERO_EN);
+@@ -4526,6 +4578,19 @@ static void r8153b_init(struct r8152 *tp)
+       ocp_data |= MAC_CLK_SPDWN_EN;
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL2, ocp_data);
+ 
++      ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3);
++      ocp_data &= ~PLA_MCU_SPDWN_EN;
++      ocp_write_word(tp, MCU_TYPE_PLA, PLA_MAC_PWR_CTRL3, ocp_data);
++
++      if (tp->version == RTL_VER_09) {
++              /* Disable Test IO for 32QFN */
++              if (ocp_read_byte(tp, MCU_TYPE_PLA, 0xdc00) & BIT(5)) {
++                      ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR);
++                      ocp_data |= TEST_IO_OFF;
++                      ocp_write_word(tp, MCU_TYPE_PLA, PLA_PHY_PWR, ocp_data);
++              }
++      }
++
+       set_bit(GREEN_ETHERNET, &tp->flags);
+ 
+       /* rx aggregation */
+@@ -5690,6 +5755,11 @@ static int rtl8152_probe(struct usb_interface *intf,
+ 
+       intf->needs_remote_wakeup = 1;
+ 
++      if (!rtl_can_wakeup(tp))
++              __rtl_set_wol(tp, 0);
++      else
++              tp->saved_wolopts = __rtl_get_wol(tp);
++
+       tp->rtl_ops.init(tp);
+       queue_delayed_work(system_long_wq, &tp->hw_phy_work, 0);
+       set_ethernet_addr(tp);
+@@ -5703,10 +5773,6 @@ static int rtl8152_probe(struct usb_interface *intf,
+               goto out1;
+       }
+ 
+-      if (!rtl_can_wakeup(tp))
+-              __rtl_set_wol(tp, 0);
+-
+-      tp->saved_wolopts = __rtl_get_wol(tp);
+       if (tp->saved_wolopts)
+               device_set_wakeup_enable(&udev->dev, true);
+       else
+diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c 
b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
+index 3029e3f6de63..621cd7206b7c 100644
+--- a/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
++++ b/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
+@@ -267,7 +267,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
+       struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
+       struct iwl_station_priv *sta_priv = NULL;
+       struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
+-      struct iwl_device_cmd *dev_cmd;
++      struct iwl_device_tx_cmd *dev_cmd;
+       struct iwl_tx_cmd *tx_cmd;
+       __le16 fc;
+       u8 hdr_len;
+@@ -348,7 +348,6 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
+       if (unlikely(!dev_cmd))
+               goto drop_unlock_priv;
+ 
+-      memset(dev_cmd, 0, sizeof(*dev_cmd));
+       dev_cmd->hdr.cmd = REPLY_TX;
+       tx_cmd = (struct iwl_tx_cmd *) dev_cmd->payload;
+ 
+diff --git a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c 
b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
+index 87421807e040..386ca67ec7b4 100644
+--- a/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
++++ b/drivers/net/wireless/intel/iwlwifi/fw/dbg.c
+@@ -2490,12 +2490,7 @@ int iwl_fw_dbg_stop_restart_recording(struct 
iwl_fw_runtime *fwrt,
+ {
+       int ret = 0;
+ 
+-      /* if the FW crashed or not debug monitor cfg was given, there is
+-       * no point in changing the recording state
+-       */
+-      if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status) ||
+-          (!fwrt->trans->dbg.dest_tlv &&
+-           fwrt->trans->dbg.ini_dest == IWL_FW_INI_LOCATION_INVALID))
++      if (test_bit(STATUS_FW_ERROR, &fwrt->trans->status))
+               return 0;
+ 
+       if (fw_has_capa(&fwrt->fw->ucode_capa,
+diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c 
b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
+index c8972f6e38ba..5d546dac7814 100644
+--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
++++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.c
+@@ -225,6 +225,34 @@ enum iwl_nvm_channel_flags {
+       NVM_CHANNEL_DC_HIGH             = BIT(12),
+ };
+ 
++/**
++ * enum iwl_reg_capa_flags - global flags applied for the whole regulatory
++ * domain.
++ * @REG_CAPA_BF_CCD_LOW_BAND: Beam-forming or Cyclic Delay Diversity in the
++ *    2.4Ghz band is allowed.
++ * @REG_CAPA_BF_CCD_HIGH_BAND: Beam-forming or Cyclic Delay Diversity in the
++ *    5Ghz band is allowed.
++ * @REG_CAPA_160MHZ_ALLOWED: 11ac channel with a width of 160Mhz is allowed
++ *    for this regulatory domain (valid only in 5Ghz).
++ * @REG_CAPA_80MHZ_ALLOWED: 11ac channel with a width of 80Mhz is allowed
++ *    for this regulatory domain (valid only in 5Ghz).
++ * @REG_CAPA_MCS_8_ALLOWED: 11ac with MCS 8 is allowed.
++ * @REG_CAPA_MCS_9_ALLOWED: 11ac with MCS 9 is allowed.
++ * @REG_CAPA_40MHZ_FORBIDDEN: 11n channel with a width of 40Mhz is forbidden
++ *    for this regulatory domain (valid only in 5Ghz).
++ * @REG_CAPA_DC_HIGH_ENABLED: DC HIGH allowed.
++ */
++enum iwl_reg_capa_flags {
++      REG_CAPA_BF_CCD_LOW_BAND        = BIT(0),
++      REG_CAPA_BF_CCD_HIGH_BAND       = BIT(1),
++      REG_CAPA_160MHZ_ALLOWED         = BIT(2),
++      REG_CAPA_80MHZ_ALLOWED          = BIT(3),
++      REG_CAPA_MCS_8_ALLOWED          = BIT(4),
++      REG_CAPA_MCS_9_ALLOWED          = BIT(5),
++      REG_CAPA_40MHZ_FORBIDDEN        = BIT(7),
++      REG_CAPA_DC_HIGH_ENABLED        = BIT(9),
++};
++
+ static inline void iwl_nvm_print_channel_flags(struct device *dev, u32 level,
+                                              int chan, u32 flags)
+ {
+@@ -1031,6 +1059,7 @@ IWL_EXPORT_SYMBOL(iwl_parse_nvm_data);
+ 
+ static u32 iwl_nvm_get_regdom_bw_flags(const u16 *nvm_chan,
+                                      int ch_idx, u16 nvm_flags,
++                                     u16 cap_flags,
+                                      const struct iwl_cfg *cfg)
+ {
+       u32 flags = NL80211_RRF_NO_HT40;
+@@ -1069,13 +1098,27 @@ static u32 iwl_nvm_get_regdom_bw_flags(const u16 
*nvm_chan,
+           (flags & NL80211_RRF_NO_IR))
+               flags |= NL80211_RRF_GO_CONCURRENT;
+ 
++      /*
++       * cap_flags is per regulatory domain so apply it for every channel
++       */
++      if (ch_idx >= NUM_2GHZ_CHANNELS) {
++              if (cap_flags & REG_CAPA_40MHZ_FORBIDDEN)
++                      flags |= NL80211_RRF_NO_HT40;
++
++              if (!(cap_flags & REG_CAPA_80MHZ_ALLOWED))
++                      flags |= NL80211_RRF_NO_80MHZ;
++
++              if (!(cap_flags & REG_CAPA_160MHZ_ALLOWED))
++                      flags |= NL80211_RRF_NO_160MHZ;
++      }
++
+       return flags;
+ }
+ 
+ struct ieee80211_regdomain *
+ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
+                      int num_of_ch, __le32 *channels, u16 fw_mcc,
+-                     u16 geo_info)
++                     u16 geo_info, u16 cap)
+ {
+       int ch_idx;
+       u16 ch_flags;
+@@ -1133,7 +1176,8 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct 
iwl_cfg *cfg,
+               }
+ 
+               reg_rule_flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx,
+-                                                           ch_flags, cfg);
++                                                           ch_flags, cap,
++                                                           cfg);
+ 
+               /* we can't continue the same rule */
+               if (ch_idx == 0 || prev_reg_rule_flags != reg_rule_flags ||
+diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h 
b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
+index b7e1ddf8f177..4eeedb41e9ac 100644
+--- a/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
++++ b/drivers/net/wireless/intel/iwlwifi/iwl-nvm-parse.h
+@@ -7,7 +7,7 @@
+  *
+  * Copyright(c) 2008 - 2015 Intel Corporation. All rights reserved.
+  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
+- * Copyright(c) 2018        Intel Corporation
++ * Copyright(c) 2018 - 2019 Intel Corporation
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of version 2 of the GNU General Public License as
+@@ -29,7 +29,7 @@
+  *
+  * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved.
+  * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
+- * Copyright(c) 2018        Intel Corporation
++ * Copyright(c) 2018 - 2019 Intel Corporation
+  * All rights reserved.
+  *
+  * Redistribution and use in source and binary forms, with or without
+@@ -103,7 +103,7 @@ iwl_parse_nvm_data(struct iwl_trans *trans, const struct 
iwl_cfg *cfg,
+ struct ieee80211_regdomain *
+ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
+                      int num_of_ch, __le32 *channels, u16 fw_mcc,
+-                     u16 geo_info);
++                     u16 geo_info, u16 cap);
+ 
+ /**
+  * struct iwl_nvm_section - describes an NVM section in memory.
+diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c 
b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
+index 28bdc9a9617e..f91197e4ae40 100644
+--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
++++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.c
+@@ -66,7 +66,9 @@
+ 
+ struct iwl_trans *iwl_trans_alloc(unsigned int priv_size,
+                                 struct device *dev,
+-                                const struct iwl_trans_ops *ops)
++                                const struct iwl_trans_ops *ops,
++                                unsigned int cmd_pool_size,
++                                unsigned int cmd_pool_align)
+ {
+       struct iwl_trans *trans;
+ #ifdef CONFIG_LOCKDEP
+@@ -90,10 +92,8 @@ struct iwl_trans *iwl_trans_alloc(unsigned int priv_size,
+                "iwl_cmd_pool:%s", dev_name(trans->dev));
+       trans->dev_cmd_pool =
+               kmem_cache_create(trans->dev_cmd_pool_name,
+-                                sizeof(struct iwl_device_cmd),
+-                                sizeof(void *),
+-                                SLAB_HWCACHE_ALIGN,
+-                                NULL);
++                                cmd_pool_size, cmd_pool_align,
++                                SLAB_HWCACHE_ALIGN, NULL);
+       if (!trans->dev_cmd_pool)
+               return NULL;
+ 
+diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h 
b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+index a31408188ed0..1e85d59b9161 100644
+--- a/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
++++ b/drivers/net/wireless/intel/iwlwifi/iwl-trans.h
+@@ -193,6 +193,18 @@ struct iwl_device_cmd {
+       };
+ } __packed;
+ 
++/**
++ * struct iwl_device_tx_cmd - buffer for TX command
++ * @hdr: the header
++ * @payload: the payload placeholder
++ *
++ * The actual structure is sized dynamically according to need.
++ */
++struct iwl_device_tx_cmd {
++      struct iwl_cmd_header hdr;
++      u8 payload[];
++} __packed;
++
+ #define TFD_MAX_PAYLOAD_SIZE (sizeof(struct iwl_device_cmd))
+ 
+ /*
+@@ -544,7 +556,7 @@ struct iwl_trans_ops {
+       int (*send_cmd)(struct iwl_trans *trans, struct iwl_host_cmd *cmd);
+ 
+       int (*tx)(struct iwl_trans *trans, struct sk_buff *skb,
+-                struct iwl_device_cmd *dev_cmd, int queue);
++                struct iwl_device_tx_cmd *dev_cmd, int queue);
+       void (*reclaim)(struct iwl_trans *trans, int queue, int ssn,
+                       struct sk_buff_head *skbs);
+ 
+@@ -921,22 +933,22 @@ iwl_trans_dump_data(struct iwl_trans *trans, u32 
dump_mask)
+       return trans->ops->dump_data(trans, dump_mask);
+ }
+ 
+-static inline struct iwl_device_cmd *
++static inline struct iwl_device_tx_cmd *
+ iwl_trans_alloc_tx_cmd(struct iwl_trans *trans)
+ {
+-      return kmem_cache_alloc(trans->dev_cmd_pool, GFP_ATOMIC);
++      return kmem_cache_zalloc(trans->dev_cmd_pool, GFP_ATOMIC);
+ }
+ 
+ int iwl_trans_send_cmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd);
+ 
+ static inline void iwl_trans_free_tx_cmd(struct iwl_trans *trans,
+-                                       struct iwl_device_cmd *dev_cmd)
++                                       struct iwl_device_tx_cmd *dev_cmd)
+ {
+       kmem_cache_free(trans->dev_cmd_pool, dev_cmd);
+ }
+ 
+ static inline int iwl_trans_tx(struct iwl_trans *trans, struct sk_buff *skb,
+-                             struct iwl_device_cmd *dev_cmd, int queue)
++                             struct iwl_device_tx_cmd *dev_cmd, int queue)
+ {
+       if (unlikely(test_bit(STATUS_FW_ERROR, &trans->status)))
+               return -EIO;
+@@ -1239,7 +1251,9 @@ static inline bool iwl_trans_dbg_ini_valid(struct 
iwl_trans *trans)
+  *****************************************************/
+ struct iwl_trans *iwl_trans_alloc(unsigned int priv_size,
+                                 struct device *dev,
+-                                const struct iwl_trans_ops *ops);
++                                const struct iwl_trans_ops *ops,
++                                unsigned int cmd_pool_size,
++                                unsigned int cmd_pool_align);
+ void iwl_trans_free(struct iwl_trans *trans);
+ 
+ /*****************************************************
+diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c 
b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+index 49aeab7c27a2..18ccc2692437 100644
+--- a/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
++++ b/drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
+@@ -256,7 +256,8 @@ struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct 
wiphy *wiphy,
+                                     __le32_to_cpu(resp->n_channels),
+                                     resp->channels,
+                                     __le16_to_cpu(resp->mcc),
+-                                    __le16_to_cpu(resp->geo_info));
++                                    __le16_to_cpu(resp->geo_info),
++                                    __le16_to_cpu(resp->cap));
+       /* Store the return source id */
+       src_id = resp->source_id;
+       kfree(resp);
+diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c 
b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+index d9d82f6b5e87..2b92980a49e6 100644
+--- a/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
++++ b/drivers/net/wireless/intel/iwlwifi/mvm/tx.c
+@@ -487,13 +487,13 @@ static void iwl_mvm_set_tx_cmd_crypto(struct iwl_mvm 
*mvm,
+ /*
+  * Allocates and sets the Tx cmd the driver data pointers in the skb
+  */
+-static struct iwl_device_cmd *
++static struct iwl_device_tx_cmd *
+ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb,
+                     struct ieee80211_tx_info *info, int hdrlen,
+                     struct ieee80211_sta *sta, u8 sta_id)
+ {
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+-      struct iwl_device_cmd *dev_cmd;
++      struct iwl_device_tx_cmd *dev_cmd;
+       struct iwl_tx_cmd *tx_cmd;
+ 
+       dev_cmd = iwl_trans_alloc_tx_cmd(mvm->trans);
+@@ -501,11 +501,6 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff 
*skb,
+       if (unlikely(!dev_cmd))
+               return NULL;
+ 
+-      /* Make sure we zero enough of dev_cmd */
+-      BUILD_BUG_ON(sizeof(struct iwl_tx_cmd_gen2) > sizeof(*tx_cmd));
+-      BUILD_BUG_ON(sizeof(struct iwl_tx_cmd_gen3) > sizeof(*tx_cmd));
+-
+-      memset(dev_cmd, 0, sizeof(dev_cmd->hdr) + sizeof(*tx_cmd));
+       dev_cmd->hdr.cmd = TX_CMD;
+ 
+       if (iwl_mvm_has_new_tx_api(mvm)) {
+@@ -594,7 +589,7 @@ out:
+ }
+ 
+ static void iwl_mvm_skb_prepare_status(struct sk_buff *skb,
+-                                     struct iwl_device_cmd *cmd)
++                                     struct iwl_device_tx_cmd *cmd)
+ {
+       struct ieee80211_tx_info *skb_info = IEEE80211_SKB_CB(skb);
+ 
+@@ -713,7 +708,7 @@ int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct 
sk_buff *skb)
+ {
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+       struct ieee80211_tx_info info;
+-      struct iwl_device_cmd *dev_cmd;
++      struct iwl_device_tx_cmd *dev_cmd;
+       u8 sta_id;
+       int hdrlen = ieee80211_hdrlen(hdr->frame_control);
+       __le16 fc = hdr->frame_control;
+@@ -1075,7 +1070,7 @@ static int iwl_mvm_tx_mpdu(struct iwl_mvm *mvm, struct 
sk_buff *skb,
+ {
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
+       struct iwl_mvm_sta *mvmsta;
+-      struct iwl_device_cmd *dev_cmd;
++      struct iwl_device_tx_cmd *dev_cmd;
+       __le16 fc;
+       u16 seq_number = 0;
+       u8 tid = IWL_MAX_TID_COUNT;
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h 
b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
+index 1047d48beaa5..9b5b96e34456 100644
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/internal.h
+@@ -305,7 +305,7 @@ struct iwl_cmd_meta {
+ #define IWL_FIRST_TB_SIZE_ALIGN ALIGN(IWL_FIRST_TB_SIZE, 64)
+ 
+ struct iwl_pcie_txq_entry {
+-      struct iwl_device_cmd *cmd;
++      void *cmd;
+       struct sk_buff *skb;
+       /* buffer to free after command completes */
+       const void *free_buf;
+@@ -690,7 +690,7 @@ void iwl_trans_pcie_txq_set_shared_mode(struct iwl_trans 
*trans, u32 txq_id,
+ void iwl_trans_pcie_log_scd_error(struct iwl_trans *trans,
+                                 struct iwl_txq *txq);
+ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
+-                    struct iwl_device_cmd *dev_cmd, int txq_id);
++                    struct iwl_device_tx_cmd *dev_cmd, int txq_id);
+ void iwl_pcie_txq_check_wrptrs(struct iwl_trans *trans);
+ int iwl_trans_pcie_send_hcmd(struct iwl_trans *trans, struct iwl_host_cmd 
*cmd);
+ void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx);
+@@ -1111,7 +1111,7 @@ int iwl_trans_pcie_dyn_txq_alloc(struct iwl_trans *trans,
+                                unsigned int timeout);
+ void iwl_trans_pcie_dyn_txq_free(struct iwl_trans *trans, int queue);
+ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb,
+-                         struct iwl_device_cmd *dev_cmd, int txq_id);
++                         struct iwl_device_tx_cmd *dev_cmd, int txq_id);
+ int iwl_trans_pcie_gen2_send_hcmd(struct iwl_trans *trans,
+                                 struct iwl_host_cmd *cmd);
+ void iwl_trans_pcie_gen2_stop_device(struct iwl_trans *trans);
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c 
b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+index d3db38c3095b..c76d26708e65 100644
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/trans.c
+@@ -79,6 +79,7 @@
+ #include "iwl-agn-hw.h"
+ #include "fw/error-dump.h"
+ #include "fw/dbg.h"
++#include "fw/api/tx.h"
+ #include "internal.h"
+ #include "iwl-fh.h"
+ 
+@@ -3462,19 +3463,34 @@ struct iwl_trans *iwl_trans_pcie_alloc(struct pci_dev 
*pdev,
+ {
+       struct iwl_trans_pcie *trans_pcie;
+       struct iwl_trans *trans;
+-      int ret, addr_size;
++      int ret, addr_size, txcmd_size, txcmd_align;
++      const struct iwl_trans_ops *ops = &trans_ops_pcie_gen2;
++
++      if (!cfg_trans->gen2) {
++              ops = &trans_ops_pcie;
++              txcmd_size = sizeof(struct iwl_tx_cmd);
++              txcmd_align = sizeof(void *);
++      } else if (cfg_trans->device_family < IWL_DEVICE_FAMILY_AX210) {
++              txcmd_size = sizeof(struct iwl_tx_cmd_gen2);
++              txcmd_align = 64;
++      } else {
++              txcmd_size = sizeof(struct iwl_tx_cmd_gen3);
++              txcmd_align = 128;
++      }
++
++      txcmd_size += sizeof(struct iwl_cmd_header);
++      txcmd_size += 36; /* biggest possible 802.11 header */
++
++      /* Ensure device TX cmd cannot reach/cross a page boundary in gen2 */
++      if (WARN_ON(cfg_trans->gen2 && txcmd_size >= txcmd_align))
++              return ERR_PTR(-EINVAL);
+ 
+       ret = pcim_enable_device(pdev);
+       if (ret)
+               return ERR_PTR(ret);
+ 
+-      if (cfg_trans->gen2)
+-              trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie),
+-                                      &pdev->dev, &trans_ops_pcie_gen2);
+-      else
+-              trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie),
+-                                      &pdev->dev, &trans_ops_pcie);
+-
++      trans = iwl_trans_alloc(sizeof(struct iwl_trans_pcie), &pdev->dev, ops,
++                              txcmd_size, txcmd_align);
+       if (!trans)
+               return ERR_PTR(-ENOMEM);
+ 
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c 
b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c
+index 97cb3a8d505c..ff4c34d7b74f 100644
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c
+@@ -243,7 +243,8 @@ static int iwl_pcie_gen2_set_tb(struct iwl_trans *trans,
+ static int iwl_pcie_gen2_build_amsdu(struct iwl_trans *trans,
+                                    struct sk_buff *skb,
+                                    struct iwl_tfh_tfd *tfd, int start_len,
+-                                   u8 hdr_len, struct iwl_device_cmd *dev_cmd)
++                                   u8 hdr_len,
++                                   struct iwl_device_tx_cmd *dev_cmd)
+ {
+ #ifdef CONFIG_INET
+       struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
+@@ -371,7 +372,7 @@ out_err:
+ static struct
+ iwl_tfh_tfd *iwl_pcie_gen2_build_tx_amsdu(struct iwl_trans *trans,
+                                         struct iwl_txq *txq,
+-                                        struct iwl_device_cmd *dev_cmd,
++                                        struct iwl_device_tx_cmd *dev_cmd,
+                                         struct sk_buff *skb,
+                                         struct iwl_cmd_meta *out_meta,
+                                         int hdr_len,
+@@ -403,6 +404,10 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx_amsdu(struct 
iwl_trans *trans,
+       tb_phys = dma_map_single(trans->dev, tb1_addr, len, DMA_TO_DEVICE);
+       if (unlikely(dma_mapping_error(trans->dev, tb_phys)))
+               goto out_err;
++      /*
++       * No need for _with_wa(), we ensure (via alignment) that the data
++       * here can never cross or end at a page boundary.
++       */
+       iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, len);
+ 
+       if (iwl_pcie_gen2_build_amsdu(trans, skb, tfd,
+@@ -456,7 +461,7 @@ static int iwl_pcie_gen2_tx_add_frags(struct iwl_trans 
*trans,
+ static struct
+ iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans *trans,
+                                   struct iwl_txq *txq,
+-                                  struct iwl_device_cmd *dev_cmd,
++                                  struct iwl_device_tx_cmd *dev_cmd,
+                                   struct sk_buff *skb,
+                                   struct iwl_cmd_meta *out_meta,
+                                   int hdr_len,
+@@ -496,6 +501,10 @@ iwl_tfh_tfd *iwl_pcie_gen2_build_tx(struct iwl_trans 
*trans,
+       tb_phys = dma_map_single(trans->dev, tb1_addr, tb1_len, DMA_TO_DEVICE);
+       if (unlikely(dma_mapping_error(trans->dev, tb_phys)))
+               goto out_err;
++      /*
++       * No need for _with_wa(), we ensure (via alignment) that the data
++       * here can never cross or end at a page boundary.
++       */
+       iwl_pcie_gen2_set_tb(trans, tfd, tb_phys, tb1_len);
+       trace_iwlwifi_dev_tx(trans->dev, skb, tfd, sizeof(*tfd), &dev_cmd->hdr,
+                            IWL_FIRST_TB_SIZE + tb1_len, hdr_len);
+@@ -540,7 +549,7 @@ out_err:
+ static
+ struct iwl_tfh_tfd *iwl_pcie_gen2_build_tfd(struct iwl_trans *trans,
+                                           struct iwl_txq *txq,
+-                                          struct iwl_device_cmd *dev_cmd,
++                                          struct iwl_device_tx_cmd *dev_cmd,
+                                           struct sk_buff *skb,
+                                           struct iwl_cmd_meta *out_meta)
+ {
+@@ -580,7 +589,7 @@ struct iwl_tfh_tfd *iwl_pcie_gen2_build_tfd(struct 
iwl_trans *trans,
+ }
+ 
+ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb,
+-                         struct iwl_device_cmd *dev_cmd, int txq_id)
++                         struct iwl_device_tx_cmd *dev_cmd, int txq_id)
+ {
+       struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
+       struct iwl_cmd_meta *out_meta;
+@@ -605,7 +614,7 @@ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct 
sk_buff *skb,
+ 
+               /* don't put the packet on the ring, if there is no room */
+               if (unlikely(iwl_queue_space(trans, txq) < 3)) {
+-                      struct iwl_device_cmd **dev_cmd_ptr;
++                      struct iwl_device_tx_cmd **dev_cmd_ptr;
+ 
+                       dev_cmd_ptr = (void *)((u8 *)skb->cb +
+                                              trans_pcie->dev_cmd_offs);
+diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c 
b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+index 4806a04cec8c..d3b58334e13e 100644
+--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
+@@ -213,8 +213,8 @@ static void iwl_pcie_txq_update_byte_cnt_tbl(struct 
iwl_trans *trans,
+       u8 sec_ctl = 0;
+       u16 len = byte_cnt + IWL_TX_CRC_SIZE + IWL_TX_DELIMITER_SIZE;
+       __le16 bc_ent;
+-      struct iwl_tx_cmd *tx_cmd =
+-              (void *)txq->entries[txq->write_ptr].cmd->payload;
++      struct iwl_device_tx_cmd *dev_cmd = txq->entries[txq->write_ptr].cmd;
++      struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload;
+       u8 sta_id = tx_cmd->sta_id;
+ 
+       scd_bc_tbl = trans_pcie->scd_bc_tbls.addr;
+@@ -257,8 +257,8 @@ static void iwl_pcie_txq_inval_byte_cnt_tbl(struct 
iwl_trans *trans,
+       int read_ptr = txq->read_ptr;
+       u8 sta_id = 0;
+       __le16 bc_ent;
+-      struct iwl_tx_cmd *tx_cmd =
+-              (void *)txq->entries[read_ptr].cmd->payload;
++      struct iwl_device_tx_cmd *dev_cmd = txq->entries[read_ptr].cmd;
++      struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload;
+ 
+       WARN_ON(read_ptr >= TFD_QUEUE_SIZE_MAX);
+ 
+@@ -1196,7 +1196,7 @@ void iwl_trans_pcie_reclaim(struct iwl_trans *trans, int 
txq_id, int ssn,
+ 
+               while (!skb_queue_empty(&overflow_skbs)) {
+                       struct sk_buff *skb = __skb_dequeue(&overflow_skbs);
+-                      struct iwl_device_cmd *dev_cmd_ptr;
++                      struct iwl_device_tx_cmd *dev_cmd_ptr;
+ 
+                       dev_cmd_ptr = *(void **)((u8 *)skb->cb +
+                                                trans_pcie->dev_cmd_offs);
+@@ -2099,7 +2099,8 @@ static void iwl_compute_pseudo_hdr_csum(void *iph, 
struct tcphdr *tcph,
+ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff 
*skb,
+                                  struct iwl_txq *txq, u8 hdr_len,
+                                  struct iwl_cmd_meta *out_meta,
+-                                 struct iwl_device_cmd *dev_cmd, u16 tb1_len)
++                                 struct iwl_device_tx_cmd *dev_cmd,
++                                 u16 tb1_len)
+ {
+       struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload;
+       struct iwl_trans_pcie *trans_pcie = txq->trans_pcie;
+@@ -2281,7 +2282,8 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans 
*trans, struct sk_buff *skb,
+ static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff 
*skb,
+                                  struct iwl_txq *txq, u8 hdr_len,
+                                  struct iwl_cmd_meta *out_meta,
+-                                 struct iwl_device_cmd *dev_cmd, u16 tb1_len)
++                                 struct iwl_device_tx_cmd *dev_cmd,
++                                 u16 tb1_len)
+ {
+       /* No A-MSDU without CONFIG_INET */
+       WARN_ON(1);
+@@ -2291,7 +2293,7 @@ static int iwl_fill_data_tbs_amsdu(struct iwl_trans 
*trans, struct sk_buff *skb,
+ #endif /* CONFIG_INET */
+ 
+ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
+-                    struct iwl_device_cmd *dev_cmd, int txq_id)
++                    struct iwl_device_tx_cmd *dev_cmd, int txq_id)
+ {
+       struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
+       struct ieee80211_hdr *hdr;
+@@ -2348,7 +2350,7 @@ int iwl_trans_pcie_tx(struct iwl_trans *trans, struct 
sk_buff *skb,
+ 
+               /* don't put the packet on the ring, if there is no room */
+               if (unlikely(iwl_queue_space(trans, txq) < 3)) {
+-                      struct iwl_device_cmd **dev_cmd_ptr;
++                      struct iwl_device_tx_cmd **dev_cmd_ptr;
+ 
+                       dev_cmd_ptr = (void *)((u8 *)skb->cb +
+                                              trans_pcie->dev_cmd_offs);
+diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
+index d6cdabef264d..4b9e406b8461 100644
+--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
++++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
+@@ -805,7 +805,7 @@ static int rsi_probe(struct usb_interface *pfunction,
+               adapter->device_model = RSI_DEV_9116;
+       } else {
+               rsi_dbg(ERR_ZONE, "%s: Unsupported RSI device id 0x%x\n",
+-                      __func__, id ? id->idProduct : 0x0);
++                      __func__, id->idProduct);
+               goto err1;
+       }
+ 
+diff --git a/drivers/platform/x86/gpd-pocket-fan.c 
b/drivers/platform/x86/gpd-pocket-fan.c
+index 73eb1572b966..b471b86c28fe 100644
+--- a/drivers/platform/x86/gpd-pocket-fan.c
++++ b/drivers/platform/x86/gpd-pocket-fan.c
+@@ -127,7 +127,7 @@ static int gpd_pocket_fan_probe(struct platform_device 
*pdev)
+       int i;
+ 
+       for (i = 0; i < ARRAY_SIZE(temp_limits); i++) {
+-              if (temp_limits[i] < 40000 || temp_limits[i] > 70000) {
++              if (temp_limits[i] < 20000 || temp_limits[i] > 90000) {
+                       dev_err(&pdev->dev, "Invalid temp-limit %d (must be 
between 40000 and 70000)\n",
+                               temp_limits[i]);
+                       temp_limits[0] = TEMP_LIMIT0_DEFAULT;
+diff --git a/drivers/platform/x86/intel_pmc_core_pltdrv.c 
b/drivers/platform/x86/intel_pmc_core_pltdrv.c
+index 6fe829f30997..e1266f5c6359 100644
+--- a/drivers/platform/x86/intel_pmc_core_pltdrv.c
++++ b/drivers/platform/x86/intel_pmc_core_pltdrv.c
+@@ -44,6 +44,8 @@ static const struct x86_cpu_id intel_pmc_core_platform_ids[] 
= {
+       INTEL_CPU_FAM6(KABYLAKE, pmc_core_device),
+       INTEL_CPU_FAM6(CANNONLAKE_L, pmc_core_device),
+       INTEL_CPU_FAM6(ICELAKE_L, pmc_core_device),
++      INTEL_CPU_FAM6(COMETLAKE, pmc_core_device),
++      INTEL_CPU_FAM6(COMETLAKE_L, pmc_core_device),
+       {}
+ };
+ MODULE_DEVICE_TABLE(x86cpu, intel_pmc_core_platform_ids);
+diff --git a/drivers/s390/crypto/ap_bus.c b/drivers/s390/crypto/ap_bus.c
+index a1915061932e..5256e3ce84e5 100644
+--- a/drivers/s390/crypto/ap_bus.c
++++ b/drivers/s390/crypto/ap_bus.c
+@@ -793,8 +793,6 @@ static int ap_device_probe(struct device *dev)
+               drvres = ap_drv->flags & AP_DRIVER_FLAG_DEFAULT;
+               if (!!devres != !!drvres)
+                       return -ENODEV;
+-              /* (re-)init queue's state machine */
+-              ap_queue_reinit_state(to_ap_queue(dev));
+       }
+ 
+       /* Add queue/card to list of active queues/cards */
+diff --git a/drivers/s390/crypto/ap_bus.h b/drivers/s390/crypto/ap_bus.h
+index 433b7b64368d..bb35ba4a8d24 100644
+--- a/drivers/s390/crypto/ap_bus.h
++++ b/drivers/s390/crypto/ap_bus.h
+@@ -261,7 +261,7 @@ void ap_queue_prepare_remove(struct ap_queue *aq);
+ void ap_queue_remove(struct ap_queue *aq);
+ void ap_queue_suspend(struct ap_device *ap_dev);
+ void ap_queue_resume(struct ap_device *ap_dev);
+-void ap_queue_reinit_state(struct ap_queue *aq);
++void ap_queue_init_state(struct ap_queue *aq);
+ 
+ struct ap_card *ap_card_create(int id, int queue_depth, int raw_device_type,
+                              int comp_device_type, unsigned int functions);
+diff --git a/drivers/s390/crypto/ap_queue.c b/drivers/s390/crypto/ap_queue.c
+index dad2be333d82..37c3bdc3642d 100644
+--- a/drivers/s390/crypto/ap_queue.c
++++ b/drivers/s390/crypto/ap_queue.c
+@@ -638,7 +638,7 @@ struct ap_queue *ap_queue_create(ap_qid_t qid, int 
device_type)
+       aq->ap_dev.device.type = &ap_queue_type;
+       aq->ap_dev.device_type = device_type;
+       aq->qid = qid;
+-      aq->state = AP_STATE_RESET_START;
++      aq->state = AP_STATE_UNBOUND;
+       aq->interrupt = AP_INTR_DISABLED;
+       spin_lock_init(&aq->lock);
+       INIT_LIST_HEAD(&aq->list);
+@@ -771,10 +771,11 @@ void ap_queue_remove(struct ap_queue *aq)
+       spin_unlock_bh(&aq->lock);
+ }
+ 
+-void ap_queue_reinit_state(struct ap_queue *aq)
++void ap_queue_init_state(struct ap_queue *aq)
+ {
+       spin_lock_bh(&aq->lock);
+       aq->state = AP_STATE_RESET_START;
+       ap_wait(ap_sm_event(aq, AP_EVENT_POLL));
+       spin_unlock_bh(&aq->lock);
+ }
++EXPORT_SYMBOL(ap_queue_init_state);
+diff --git a/drivers/s390/crypto/zcrypt_cex2a.c 
b/drivers/s390/crypto/zcrypt_cex2a.c
+index c50f3e86cc74..7cbb384ec535 100644
+--- a/drivers/s390/crypto/zcrypt_cex2a.c
++++ b/drivers/s390/crypto/zcrypt_cex2a.c
+@@ -175,6 +175,7 @@ static int zcrypt_cex2a_queue_probe(struct ap_device 
*ap_dev)
+       zq->queue = aq;
+       zq->online = 1;
+       atomic_set(&zq->load, 0);
++      ap_queue_init_state(aq);
+       ap_queue_init_reply(aq, &zq->reply);
+       aq->request_timeout = CEX2A_CLEANUP_TIME,
+       aq->private = zq;
+diff --git a/drivers/s390/crypto/zcrypt_cex2c.c 
b/drivers/s390/crypto/zcrypt_cex2c.c
+index 35c7c6672713..c78c0d119806 100644
+--- a/drivers/s390/crypto/zcrypt_cex2c.c
++++ b/drivers/s390/crypto/zcrypt_cex2c.c
+@@ -220,6 +220,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device 
*ap_dev)
+       zq->queue = aq;
+       zq->online = 1;
+       atomic_set(&zq->load, 0);
++      ap_rapq(aq->qid);
+       rc = zcrypt_cex2c_rng_supported(aq);
+       if (rc < 0) {
+               zcrypt_queue_free(zq);
+@@ -231,6 +232,7 @@ static int zcrypt_cex2c_queue_probe(struct ap_device 
*ap_dev)
+       else
+               zq->ops = zcrypt_msgtype(MSGTYPE06_NAME,
+                                        MSGTYPE06_VARIANT_NORNG);
++      ap_queue_init_state(aq);
+       ap_queue_init_reply(aq, &zq->reply);
+       aq->request_timeout = CEX2C_CLEANUP_TIME;
+       aq->private = zq;
+diff --git a/drivers/s390/crypto/zcrypt_cex4.c 
b/drivers/s390/crypto/zcrypt_cex4.c
+index 442e3d6162f7..6fabc906114c 100644
+--- a/drivers/s390/crypto/zcrypt_cex4.c
++++ b/drivers/s390/crypto/zcrypt_cex4.c
+@@ -381,6 +381,7 @@ static int zcrypt_cex4_queue_probe(struct ap_device 
*ap_dev)
+       zq->queue = aq;
+       zq->online = 1;
+       atomic_set(&zq->load, 0);
++      ap_queue_init_state(aq);
+       ap_queue_init_reply(aq, &zq->reply);
+       aq->request_timeout = CEX4_CLEANUP_TIME,
+       aq->private = zq;
+diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c
+index 80608b53897b..e3f5c91d5e4f 100644
+--- a/drivers/scsi/fnic/fnic_scsi.c
++++ b/drivers/scsi/fnic/fnic_scsi.c
+@@ -439,6 +439,9 @@ static int fnic_queuecommand_lck(struct scsi_cmnd *sc, 
void (*done)(struct scsi_
+       if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_IO_BLOCKED)))
+               return SCSI_MLQUEUE_HOST_BUSY;
+ 
++      if (unlikely(fnic_chk_state_flags_locked(fnic, FNIC_FLAGS_FWRESET)))
++              return SCSI_MLQUEUE_HOST_BUSY;
++
+       rport = starget_to_rport(scsi_target(sc->device));
+       if (!rport) {
+               FNIC_SCSI_DBG(KERN_DEBUG, fnic->lport->host,
+diff --git a/drivers/soc/ti/wkup_m3_ipc.c b/drivers/soc/ti/wkup_m3_ipc.c
+index 378369d9364a..e9ece45d7a33 100644
+--- a/drivers/soc/ti/wkup_m3_ipc.c
++++ b/drivers/soc/ti/wkup_m3_ipc.c
+@@ -419,6 +419,8 @@ static void wkup_m3_rproc_boot_thread(struct wkup_m3_ipc 
*m3_ipc)
+       ret = rproc_boot(m3_ipc->rproc);
+       if (ret)
+               dev_err(dev, "rproc_boot failed\n");
++      else
++              m3_ipc_state = m3_ipc;
+ 
+       do_exit(0);
+ }
+@@ -505,8 +507,6 @@ static int wkup_m3_ipc_probe(struct platform_device *pdev)
+               goto err_put_rproc;
+       }
+ 
+-      m3_ipc_state = m3_ipc;
+-
+       return 0;
+ 
+ err_put_rproc:
+diff --git a/drivers/tee/optee/Kconfig b/drivers/tee/optee/Kconfig
+index d1ad512e1708..3ca71e3812ed 100644
+--- a/drivers/tee/optee/Kconfig
++++ b/drivers/tee/optee/Kconfig
+@@ -3,6 +3,7 @@
+ config OPTEE
+       tristate "OP-TEE"
+       depends on HAVE_ARM_SMCCC
++      depends on MMU
+       help
+         This implements the OP-TEE Trusted Execution Environment (TEE)
+         driver.
+diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
+index 1b151af25772..abcd93a3ca1d 100644
+--- a/fs/btrfs/super.c
++++ b/fs/btrfs/super.c
+@@ -2102,7 +2102,15 @@ static int btrfs_statfs(struct dentry *dentry, struct 
kstatfs *buf)
+        */
+       thresh = SZ_4M;
+ 
+-      if (!mixed && total_free_meta - thresh < block_rsv->size)
++      /*
++       * We only want to claim there's no available space if we can no longer
++       * allocate chunks for our metadata profile and our global reserve will
++       * not fit in the free metadata space.  If we aren't ->full then we
++       * still can allocate chunks and thus are fine using the currently
++       * calculated f_bavail.
++       */
++      if (!mixed && block_rsv->space_info->full &&
++          total_free_meta - thresh < block_rsv->size)
+               buf->f_bavail = 0;
+ 
+       buf->f_type = BTRFS_SUPER_MAGIC;
+diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
+index e1d8cec6ba2e..e1cac715d19e 100644
+--- a/fs/cifs/smb2pdu.c
++++ b/fs/cifs/smb2pdu.c
+@@ -312,7 +312,7 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon)
+               if (server->tcpStatus != CifsNeedReconnect)
+                       break;
+ 
+-              if (--retries)
++              if (retries && --retries)
+                       continue;
+ 
+               /*
+diff --git a/fs/gfs2/lops.c b/fs/gfs2/lops.c
+index e2437b775456..e7b9d39955d4 100644
+--- a/fs/gfs2/lops.c
++++ b/fs/gfs2/lops.c
+@@ -264,7 +264,7 @@ static struct bio *gfs2_log_alloc_bio(struct gfs2_sbd 
*sdp, u64 blkno,
+       struct super_block *sb = sdp->sd_vfs;
+       struct bio *bio = bio_alloc(GFP_NOIO, BIO_MAX_PAGES);
+ 
+-      bio->bi_iter.bi_sector = blkno * (sb->s_blocksize >> 9);
++      bio->bi_iter.bi_sector = blkno << (sb->s_blocksize_bits - 9);
+       bio_set_dev(bio, sb->s_bdev);
+       bio->bi_end_io = end_io;
+       bio->bi_private = sdp;
+@@ -471,6 +471,20 @@ static void gfs2_jhead_process_page(struct gfs2_jdesc 
*jd, unsigned long index,
+       put_page(page); /* Once more for find_or_create_page */
+ }
+ 
++static struct bio *gfs2_chain_bio(struct bio *prev, unsigned int nr_iovecs)
++{
++      struct bio *new;
++
++      new = bio_alloc(GFP_NOIO, nr_iovecs);
++      bio_copy_dev(new, prev);
++      new->bi_iter.bi_sector = bio_end_sector(prev);
++      new->bi_opf = prev->bi_opf;
++      new->bi_write_hint = prev->bi_write_hint;
++      bio_chain(new, prev);
++      submit_bio(prev);
++      return new;
++}
++
+ /**
+  * gfs2_find_jhead - find the head of a log
+  * @jd: The journal descriptor
+@@ -487,15 +501,15 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct 
gfs2_log_header_host *head,
+       struct gfs2_sbd *sdp = GFS2_SB(jd->jd_inode);
+       struct address_space *mapping = jd->jd_inode->i_mapping;
+       unsigned int block = 0, blocks_submitted = 0, blocks_read = 0;
+-      unsigned int bsize = sdp->sd_sb.sb_bsize;
++      unsigned int bsize = sdp->sd_sb.sb_bsize, off;
+       unsigned int bsize_shift = sdp->sd_sb.sb_bsize_shift;
+       unsigned int shift = PAGE_SHIFT - bsize_shift;
+-      unsigned int readhead_blocks = BIO_MAX_PAGES << shift;
++      unsigned int readahead_blocks = BIO_MAX_PAGES << shift;
+       struct gfs2_journal_extent *je;
+       int sz, ret = 0;
+       struct bio *bio = NULL;
+       struct page *page = NULL;
+-      bool done = false;
++      bool bio_chained = false, done = false;
+       errseq_t since;
+ 
+       memset(head, 0, sizeof(*head));
+@@ -504,9 +518,9 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct 
gfs2_log_header_host *head,
+ 
+       since = filemap_sample_wb_err(mapping);
+       list_for_each_entry(je, &jd->extent_list, list) {
+-              for (; block < je->lblock + je->blocks; block++) {
+-                      u64 dblock;
++              u64 dblock = je->dblock;
+ 
++              for (; block < je->lblock + je->blocks; block++, dblock++) {
+                       if (!page) {
+                               page = find_or_create_page(mapping,
+                                               block >> shift, GFP_NOFS);
+@@ -515,35 +529,41 @@ int gfs2_find_jhead(struct gfs2_jdesc *jd, struct 
gfs2_log_header_host *head,
+                                       done = true;
+                                       goto out;
+                               }
++                              off = 0;
+                       }
+ 
+-                      if (bio) {
+-                              unsigned int off;
+-
+-                              off = (block << bsize_shift) & ~PAGE_MASK;
++                      if (!bio || (bio_chained && !off)) {
++                              /* start new bio */
++                      } else {
+                               sz = bio_add_page(bio, page, bsize, off);
+-                              if (sz == bsize) { /* block added */
+-                                      if (off + bsize == PAGE_SIZE) {
+-                                              page = NULL;
+-                                              goto page_added;
+-                                      }
+-                                      continue;
++                              if (sz == bsize)
++                                      goto block_added;
++                              if (off) {
++                                      unsigned int blocks =
++                                              (PAGE_SIZE - off) >> 
bsize_shift;
++
++                                      bio = gfs2_chain_bio(bio, blocks);
++                                      bio_chained = true;
++                                      goto add_block_to_new_bio;
+                               }
++                      }
++
++                      if (bio) {
+                               blocks_submitted = block + 1;
+                               submit_bio(bio);
+-                              bio = NULL;
+                       }
+ 
+-                      dblock = je->dblock + (block - je->lblock);
+                       bio = gfs2_log_alloc_bio(sdp, dblock, 
gfs2_end_log_read);
+                       bio->bi_opf = REQ_OP_READ;
+-                      sz = bio_add_page(bio, page, bsize, 0);
+-                      gfs2_assert_warn(sdp, sz == bsize);
+-                      if (bsize == PAGE_SIZE)
++                      bio_chained = false;
++add_block_to_new_bio:
++                      sz = bio_add_page(bio, page, bsize, off);
++                      BUG_ON(sz != bsize);
++block_added:
++                      off += bsize;
++                      if (off == PAGE_SIZE)
+                               page = NULL;
+-
+-page_added:
+-                      if (blocks_submitted < blocks_read + readhead_blocks) {
++                      if (blocks_submitted < blocks_read + readahead_blocks) {
+                               /* Keep at least one bio in flight */
+                               continue;
+                       }
+diff --git a/fs/namei.c b/fs/namei.c
+index e81521c87f98..bd1c0ca4151c 100644
+--- a/fs/namei.c
++++ b/fs/namei.c
+@@ -3249,8 +3249,8 @@ static int do_last(struct nameidata *nd,
+                  struct file *file, const struct open_flags *op)
+ {
+       struct dentry *dir = nd->path.dentry;
+-      kuid_t dir_uid = dir->d_inode->i_uid;
+-      umode_t dir_mode = dir->d_inode->i_mode;
++      kuid_t dir_uid = nd->inode->i_uid;
++      umode_t dir_mode = nd->inode->i_mode;
+       int open_flag = op->open_flag;
+       bool will_truncate = (open_flag & O_TRUNC) != 0;
+       bool got_write = false;
+diff --git a/fs/reiserfs/super.c b/fs/reiserfs/super.c
+index 3244037b1286..d127af64283e 100644
+--- a/fs/reiserfs/super.c
++++ b/fs/reiserfs/super.c
+@@ -629,6 +629,7 @@ static void reiserfs_put_super(struct super_block *s)
+       reiserfs_write_unlock(s);
+       mutex_destroy(&REISERFS_SB(s)->lock);
+       destroy_workqueue(REISERFS_SB(s)->commit_wq);
++      kfree(REISERFS_SB(s)->s_jdev);
+       kfree(s->s_fs_info);
+       s->s_fs_info = NULL;
+ }
+@@ -2240,6 +2241,7 @@ error_unlocked:
+                       kfree(qf_names[j]);
+       }
+ #endif
++      kfree(sbi->s_jdev);
+       kfree(sbi);
+ 
+       s->s_fs_info = NULL;
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index 775503573ed7..b968d736833b 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -1915,11 +1915,11 @@ static inline void rseq_migrate(struct task_struct *t)
+ 
+ /*
+  * If parent process has a registered restartable sequences area, the
+- * child inherits. Only applies when forking a process, not a thread.
++ * child inherits. Unregister rseq for a clone with CLONE_VM set.
+  */
+ static inline void rseq_fork(struct task_struct *t, unsigned long clone_flags)
+ {
+-      if (clone_flags & CLONE_THREAD) {
++      if (clone_flags & CLONE_VM) {
+               t->rseq = NULL;
+               t->rseq_sig = 0;
+               t->rseq_event_mask = 0;
+diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
+index 4ab2c49423dc..68782ba8b6e8 100644
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -3537,6 +3537,9 @@ struct cfg80211_update_owe_info {
+  *
+  * @start_radar_detection: Start radar detection in the driver.
+  *
++ * @end_cac: End running CAC, probably because a related CAC
++ *    was finished on another phy.
++ *
+  * @update_ft_ies: Provide updated Fast BSS Transition information to the
+  *    driver. If the SME is in the driver/firmware, this information can be
+  *    used in building Authentication and Reassociation Request frames.
+@@ -3863,6 +3866,8 @@ struct cfg80211_ops {
+                                        struct net_device *dev,
+                                        struct cfg80211_chan_def *chandef,
+                                        u32 cac_time_ms);
++      void    (*end_cac)(struct wiphy *wiphy,
++                              struct net_device *dev);
+       int     (*update_ft_ies)(struct wiphy *wiphy, struct net_device *dev,
+                                struct cfg80211_update_ft_ies_params *ftie);
+       int     (*crit_proto_start)(struct wiphy *wiphy,
+diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
+index ef4242e5d4bc..595c52d59f31 100644
+--- a/kernel/cgroup/cgroup.c
++++ b/kernel/cgroup/cgroup.c
+@@ -3111,8 +3111,6 @@ static int cgroup_apply_control_enable(struct cgroup 
*cgrp)
+               for_each_subsys(ss, ssid) {
+                       struct cgroup_subsys_state *css = cgroup_css(dsct, ss);
+ 
+-                      WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt));
+-
+                       if (!(cgroup_ss_mask(dsct) & (1 << ss->id)))
+                               continue;
+ 
+@@ -3122,6 +3120,8 @@ static int cgroup_apply_control_enable(struct cgroup 
*cgrp)
+                                       return PTR_ERR(css);
+                       }
+ 
++                      WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt));
++
+                       if (css_visible(css)) {
+                               ret = css_populate_dir(css);
+                               if (ret)
+@@ -3157,11 +3157,11 @@ static void cgroup_apply_control_disable(struct cgroup 
*cgrp)
+               for_each_subsys(ss, ssid) {
+                       struct cgroup_subsys_state *css = cgroup_css(dsct, ss);
+ 
+-                      WARN_ON_ONCE(css && percpu_ref_is_dying(&css->refcnt));
+-
+                       if (!css)
+                               continue;
+ 
++                      WARN_ON_ONCE(percpu_ref_is_dying(&css->refcnt));
++
+                       if (css->parent &&
+                           !(cgroup_ss_mask(dsct) & (1 << ss->id))) {
+                               kill_css(css);
+@@ -3448,7 +3448,8 @@ static ssize_t cgroup_type_write(struct kernfs_open_file 
*of, char *buf,
+       if (strcmp(strstrip(buf), "threaded"))
+               return -EINVAL;
+ 
+-      cgrp = cgroup_kn_lock_live(of->kn, false);
++      /* drain dying csses before we re-apply (threaded) subtree control */
++      cgrp = cgroup_kn_lock_live(of->kn, true);
+       if (!cgrp)
+               return -ENOENT;
+ 
+diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c
+index 3e5f9c7d939c..3f54dc2f6e1c 100644
+--- a/kernel/trace/trace_kprobe.c
++++ b/kernel/trace/trace_kprobe.c
+@@ -290,7 +290,7 @@ static struct trace_kprobe *alloc_trace_kprobe(const char 
*group,
+       INIT_HLIST_NODE(&tk->rp.kp.hlist);
+       INIT_LIST_HEAD(&tk->rp.kp.list);
+ 
+-      ret = trace_probe_init(&tk->tp, event, group, 0);
++      ret = trace_probe_init(&tk->tp, event, group, false);
+       if (ret < 0)
+               goto error;
+ 
+diff --git a/kernel/trace/trace_probe.c b/kernel/trace/trace_probe.c
+index bba18cf44a30..9ae87be422f2 100644
+--- a/kernel/trace/trace_probe.c
++++ b/kernel/trace/trace_probe.c
+@@ -984,16 +984,19 @@ void trace_probe_cleanup(struct trace_probe *tp)
+ }
+ 
+ int trace_probe_init(struct trace_probe *tp, const char *event,
+-                   const char *group, size_t event_data_size)
++                   const char *group, bool alloc_filter)
+ {
+       struct trace_event_call *call;
++      size_t size = sizeof(struct trace_probe_event);
+       int ret = 0;
+ 
+       if (!event || !group)
+               return -EINVAL;
+ 
+-      tp->event = kzalloc(sizeof(struct trace_probe_event) + event_data_size,
+-                          GFP_KERNEL);
++      if (alloc_filter)
++              size += sizeof(struct trace_uprobe_filter);
++
++      tp->event = kzalloc(size, GFP_KERNEL);
+       if (!tp->event)
+               return -ENOMEM;
+ 
+diff --git a/kernel/trace/trace_probe.h b/kernel/trace/trace_probe.h
+index 03e4e180058d..a0ff9e200ef6 100644
+--- a/kernel/trace/trace_probe.h
++++ b/kernel/trace/trace_probe.h
+@@ -223,6 +223,12 @@ struct probe_arg {
+       const struct fetch_type *type;  /* Type of this argument */
+ };
+ 
++struct trace_uprobe_filter {
++      rwlock_t                rwlock;
++      int                     nr_systemwide;
++      struct list_head        perf_events;
++};
++
+ /* Event call and class holder */
+ struct trace_probe_event {
+       unsigned int                    flags;  /* For TP_FLAG_* */
+@@ -230,7 +236,7 @@ struct trace_probe_event {
+       struct trace_event_call         call;
+       struct list_head                files;
+       struct list_head                probes;
+-      char                            data[0];
++      struct trace_uprobe_filter      filter[0];
+ };
+ 
+ struct trace_probe {
+@@ -323,7 +329,7 @@ static inline bool trace_probe_has_single_file(struct 
trace_probe *tp)
+ }
+ 
+ int trace_probe_init(struct trace_probe *tp, const char *event,
+-                   const char *group, size_t event_data_size);
++                   const char *group, bool alloc_filter);
+ void trace_probe_cleanup(struct trace_probe *tp);
+ int trace_probe_append(struct trace_probe *tp, struct trace_probe *to);
+ void trace_probe_unlink(struct trace_probe *tp);
+diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c
+index f66e202fec13..2619bc5ed520 100644
+--- a/kernel/trace/trace_uprobe.c
++++ b/kernel/trace/trace_uprobe.c
+@@ -34,12 +34,6 @@ struct uprobe_trace_entry_head {
+ #define DATAOF_TRACE_ENTRY(entry, is_return)          \
+       ((void*)(entry) + SIZEOF_TRACE_ENTRY(is_return))
+ 
+-struct trace_uprobe_filter {
+-      rwlock_t                rwlock;
+-      int                     nr_systemwide;
+-      struct list_head        perf_events;
+-};
+-
+ static int trace_uprobe_create(int argc, const char **argv);
+ static int trace_uprobe_show(struct seq_file *m, struct dyn_event *ev);
+ static int trace_uprobe_release(struct dyn_event *ev);
+@@ -263,14 +257,6 @@ process_fetch_insn(struct fetch_insn *code, struct 
pt_regs *regs, void *dest,
+ }
+ NOKPROBE_SYMBOL(process_fetch_insn)
+ 
+-static struct trace_uprobe_filter *
+-trace_uprobe_get_filter(struct trace_uprobe *tu)
+-{
+-      struct trace_probe_event *event = tu->tp.event;
+-
+-      return (struct trace_uprobe_filter *)&event->data[0];
+-}
+-
+ static inline void init_trace_uprobe_filter(struct trace_uprobe_filter 
*filter)
+ {
+       rwlock_init(&filter->rwlock);
+@@ -358,8 +344,7 @@ alloc_trace_uprobe(const char *group, const char *event, 
int nargs, bool is_ret)
+       if (!tu)
+               return ERR_PTR(-ENOMEM);
+ 
+-      ret = trace_probe_init(&tu->tp, event, group,
+-                              sizeof(struct trace_uprobe_filter));
++      ret = trace_probe_init(&tu->tp, event, group, true);
+       if (ret < 0)
+               goto error;
+ 
+@@ -367,7 +352,7 @@ alloc_trace_uprobe(const char *group, const char *event, 
int nargs, bool is_ret)
+       tu->consumer.handler = uprobe_dispatcher;
+       if (is_ret)
+               tu->consumer.ret_handler = uretprobe_dispatcher;
+-      init_trace_uprobe_filter(trace_uprobe_get_filter(tu));
++      init_trace_uprobe_filter(tu->tp.event->filter);
+       return tu;
+ 
+ error:
+@@ -1076,7 +1061,7 @@ static void __probe_event_disable(struct trace_probe *tp)
+       struct trace_uprobe *tu;
+ 
+       tu = container_of(tp, struct trace_uprobe, tp);
+-      WARN_ON(!uprobe_filter_is_empty(trace_uprobe_get_filter(tu)));
++      WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter));
+ 
+       list_for_each_entry(pos, trace_probe_probe_list(tp), list) {
+               tu = container_of(pos, struct trace_uprobe, tp);
+@@ -1117,7 +1102,7 @@ static int probe_event_enable(struct trace_event_call 
*call,
+       }
+ 
+       tu = container_of(tp, struct trace_uprobe, tp);
+-      WARN_ON(!uprobe_filter_is_empty(trace_uprobe_get_filter(tu)));
++      WARN_ON(!uprobe_filter_is_empty(tu->tp.event->filter));
+ 
+       if (enabled)
+               return 0;
+@@ -1281,7 +1266,7 @@ static int uprobe_perf_close(struct trace_event_call 
*call,
+               return -ENODEV;
+ 
+       tu = container_of(tp, struct trace_uprobe, tp);
+-      if (trace_uprobe_filter_remove(trace_uprobe_get_filter(tu), event))
++      if (trace_uprobe_filter_remove(tu->tp.event->filter, event))
+               return 0;
+ 
+       list_for_each_entry(pos, trace_probe_probe_list(tp), list) {
+@@ -1306,7 +1291,7 @@ static int uprobe_perf_open(struct trace_event_call 
*call,
+               return -ENODEV;
+ 
+       tu = container_of(tp, struct trace_uprobe, tp);
+-      if (trace_uprobe_filter_add(trace_uprobe_get_filter(tu), event))
++      if (trace_uprobe_filter_add(tu->tp.event->filter, event))
+               return 0;
+ 
+       list_for_each_entry(pos, trace_probe_probe_list(tp), list) {
+@@ -1328,7 +1313,7 @@ static bool uprobe_perf_filter(struct uprobe_consumer 
*uc,
+       int ret;
+ 
+       tu = container_of(uc, struct trace_uprobe, consumer);
+-      filter = trace_uprobe_get_filter(tu);
++      filter = tu->tp.event->filter;
+ 
+       read_lock(&filter->rwlock);
+       ret = __uprobe_perf_filter(filter, mm);
+diff --git a/lib/test_xarray.c b/lib/test_xarray.c
+index 03c3f42966ce..55c14e8c8859 100644
+--- a/lib/test_xarray.c
++++ b/lib/test_xarray.c
+@@ -1160,6 +1160,27 @@ static noinline void check_move_tiny(struct xarray *xa)
+       XA_BUG_ON(xa, !xa_empty(xa));
+ }
+ 
++static noinline void check_move_max(struct xarray *xa)
++{
++      XA_STATE(xas, xa, 0);
++
++      xa_store_index(xa, ULONG_MAX, GFP_KERNEL);
++      rcu_read_lock();
++      XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX));
++      XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL);
++      rcu_read_unlock();
++
++      xas_set(&xas, 0);
++      rcu_read_lock();
++      XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != xa_mk_index(ULONG_MAX));
++      xas_pause(&xas);
++      XA_BUG_ON(xa, xas_find(&xas, ULONG_MAX) != NULL);
++      rcu_read_unlock();
++
++      xa_erase_index(xa, ULONG_MAX);
++      XA_BUG_ON(xa, !xa_empty(xa));
++}
++
+ static noinline void check_move_small(struct xarray *xa, unsigned long idx)
+ {
+       XA_STATE(xas, xa, 0);
+@@ -1268,6 +1289,7 @@ static noinline void check_move(struct xarray *xa)
+       xa_destroy(xa);
+ 
+       check_move_tiny(xa);
++      check_move_max(xa);
+ 
+       for (i = 0; i < 16; i++)
+               check_move_small(xa, 1UL << i);
+diff --git a/lib/xarray.c b/lib/xarray.c
+index 47e17d46e5f8..1d9fab7db8da 100644
+--- a/lib/xarray.c
++++ b/lib/xarray.c
+@@ -968,6 +968,7 @@ void xas_pause(struct xa_state *xas)
+       if (xas_invalid(xas))
+               return;
+ 
++      xas->xa_node = XAS_RESTART;
+       if (node) {
+               unsigned int offset = xas->xa_offset;
+               while (++offset < XA_CHUNK_SIZE) {
+@@ -975,10 +976,11 @@ void xas_pause(struct xa_state *xas)
+                               break;
+               }
+               xas->xa_index += (offset - xas->xa_offset) << node->shift;
++              if (xas->xa_index == 0)
++                      xas->xa_node = XAS_BOUNDS;
+       } else {
+               xas->xa_index++;
+       }
+-      xas->xa_node = XAS_RESTART;
+ }
+ EXPORT_SYMBOL_GPL(xas_pause);
+ 
+@@ -1080,7 +1082,7 @@ void *xas_find(struct xa_state *xas, unsigned long max)
+ {
+       void *entry;
+ 
+-      if (xas_error(xas))
++      if (xas_error(xas) || xas->xa_node == XAS_BOUNDS)
+               return NULL;
+       if (xas->xa_index > max)
+               return set_bounds(xas);
+@@ -1088,7 +1090,7 @@ void *xas_find(struct xa_state *xas, unsigned long max)
+       if (!xas->xa_node) {
+               xas->xa_index = 1;
+               return set_bounds(xas);
+-      } else if (xas_top(xas->xa_node)) {
++      } else if (xas->xa_node == XAS_RESTART) {
+               entry = xas_load(xas);
+               if (entry || xas_not_node(xas->xa_node))
+                       return entry;
+diff --git a/mm/mempolicy.c b/mm/mempolicy.c
+index e08c94170ae4..fbb3258af275 100644
+--- a/mm/mempolicy.c
++++ b/mm/mempolicy.c
+@@ -2802,6 +2802,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol)
+       char *flags = strchr(str, '=');
+       int err = 1, mode;
+ 
++      if (flags)
++              *flags++ = '\0';        /* terminate mode string */
++
+       if (nodelist) {
+               /* NUL-terminate mode or flags string */
+               *nodelist++ = '\0';
+@@ -2812,9 +2815,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol)
+       } else
+               nodes_clear(nodes);
+ 
+-      if (flags)
+-              *flags++ = '\0';        /* terminate mode string */
+-
+       mode = match_string(policy_modes, MPOL_MAX, str);
+       if (mode < 0)
+               goto out;
+diff --git a/mm/migrate.c b/mm/migrate.c
+index 45d3303e0022..6956627ebf8b 100644
+--- a/mm/migrate.c
++++ b/mm/migrate.c
+@@ -1680,7 +1680,7 @@ out_flush:
+       err1 = do_move_pages_to_node(mm, &pagelist, current_node);
+       if (!err1)
+               err1 = store_status(status, start, current_node, i - start);
+-      if (!err)
++      if (err >= 0)
+               err = err1;
+ out:
+       return err;
+diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
+index d32077b28433..8159b344deef 100644
+--- a/net/bluetooth/hci_sock.c
++++ b/net/bluetooth/hci_sock.c
+@@ -831,6 +831,8 @@ static int hci_sock_release(struct socket *sock)
+       if (!sk)
+               return 0;
+ 
++      lock_sock(sk);
++
+       switch (hci_pi(sk)->channel) {
+       case HCI_CHANNEL_MONITOR:
+               atomic_dec(&monitor_promisc);
+@@ -878,6 +880,7 @@ static int hci_sock_release(struct socket *sock)
+       skb_queue_purge(&sk->sk_receive_queue);
+       skb_queue_purge(&sk->sk_write_queue);
+ 
++      release_sock(sk);
+       sock_put(sk);
+       return 0;
+ }
+diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c
+index 1292f3f0f93f..96b2566c298d 100644
+--- a/net/core/flow_dissector.c
++++ b/net/core/flow_dissector.c
+@@ -758,10 +758,10 @@ static void __skb_flow_bpf_to_target(const struct 
bpf_flow_keys *flow_keys,
+                                    struct flow_dissector *flow_dissector,
+                                    void *target_container)
+ {
++      struct flow_dissector_key_ports *key_ports = NULL;
+       struct flow_dissector_key_control *key_control;
+       struct flow_dissector_key_basic *key_basic;
+       struct flow_dissector_key_addrs *key_addrs;
+-      struct flow_dissector_key_ports *key_ports;
+       struct flow_dissector_key_tags *key_tags;
+ 
+       key_control = skb_flow_dissector_target(flow_dissector,
+@@ -800,10 +800,17 @@ static void __skb_flow_bpf_to_target(const struct 
bpf_flow_keys *flow_keys,
+               key_control->addr_type = FLOW_DISSECTOR_KEY_IPV6_ADDRS;
+       }
+ 
+-      if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS)) {
++      if (dissector_uses_key(flow_dissector, FLOW_DISSECTOR_KEY_PORTS))
+               key_ports = skb_flow_dissector_target(flow_dissector,
+                                                     FLOW_DISSECTOR_KEY_PORTS,
+                                                     target_container);
++      else if (dissector_uses_key(flow_dissector,
++                                  FLOW_DISSECTOR_KEY_PORTS_RANGE))
++              key_ports = skb_flow_dissector_target(flow_dissector,
++                                                    
FLOW_DISSECTOR_KEY_PORTS_RANGE,
++                                                    target_container);
++
++      if (key_ports) {
+               key_ports->src = flow_keys->sport;
+               key_ports->dst = flow_keys->dport;
+       }
+diff --git a/net/core/utils.c b/net/core/utils.c
+index 6b6e51db9f3b..1f31a39236d5 100644
+--- a/net/core/utils.c
++++ b/net/core/utils.c
+@@ -438,6 +438,23 @@ void inet_proto_csum_replace4(__sum16 *sum, struct 
sk_buff *skb,
+ }
+ EXPORT_SYMBOL(inet_proto_csum_replace4);
+ 
++/**
++ * inet_proto_csum_replace16 - update layer 4 header checksum field
++ * @sum: Layer 4 header checksum field
++ * @skb: sk_buff for the packet
++ * @from: old IPv6 address
++ * @to: new IPv6 address
++ * @pseudohdr: True if layer 4 header checksum includes pseudoheader
++ *
++ * Update layer 4 header as per the update in IPv6 src/dst address.
++ *
++ * There is no need to update skb->csum in this function, because update in 
two
++ * fields a.) IPv6 src/dst address and b.) L4 header checksum cancels each 
other
++ * for skb->csum calculation. Whereas inet_proto_csum_replace4 function needs 
to
++ * update skb->csum, because update in 3 fields a.) IPv4 src/dst address,
++ * b.) IPv4 Header checksum and c.) L4 header checksum results in same diff as
++ * L4 Header checksum for skb->csum calculation.
++ */
+ void inet_proto_csum_replace16(__sum16 *sum, struct sk_buff *skb,
+                              const __be32 *from, const __be32 *to,
+                              bool pseudohdr)
+@@ -449,9 +466,6 @@ void inet_proto_csum_replace16(__sum16 *sum, struct 
sk_buff *skb,
+       if (skb->ip_summed != CHECKSUM_PARTIAL) {
+               *sum = csum_fold(csum_partial(diff, sizeof(diff),
+                                ~csum_unfold(*sum)));
+-              if (skb->ip_summed == CHECKSUM_COMPLETE && pseudohdr)
+-                      skb->csum = ~csum_partial(diff, sizeof(diff),
+-                                                ~skb->csum);
+       } else if (pseudohdr)
+               *sum = ~csum_fold(csum_partial(diff, sizeof(diff),
+                                 csum_unfold(*sum)));
+diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c
+index fb9f6d60c27c..79eef5db336a 100644
+--- a/net/ipv4/ip_vti.c
++++ b/net/ipv4/ip_vti.c
+@@ -187,8 +187,17 @@ static netdev_tx_t vti_xmit(struct sk_buff *skb, struct 
net_device *dev,
+       int mtu;
+ 
+       if (!dst) {
+-              dev->stats.tx_carrier_errors++;
+-              goto tx_error_icmp;
++              struct rtable *rt;
++
++              fl->u.ip4.flowi4_oif = dev->ifindex;
++              fl->u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC;
++              rt = __ip_route_output_key(dev_net(dev), &fl->u.ip4);
++              if (IS_ERR(rt)) {
++                      dev->stats.tx_carrier_errors++;
++                      goto tx_error_icmp;
++              }
++              dst = &rt->dst;
++              skb_dst_set(skb, dst);
+       }
+ 
+       dst_hold(dst);
+diff --git a/net/ipv6/ip6_vti.c b/net/ipv6/ip6_vti.c
+index 6f08b760c2a7..524006aa0d78 100644
+--- a/net/ipv6/ip6_vti.c
++++ b/net/ipv6/ip6_vti.c
+@@ -449,8 +449,17 @@ vti6_xmit(struct sk_buff *skb, struct net_device *dev, 
struct flowi *fl)
+       int err = -1;
+       int mtu;
+ 
+-      if (!dst)
+-              goto tx_err_link_failure;
++      if (!dst) {
++              fl->u.ip6.flowi6_oif = dev->ifindex;
++              fl->u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC;
++              dst = ip6_route_output(dev_net(dev), NULL, &fl->u.ip6);
++              if (dst->error) {
++                      dst_release(dst);
++                      dst = NULL;
++                      goto tx_err_link_failure;
++              }
++              skb_dst_set(skb, dst);
++      }
+ 
+       dst_hold(dst);
+       dst = xfrm_lookup(t->net, dst, fl, NULL, 0);
+diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
+index 70739e746c13..0daaf7e37a21 100644
+--- a/net/mac80211/cfg.c
++++ b/net/mac80211/cfg.c
+@@ -2954,6 +2954,28 @@ static int ieee80211_start_radar_detection(struct wiphy 
*wiphy,
+       return err;
+ }
+ 
++static void ieee80211_end_cac(struct wiphy *wiphy,
++                            struct net_device *dev)
++{
++      struct ieee80211_sub_if_data *sdata = IEEE80211_DEV_TO_SUB_IF(dev);
++      struct ieee80211_local *local = sdata->local;
++
++      mutex_lock(&local->mtx);
++      list_for_each_entry(sdata, &local->interfaces, list) {
++              /* it might be waiting for the local->mtx, but then
++               * by the time it gets it, sdata->wdev.cac_started
++               * will no longer be true
++               */
++              cancel_delayed_work(&sdata->dfs_cac_timer_work);
++
++              if (sdata->wdev.cac_started) {
++                      ieee80211_vif_release_channel(sdata);
++                      sdata->wdev.cac_started = false;
++              }
++      }
++      mutex_unlock(&local->mtx);
++}
++
+ static struct cfg80211_beacon_data *
+ cfg80211_beacon_dup(struct cfg80211_beacon_data *beacon)
+ {
+@@ -4023,6 +4045,7 @@ const struct cfg80211_ops mac80211_config_ops = {
+ #endif
+       .get_channel = ieee80211_cfg_get_channel,
+       .start_radar_detection = ieee80211_start_radar_detection,
++      .end_cac = ieee80211_end_cac,
+       .channel_switch = ieee80211_channel_switch,
+       .set_qos_map = ieee80211_set_qos_map,
+       .set_ap_chanwidth = ieee80211_set_ap_chanwidth,
+diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
+index 68af62306385..d69983370381 100644
+--- a/net/mac80211/mesh_hwmp.c
++++ b/net/mac80211/mesh_hwmp.c
+@@ -328,6 +328,9 @@ u32 airtime_link_metric_get(struct ieee80211_local *local,
+       unsigned long fail_avg =
+               ewma_mesh_fail_avg_read(&sta->mesh->fail_avg);
+ 
++      if (sta->mesh->plink_state != NL80211_PLINK_ESTAB)
++              return MAX_METRIC;
++
+       /* Try to get rate based on HW/SW RC algorithm.
+        * Rate is returned in units of Kbps, correct this
+        * to comply with airtime calculation units
+diff --git a/net/mac80211/tkip.c b/net/mac80211/tkip.c
+index 727dc9f3f3b3..e7f57bb18f6e 100644
+--- a/net/mac80211/tkip.c
++++ b/net/mac80211/tkip.c
+@@ -263,9 +263,21 @@ int ieee80211_tkip_decrypt_data(struct arc4_ctx *ctx,
+       if ((keyid >> 6) != key->conf.keyidx)
+               return TKIP_DECRYPT_INVALID_KEYIDX;
+ 
+-      if (rx_ctx->ctx.state != TKIP_STATE_NOT_INIT &&
+-          (iv32 < rx_ctx->iv32 ||
+-           (iv32 == rx_ctx->iv32 && iv16 <= rx_ctx->iv16)))
++      /* Reject replays if the received TSC is smaller than or equal to the
++       * last received value in a valid message, but with an exception for
++       * the case where a new key has been set and no valid frame using that
++       * key has yet received and the local RSC was initialized to 0. This
++       * exception allows the very first frame sent by the transmitter to be
++       * accepted even if that transmitter were to use TSC 0 (IEEE 802.11
++       * described TSC to be initialized to 1 whenever a new key is taken into
++       * use).
++       */
++      if (iv32 < rx_ctx->iv32 ||
++          (iv32 == rx_ctx->iv32 &&
++           (iv16 < rx_ctx->iv16 ||
++            (iv16 == rx_ctx->iv16 &&
++             (rx_ctx->iv32 || rx_ctx->iv16 ||
++              rx_ctx->ctx.state != TKIP_STATE_NOT_INIT)))))
+               return TKIP_DECRYPT_REPLAY;
+ 
+       if (only_iv) {
+diff --git a/net/netfilter/nf_conntrack_proto_sctp.c 
b/net/netfilter/nf_conntrack_proto_sctp.c
+index 0399ae8f1188..4f897b14b606 100644
+--- a/net/netfilter/nf_conntrack_proto_sctp.c
++++ b/net/netfilter/nf_conntrack_proto_sctp.c
+@@ -114,7 +114,7 @@ static const u8 sctp_conntracks[2][11][SCTP_CONNTRACK_MAX] 
= {
+       {
+ /*    ORIGINAL        */
+ /*                  sNO, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS, sHA */
+-/* init         */ {sCW, sCW, sCW, sCE, sES, sSS, sSR, sSA, sCW, sHA},
++/* init         */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCW, sHA},
+ /* init_ack     */ {sCL, sCL, sCW, sCE, sES, sSS, sSR, sSA, sCL, sHA},
+ /* abort        */ {sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sCL},
+ /* shutdown     */ {sCL, sCL, sCW, sCE, sSS, sSS, sSR, sSA, sCL, sSS},
+@@ -130,7 +130,7 @@ static const u8 sctp_conntracks[2][11][SCTP_CONNTRACK_MAX] 
= {
+ /*    REPLY   */
+ /*                  sNO, sCL, sCW, sCE, sES, sSS, sSR, sSA, sHS, sHA */
+ /* init         */ {sIV, sCL, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA},/* INIT 
in sCL Big TODO */
+-/* init_ack     */ {sIV, sCL, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA},
++/* init_ack     */ {sIV, sCW, sCW, sCE, sES, sSS, sSR, sSA, sIV, sHA},
+ /* abort        */ {sIV, sCL, sCL, sCL, sCL, sCL, sCL, sCL, sIV, sCL},
+ /* shutdown     */ {sIV, sCL, sCW, sCE, sSR, sSS, sSR, sSA, sIV, sSR},
+ /* shutdown_ack */ {sIV, sCL, sCW, sCE, sES, sSA, sSA, sSA, sIV, sHA},
+@@ -316,7 +316,7 @@ sctp_new(struct nf_conn *ct, const struct sk_buff *skb,
+                       ct->proto.sctp.vtag[IP_CT_DIR_REPLY] = sh->vtag;
+               }
+ 
+-              ct->proto.sctp.state = new_state;
++              ct->proto.sctp.state = SCTP_CONNTRACK_NONE;
+       }
+ 
+       return true;
+diff --git a/net/netfilter/nf_tables_offload.c 
b/net/netfilter/nf_tables_offload.c
+index 96a64e7594a5..914cd0618d5a 100644
+--- a/net/netfilter/nf_tables_offload.c
++++ b/net/netfilter/nf_tables_offload.c
+@@ -437,7 +437,7 @@ static void nft_indr_block_cb(struct net_device *dev,
+ 
+       mutex_lock(&net->nft.commit_mutex);
+       chain = __nft_offload_get_chain(dev);
+-      if (chain) {
++      if (chain && chain->flags & NFT_CHAIN_HW_OFFLOAD) {
+               struct nft_base_chain *basechain;
+ 
+               basechain = nft_base_chain(chain);
+diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h
+index 3dd9515c836b..e0d34f796d0b 100644
+--- a/net/wireless/rdev-ops.h
++++ b/net/wireless/rdev-ops.h
+@@ -1171,6 +1171,16 @@ rdev_start_radar_detection(struct 
cfg80211_registered_device *rdev,
+       return ret;
+ }
+ 
++static inline void
++rdev_end_cac(struct cfg80211_registered_device *rdev,
++           struct net_device *dev)
++{
++      trace_rdev_end_cac(&rdev->wiphy, dev);
++      if (rdev->ops->end_cac)
++              rdev->ops->end_cac(&rdev->wiphy, dev);
++      trace_rdev_return_void(&rdev->wiphy);
++}
++
+ static inline int
+ rdev_set_mcast_rate(struct cfg80211_registered_device *rdev,
+                   struct net_device *dev,
+diff --git a/net/wireless/reg.c b/net/wireless/reg.c
+index 446c76d44e65..fff9a74891fc 100644
+--- a/net/wireless/reg.c
++++ b/net/wireless/reg.c
+@@ -2261,14 +2261,15 @@ static void update_all_wiphy_regulatory(enum 
nl80211_reg_initiator initiator)
+ 
+ static void handle_channel_custom(struct wiphy *wiphy,
+                                 struct ieee80211_channel *chan,
+-                                const struct ieee80211_regdomain *regd)
++                                const struct ieee80211_regdomain *regd,
++                                u32 min_bw)
+ {
+       u32 bw_flags = 0;
+       const struct ieee80211_reg_rule *reg_rule = NULL;
+       const struct ieee80211_power_rule *power_rule = NULL;
+       u32 bw;
+ 
+-      for (bw = MHZ_TO_KHZ(20); bw >= MHZ_TO_KHZ(5); bw = bw / 2) {
++      for (bw = MHZ_TO_KHZ(20); bw >= min_bw; bw = bw / 2) {
+               reg_rule = freq_reg_info_regd(MHZ_TO_KHZ(chan->center_freq),
+                                             regd, bw);
+               if (!IS_ERR(reg_rule))
+@@ -2324,8 +2325,14 @@ static void handle_band_custom(struct wiphy *wiphy,
+       if (!sband)
+               return;
+ 
++      /*
++       * We currently assume that you always want at least 20 MHz,
++       * otherwise channel 12 might get enabled if this rule is
++       * compatible to US, which permits 2402 - 2472 MHz.
++       */
+       for (i = 0; i < sband->n_channels; i++)
+-              handle_channel_custom(wiphy, &sband->channels[i], regd);
++              handle_channel_custom(wiphy, &sband->channels[i], regd,
++                                    MHZ_TO_KHZ(20));
+ }
+ 
+ /* Used by drivers prior to wiphy registration */
+@@ -3885,6 +3892,25 @@ bool regulatory_pre_cac_allowed(struct wiphy *wiphy)
+ }
+ EXPORT_SYMBOL(regulatory_pre_cac_allowed);
+ 
++static void cfg80211_check_and_end_cac(struct cfg80211_registered_device 
*rdev)
++{
++      struct wireless_dev *wdev;
++      /* If we finished CAC or received radar, we should end any
++       * CAC running on the same channels.
++       * the check !cfg80211_chandef_dfs_usable contain 2 options:
++       * either all channels are available - those the CAC_FINISHED
++       * event has effected another wdev state, or there is a channel
++       * in unavailable state in wdev chandef - those the RADAR_DETECTED
++       * event has effected another wdev state.
++       * In both cases we should end the CAC on the wdev.
++       */
++      list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
++              if (wdev->cac_started &&
++                  !cfg80211_chandef_dfs_usable(&rdev->wiphy, &wdev->chandef))
++                      rdev_end_cac(rdev, wdev->netdev);
++      }
++}
++
+ void regulatory_propagate_dfs_state(struct wiphy *wiphy,
+                                   struct cfg80211_chan_def *chandef,
+                                   enum nl80211_dfs_state dfs_state,
+@@ -3911,8 +3937,10 @@ void regulatory_propagate_dfs_state(struct wiphy *wiphy,
+               cfg80211_set_dfs_state(&rdev->wiphy, chandef, dfs_state);
+ 
+               if (event == NL80211_RADAR_DETECTED ||
+-                  event == NL80211_RADAR_CAC_FINISHED)
++                  event == NL80211_RADAR_CAC_FINISHED) {
+                       cfg80211_sched_dfs_chan_update(rdev);
++                      cfg80211_check_and_end_cac(rdev);
++              }
+ 
+               nl80211_radar_notify(rdev, chandef, event, NULL, GFP_KERNEL);
+       }
+diff --git a/net/wireless/trace.h b/net/wireless/trace.h
+index d98ad2b3143b..8677d7ab7d69 100644
+--- a/net/wireless/trace.h
++++ b/net/wireless/trace.h
+@@ -646,6 +646,11 @@ DEFINE_EVENT(wiphy_netdev_evt, rdev_flush_pmksa,
+       TP_ARGS(wiphy, netdev)
+ );
+ 
++DEFINE_EVENT(wiphy_netdev_evt, rdev_end_cac,
++           TP_PROTO(struct wiphy *wiphy, struct net_device *netdev),
++           TP_ARGS(wiphy, netdev)
++);
++
+ DECLARE_EVENT_CLASS(station_add_change,
+       TP_PROTO(struct wiphy *wiphy, struct net_device *netdev, u8 *mac,
+                struct station_parameters *params),
+diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c
+index 5e677dac2a0c..69102fda9ebd 100644
+--- a/net/wireless/wext-core.c
++++ b/net/wireless/wext-core.c
+@@ -657,7 +657,8 @@ struct iw_statistics *get_wireless_stats(struct net_device 
*dev)
+       return NULL;
+ }
+ 
+-static int iw_handler_get_iwstats(struct net_device *         dev,
++/* noinline to avoid a bogus warning with -O3 */
++static noinline int iw_handler_get_iwstats(struct net_device *        dev,
+                                 struct iw_request_info *      info,
+                                 union iwreq_data *            wrqu,
+                                 char *                        extra)
+diff --git a/net/xfrm/xfrm_interface.c b/net/xfrm/xfrm_interface.c
+index 0f5131bc3342..4d5627e274fe 100644
+--- a/net/xfrm/xfrm_interface.c
++++ b/net/xfrm/xfrm_interface.c
+@@ -268,9 +268,6 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, 
struct flowi *fl)
+       int err = -1;
+       int mtu;
+ 
+-      if (!dst)
+-              goto tx_err_link_failure;
+-
+       dst_hold(dst);
+       dst = xfrm_lookup_with_ifid(xi->net, dst, fl, NULL, 0, xi->p.if_id);
+       if (IS_ERR(dst)) {
+@@ -297,7 +294,7 @@ xfrmi_xmit2(struct sk_buff *skb, struct net_device *dev, 
struct flowi *fl)
+ 
+       mtu = dst_mtu(dst);
+       if (!skb->ignore_df && skb->len > mtu) {
+-              skb_dst_update_pmtu(skb, mtu);
++              skb_dst_update_pmtu_no_confirm(skb, mtu);
+ 
+               if (skb->protocol == htons(ETH_P_IPV6)) {
+                       if (mtu < IPV6_MIN_MTU)
+@@ -343,6 +340,7 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, struct 
net_device *dev)
+ {
+       struct xfrm_if *xi = netdev_priv(dev);
+       struct net_device_stats *stats = &xi->dev->stats;
++      struct dst_entry *dst = skb_dst(skb);
+       struct flowi fl;
+       int ret;
+ 
+@@ -352,10 +350,33 @@ static netdev_tx_t xfrmi_xmit(struct sk_buff *skb, 
struct net_device *dev)
+       case htons(ETH_P_IPV6):
+               xfrm_decode_session(skb, &fl, AF_INET6);
+               memset(IP6CB(skb), 0, sizeof(*IP6CB(skb)));
++              if (!dst) {
++                      fl.u.ip6.flowi6_oif = dev->ifindex;
++                      fl.u.ip6.flowi6_flags |= FLOWI_FLAG_ANYSRC;
++                      dst = ip6_route_output(dev_net(dev), NULL, &fl.u.ip6);
++                      if (dst->error) {
++                              dst_release(dst);
++                              stats->tx_carrier_errors++;
++                              goto tx_err;
++                      }
++                      skb_dst_set(skb, dst);
++              }
+               break;
+       case htons(ETH_P_IP):
+               xfrm_decode_session(skb, &fl, AF_INET);
+               memset(IPCB(skb), 0, sizeof(*IPCB(skb)));
++              if (!dst) {
++                      struct rtable *rt;
++
++                      fl.u.ip4.flowi4_oif = dev->ifindex;
++                      fl.u.ip4.flowi4_flags |= FLOWI_FLAG_ANYSRC;
++                      rt = __ip_route_output_key(dev_net(dev), &fl.u.ip4);
++                      if (IS_ERR(rt)) {
++                              stats->tx_carrier_errors++;
++                              goto tx_err;
++                      }
++                      skb_dst_set(skb, &rt->dst);
++              }
+               break;
+       default:
+               goto tx_err;
+@@ -563,12 +584,9 @@ static void xfrmi_dev_setup(struct net_device *dev)
+ {
+       dev->netdev_ops         = &xfrmi_netdev_ops;
+       dev->type               = ARPHRD_NONE;
+-      dev->hard_header_len    = ETH_HLEN;
+-      dev->min_header_len     = ETH_HLEN;
+       dev->mtu                = ETH_DATA_LEN;
+       dev->min_mtu            = ETH_MIN_MTU;
+-      dev->max_mtu            = ETH_DATA_LEN;
+-      dev->addr_len           = ETH_ALEN;
++      dev->max_mtu            = IP_MAX_MTU;
+       dev->flags              = IFF_NOARP;
+       dev->needs_free_netdev  = true;
+       dev->priv_destructor    = xfrmi_dev_free;
+diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c
+index c36bafbcd77e..1b467381986f 100644
+--- a/security/tomoyo/common.c
++++ b/security/tomoyo/common.c
+@@ -2322,9 +2322,9 @@ static const char * const 
tomoyo_memory_headers[TOMOYO_MAX_MEMORY_STAT] = {
+       [TOMOYO_MEMORY_QUERY]  = "query message:",
+ };
+ 
+-/* Timestamp counter for last updated. */
+-static unsigned int tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT];
+ /* Counter for number of updates. */
++static atomic_t tomoyo_stat_updated[TOMOYO_MAX_POLICY_STAT];
++/* Timestamp counter for last updated. */
+ static time64_t tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT];
+ 
+ /**
+@@ -2336,10 +2336,7 @@ static time64_t 
tomoyo_stat_modified[TOMOYO_MAX_POLICY_STAT];
+  */
+ void tomoyo_update_stat(const u8 index)
+ {
+-      /*
+-       * I don't use atomic operations because race condition is not fatal.
+-       */
+-      tomoyo_stat_updated[index]++;
++      atomic_inc(&tomoyo_stat_updated[index]);
+       tomoyo_stat_modified[index] = ktime_get_real_seconds();
+ }
+ 
+@@ -2360,7 +2357,7 @@ static void tomoyo_read_stat(struct tomoyo_io_buffer 
*head)
+       for (i = 0; i < TOMOYO_MAX_POLICY_STAT; i++) {
+               tomoyo_io_printf(head, "Policy %-30s %10u",
+                                tomoyo_policy_headers[i],
+-                               tomoyo_stat_updated[i]);
++                               atomic_read(&tomoyo_stat_updated[i]));
+               if (tomoyo_stat_modified[i]) {
+                       struct tomoyo_time stamp;
+ 
+diff --git a/sound/soc/codecs/hdac_hda.c b/sound/soc/codecs/hdac_hda.c
+index 4570f662fb48..d78f4d856aaf 100644
+--- a/sound/soc/codecs/hdac_hda.c
++++ b/sound/soc/codecs/hdac_hda.c
+@@ -498,7 +498,9 @@ static int hdac_hda_dev_remove(struct hdac_device *hdev)
+       struct hdac_hda_priv *hda_pvt;
+ 
+       hda_pvt = dev_get_drvdata(&hdev->dev);
+-      cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work);
++      if (hda_pvt && hda_pvt->codec.registered)
++              cancel_delayed_work_sync(&hda_pvt->codec.jackpoll_work);
++
+       return 0;
+ }
+ 
+diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c
+index adbae1f36a8a..747ca248bf10 100644
+--- a/sound/soc/codecs/rt5640.c
++++ b/sound/soc/codecs/rt5640.c
+@@ -2432,6 +2432,13 @@ static void rt5640_disable_jack_detect(struct 
snd_soc_component *component)
+ {
+       struct rt5640_priv *rt5640 = snd_soc_component_get_drvdata(component);
+ 
++      /*
++       * soc_remove_component() force-disables jack and thus rt5640->jack
++       * could be NULL at the time of driver's module unloading.
++       */
++      if (!rt5640->jack)
++              return;
++
+       disable_irq(rt5640->irq);
+       rt5640_cancel_work(rt5640);
+ 
+diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
+index 7ccbca47240d..fef01e1dd15c 100644
+--- a/sound/soc/soc-topology.c
++++ b/sound/soc/soc-topology.c
+@@ -1891,6 +1891,10 @@ static int soc_tplg_fe_link_create(struct soc_tplg 
*tplg,
+       link->num_codecs = 1;
+       link->num_platforms = 1;
+ 
++      link->dobj.index = tplg->index;
++      link->dobj.ops = tplg->ops;
++      link->dobj.type = SND_SOC_DOBJ_DAI_LINK;
++
+       if (strlen(pcm->pcm_name)) {
+               link->name = kstrdup(pcm->pcm_name, GFP_KERNEL);
+               link->stream_name = kstrdup(pcm->pcm_name, GFP_KERNEL);
+@@ -1927,9 +1931,6 @@ static int soc_tplg_fe_link_create(struct soc_tplg *tplg,
+               goto err;
+       }
+ 
+-      link->dobj.index = tplg->index;
+-      link->dobj.ops = tplg->ops;
+-      link->dobj.type = SND_SOC_DOBJ_DAI_LINK;
+       list_add(&link->dobj.list, &tplg->comp->dobj_list);
+ 
+       return 0;
+diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c
+index 3ca6795a89ba..9e8233c10d86 100644
+--- a/sound/soc/sof/intel/hda-codec.c
++++ b/sound/soc/sof/intel/hda-codec.c
+@@ -24,19 +24,18 @@
+ #define IDISP_VID_INTEL       0x80860000
+ 
+ /* load the legacy HDA codec driver */
+-#ifdef MODULE
+-static void hda_codec_load_module(struct hda_codec *codec)
++static int hda_codec_load_module(struct hda_codec *codec)
+ {
++#ifdef MODULE
+       char alias[MODULE_NAME_LEN];
+       const char *module = alias;
+ 
+       snd_hdac_codec_modalias(&codec->core, alias, sizeof(alias));
+       dev_dbg(&codec->core.dev, "loading codec module: %s\n", module);
+       request_module(module);
+-}
+-#else
+-static void hda_codec_load_module(struct hda_codec *codec) {}
+ #endif
++      return device_attach(hda_codec_dev(codec));
++}
+ 
+ /* enable controller wake up event for all codecs with jack connectors */
+ void hda_codec_jack_wake_enable(struct snd_sof_dev *sdev)
+@@ -116,10 +115,16 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int 
address)
+       /* use legacy bus only for HDA codecs, idisp uses ext bus */
+       if ((resp & 0xFFFF0000) != IDISP_VID_INTEL) {
+               hdev->type = HDA_DEV_LEGACY;
+-              hda_codec_load_module(&hda_priv->codec);
++              ret = hda_codec_load_module(&hda_priv->codec);
++              /*
++               * handle ret==0 (no driver bound) as an error, but pass
++               * other return codes without modification
++               */
++              if (ret == 0)
++                      ret = -ENOENT;
+       }
+ 
+-      return 0;
++      return ret;
+ #else
+       hdev = devm_kzalloc(sdev->dev, sizeof(*hdev), GFP_KERNEL);
+       if (!hdev)
+diff --git a/sound/soc/sti/uniperif_player.c b/sound/soc/sti/uniperif_player.c
+index 48ea915b24ba..2ed92c990b97 100644
+--- a/sound/soc/sti/uniperif_player.c
++++ b/sound/soc/sti/uniperif_player.c
+@@ -226,7 +226,6 @@ static void uni_player_set_channel_status(struct uniperif 
*player,
+        * sampling frequency. If no sample rate is already specified, then
+        * set one.
+        */
+-      mutex_lock(&player->ctrl_lock);
+       if (runtime) {
+               switch (runtime->rate) {
+               case 22050:
+@@ -303,7 +302,6 @@ static void uni_player_set_channel_status(struct uniperif 
*player,
+               player->stream_settings.iec958.status[3 + (n * 4)] << 24;
+               SET_UNIPERIF_CHANNEL_STA_REGN(player, n, status);
+       }
+-      mutex_unlock(&player->ctrl_lock);
+ 
+       /* Update the channel status */
+       if (player->ver < SND_ST_UNIPERIF_VERSION_UNI_PLR_TOP_1_0)
+@@ -365,8 +363,10 @@ static int uni_player_prepare_iec958(struct uniperif 
*player,
+ 
+       SET_UNIPERIF_CTRL_ZERO_STUFF_HW(player);
+ 
++      mutex_lock(&player->ctrl_lock);
+       /* Update the channel status */
+       uni_player_set_channel_status(player, runtime);
++      mutex_unlock(&player->ctrl_lock);
+ 
+       /* Clear the user validity user bits */
+       SET_UNIPERIF_USER_VALIDITY_VALIDITY_LR(player, 0);
+@@ -598,7 +598,6 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol 
*kcontrol,
+       iec958->status[1] = ucontrol->value.iec958.status[1];
+       iec958->status[2] = ucontrol->value.iec958.status[2];
+       iec958->status[3] = ucontrol->value.iec958.status[3];
+-      mutex_unlock(&player->ctrl_lock);
+ 
+       spin_lock_irqsave(&player->irq_lock, flags);
+       if (player->substream && player->substream->runtime)
+@@ -608,6 +607,8 @@ static int uni_player_ctl_iec958_put(struct snd_kcontrol 
*kcontrol,
+               uni_player_set_channel_status(player, NULL);
+ 
+       spin_unlock_irqrestore(&player->irq_lock, flags);
++      mutex_unlock(&player->ctrl_lock);
++
+       return 0;
+ }
+ 
+diff --git a/tools/include/linux/string.h b/tools/include/linux/string.h
+index 980cb9266718..5e9e781905ed 100644
+--- a/tools/include/linux/string.h
++++ b/tools/include/linux/string.h
+@@ -17,7 +17,15 @@ int strtobool(const char *s, bool *res);
+  * However uClibc headers also define __GLIBC__ hence the hack below
+  */
+ #if defined(__GLIBC__) && !defined(__UCLIBC__)
++// pragma diagnostic was introduced in gcc 4.6
++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
++#pragma GCC diagnostic push
++#pragma GCC diagnostic ignored "-Wredundant-decls"
++#endif
+ extern size_t strlcpy(char *dest, const char *src, size_t size);
++#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
++#pragma GCC diagnostic pop
++#endif
+ #endif
+ 
+ char *str_error_r(int errnum, char *buf, size_t buflen);
+diff --git a/tools/lib/string.c b/tools/lib/string.c
+index f2ae1b87c719..f645343815de 100644
+--- a/tools/lib/string.c
++++ b/tools/lib/string.c
+@@ -96,6 +96,10 @@ int strtobool(const char *s, bool *res)
+  * If libc has strlcpy() then that version will override this
+  * implementation:
+  */
++#ifdef __clang__
++#pragma clang diagnostic push
++#pragma clang diagnostic ignored "-Wignored-attributes"
++#endif
+ size_t __weak strlcpy(char *dest, const char *src, size_t size)
+ {
+       size_t ret = strlen(src);
+@@ -107,6 +111,9 @@ size_t __weak strlcpy(char *dest, const char *src, size_t 
size)
+       }
+       return ret;
+ }
++#ifdef __clang__
++#pragma clang diagnostic pop
++#endif
+ 
+ /**
+  * skip_spaces - Removes leading whitespace from @str.
+diff --git a/tools/lib/traceevent/parse-filter.c 
b/tools/lib/traceevent/parse-filter.c
+index f3cbf86e51ac..20eed719542e 100644
+--- a/tools/lib/traceevent/parse-filter.c
++++ b/tools/lib/traceevent/parse-filter.c
+@@ -1228,8 +1228,10 @@ filter_event(struct tep_event_filter *filter, struct 
tep_event *event,
+       }
+ 
+       filter_type = add_filter_type(filter, event->id);
+-      if (filter_type == NULL)
++      if (filter_type == NULL) {
++              free_arg(arg);
+               return TEP_ERRNO__MEM_ALLOC_FAILED;
++      }
+ 
+       if (filter_type->filter)
+               free_arg(filter_type->filter);
+diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
+index e69f44941aad..f2e9d2b1b913 100644
+--- a/tools/perf/builtin-c2c.c
++++ b/tools/perf/builtin-c2c.c
+@@ -595,8 +595,8 @@ tot_hitm_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
+ {
+       struct c2c_hist_entry *c2c_left;
+       struct c2c_hist_entry *c2c_right;
+-      unsigned int tot_hitm_left;
+-      unsigned int tot_hitm_right;
++      uint64_t tot_hitm_left;
++      uint64_t tot_hitm_right;
+ 
+       c2c_left  = container_of(left, struct c2c_hist_entry, he);
+       c2c_right = container_of(right, struct c2c_hist_entry, he);
+@@ -629,7 +629,8 @@ __f ## _cmp(struct perf_hpp_fmt *fmt __maybe_unused,       
                \
+                                                                       \
+       c2c_left  = container_of(left, struct c2c_hist_entry, he);      \
+       c2c_right = container_of(right, struct c2c_hist_entry, he);     \
+-      return c2c_left->stats.__f - c2c_right->stats.__f;              \
++      return (uint64_t) c2c_left->stats.__f -                         \
++             (uint64_t) c2c_right->stats.__f;                         \
+ }
+ 
+ #define STAT_FN(__f)          \
+@@ -682,7 +683,8 @@ ld_llcmiss_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
+       c2c_left  = container_of(left, struct c2c_hist_entry, he);
+       c2c_right = container_of(right, struct c2c_hist_entry, he);
+ 
+-      return llc_miss(&c2c_left->stats) - llc_miss(&c2c_right->stats);
++      return (uint64_t) llc_miss(&c2c_left->stats) -
++             (uint64_t) llc_miss(&c2c_right->stats);
+ }
+ 
+ static uint64_t total_records(struct c2c_stats *stats)
+diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
+index ea3f0745d7ad..6407dff405d9 100644
+--- a/tools/perf/builtin-report.c
++++ b/tools/perf/builtin-report.c
+@@ -399,10 +399,10 @@ static int report__setup_sample_type(struct report *rep)
+                               PERF_SAMPLE_BRANCH_ANY))
+               rep->nonany_branch_mode = true;
+ 
+-#ifndef HAVE_LIBUNWIND_SUPPORT
++#if !defined(HAVE_LIBUNWIND_SUPPORT) && !defined(HAVE_DWARF_SUPPORT)
+       if (dwarf_callchain_users) {
+-              ui__warning("Please install libunwind development packages "
+-                          "during the perf build.\n");
++              ui__warning("Please install libunwind or libdw "
++                          "development packages during the perf build.\n");
+       }
+ #endif
+ 

Reply via email to