commit:     29ed4696b3376d1ab01f653a19d2fd892b625c72
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Wed Feb  5 14:48:57 2020 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Wed Feb  5 14:48:57 2020 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=29ed4696

Linux patch 4.14.170

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

 0000_README               |    4 +
 1169_linux-4.14.170.patch | 3128 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 3132 insertions(+)

diff --git a/0000_README b/0000_README
index 0793c3f..811495e 100644
--- a/0000_README
+++ b/0000_README
@@ -719,6 +719,10 @@ Patch:  1168_linux-4.14.169.patch
 From:   https://www.kernel.org
 Desc:   Linux 4.14.169
 
+Patch:  1169_linux-4.14.170.patch
+From:   https://www.kernel.org
+Desc:   Linux 4.14.170
+
 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/1169_linux-4.14.170.patch b/1169_linux-4.14.170.patch
new file mode 100644
index 0000000..5f3c3d2
--- /dev/null
+++ b/1169_linux-4.14.170.patch
@@ -0,0 +1,3128 @@
+diff --git a/Documentation/ABI/testing/sysfs-class-devfreq 
b/Documentation/ABI/testing/sysfs-class-devfreq
+index ee39acacf6f8..335595a79866 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 795d93bfe156..b614291199f8 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 4
+ PATCHLEVEL = 14
+-SUBLEVEL = 169
++SUBLEVEL = 170
+ EXTRAVERSION =
+ NAME = Petit Gorille
+ 
+diff --git a/arch/arc/plat-eznps/Kconfig b/arch/arc/plat-eznps/Kconfig
+index 8eff057efcae..ce908e2c5282 100644
+--- a/arch/arc/plat-eznps/Kconfig
++++ b/arch/arc/plat-eznps/Kconfig
+@@ -7,7 +7,7 @@
+ menuconfig ARC_PLAT_EZNPS
+       bool "\"EZchip\" ARC dev platform"
+       select CPU_BIG_ENDIAN
+-      select CLKSRC_NPS
++      select CLKSRC_NPS if !PHYS_ADDR_T_64BIT
+       select EZNPS_GIC
+       select EZCHIP_NPS_MANAGEMENT_ENET if ETHERNET
+       help
+diff --git a/arch/arm/boot/dts/am335x-boneblack-common.dtsi 
b/arch/arm/boot/dts/am335x-boneblack-common.dtsi
+index 325daae40278..485c27f039f5 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/am57xx-beagle-x15-common.dtsi 
b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi
+index 49aeecd312b4..d578a9f7e1a0 100644
+--- a/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi
++++ b/arch/arm/boot/dts/am57xx-beagle-x15-common.dtsi
+@@ -32,6 +32,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";
+diff --git a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts 
b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
+index 716a205c6dbb..1fed3231f5c1 100644
+--- a/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
++++ b/arch/arm/boot/dts/sun8i-a83t-cubietruck-plus.dts
+@@ -90,7 +90,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 82a942894fc0..83e463c05dcd 100644
+--- a/arch/arm/kernel/hyp-stub.S
++++ b/arch/arm/kernel/hyp-stub.S
+@@ -159,10 +159,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/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/x86/kernel/cpu/intel_rdt_rdtgroup.c 
b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
+index 2dae1b3c42fc..0ec30b2384c0 100644
+--- a/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
++++ b/arch/x86/kernel/cpu/intel_rdt_rdtgroup.c
+@@ -1107,7 +1107,7 @@ static struct dentry *rdt_mount(struct file_system_type 
*fs_type,
+ 
+       if (rdt_mon_capable) {
+               ret = mongroup_create_dir(rdtgroup_default.kn,
+-                                        NULL, "mon_groups",
++                                        &rdtgroup_default, "mon_groups",
+                                         &kn_mongrp);
+               if (ret) {
+                       dentry = ERR_PTR(ret);
+@@ -1260,7 +1260,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);
+       }
+ }
+ 
+@@ -1294,7 +1298,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);
+@@ -1491,7 +1499,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;
+ 
+@@ -1525,7 +1533,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;
+@@ -1581,7 +1589,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;
+ 
+@@ -1592,7 +1600,7 @@ out_destroy:
+ out_free_rgrp:
+       kfree(rdtgrp);
+ out_unlock:
+-      rdtgroup_kn_unlock(prgrp_kn);
++      rdtgroup_kn_unlock(parent_kn);
+       return ret;
+ }
+ 
+@@ -1630,7 +1638,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;
+ }
+ 
+@@ -1667,7 +1675,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)
+                       goto out_id_free;
+       }
+@@ -1680,7 +1688,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;
+ }
+ 
+@@ -1792,11 +1800,6 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, 
struct rdtgroup *rdtgrp,
+       closid_free(rdtgrp->closid);
+       free_rmid(rdtgrp->mon.rmid);
+ 
+-      /*
+-       * Free all the child monitor group rmids.
+-       */
+-      free_all_child_rdtgrp(rdtgrp);
+-
+       list_del(&rdtgrp->rdtgroup_list);
+ 
+       /*
+@@ -1806,6 +1809,11 @@ static int rdtgroup_rmdir_ctrl(struct kernfs_node *kn, 
struct rdtgroup *rdtgrp,
+       kernfs_get(kn);
+       kernfs_remove(rdtgrp->kn);
+ 
++      /*
++       * Free all the child monitor group rmids.
++       */
++      free_all_child_rdtgrp(rdtgrp);
++
+       return 0;
+ }
+ 
+diff --git a/crypto/af_alg.c b/crypto/af_alg.c
+index 422bba808f73..0679c35adf55 100644
+--- a/crypto/af_alg.c
++++ b/crypto/af_alg.c
+@@ -139,11 +139,13 @@ void af_alg_release_parent(struct sock *sk)
+       sk = ask->parent;
+       ask = alg_sk(sk);
+ 
+-      lock_sock(sk);
++      local_bh_disable();
++      bh_lock_sock(sk);
+       ask->nokey_refcnt -= nokey;
+       if (!last)
+               last = !--ask->refcnt;
+-      release_sock(sk);
++      bh_unlock_sock(sk);
++      local_bh_enable();
+ 
+       if (last)
+               sock_put(sk);
+diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c
+index a5718c0a3dc4..1348541da463 100644
+--- a/crypto/pcrypt.c
++++ b/crypto/pcrypt.c
+@@ -505,11 +505,12 @@ err:
+ 
+ static void __exit pcrypt_exit(void)
+ {
++      crypto_unregister_template(&pcrypt_tmpl);
++
+       pcrypt_fini_padata(&pencrypt);
+       pcrypt_fini_padata(&pdecrypt);
+ 
+       kset_unregister(pcrypt_kset);
+-      crypto_unregister_template(&pcrypt_tmpl);
+ }
+ 
+ module_init(pcrypt_init);
+diff --git a/drivers/atm/eni.c b/drivers/atm/eni.c
+index ce47eb17901d..a106d15f6def 100644
+--- a/drivers/atm/eni.c
++++ b/drivers/atm/eni.c
+@@ -372,7 +372,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff 
*skb,
+               here = (eni_vcc->descr+skip) & (eni_vcc->words-1);
+               dma[j++] = (here << MID_DMA_COUNT_SHIFT) | (vcc->vci
+                   << MID_DMA_VCI_SHIFT) | MID_DT_JK;
+-              j++;
++              dma[j++] = 0;
+       }
+       here = (eni_vcc->descr+size+skip) & (eni_vcc->words-1);
+       if (!eff) size += skip;
+@@ -445,7 +445,7 @@ static int do_rx_dma(struct atm_vcc *vcc,struct sk_buff 
*skb,
+       if (size != eff) {
+               dma[j++] = (here << MID_DMA_COUNT_SHIFT) |
+                   (vcc->vci << MID_DMA_VCI_SHIFT) | MID_DT_JK;
+-              j++;
++              dma[j++] = 0;
+       }
+       if (!j || j > 2*RX_DMA_BUF) {
+               printk(KERN_CRIT DEV_LABEL "!j or j too big!!!\n");
+diff --git a/drivers/char/ttyprintk.c b/drivers/char/ttyprintk.c
+index 67549ce88cc9..774748497ace 100644
+--- a/drivers/char/ttyprintk.c
++++ b/drivers/char/ttyprintk.c
+@@ -18,10 +18,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;
+@@ -100,11 +101,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);
+ }
+@@ -116,13 +118,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;
+ }
+@@ -172,7 +175,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 d083b860f083..10689d8cd386 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/crypto/chelsio/chcr_algo.c 
b/drivers/crypto/chelsio/chcr_algo.c
+index bb7b59fc5c08..8d39f3a07bf8 100644
+--- a/drivers/crypto/chelsio/chcr_algo.c
++++ b/drivers/crypto/chelsio/chcr_algo.c
+@@ -2693,9 +2693,6 @@ static int chcr_gcm_setauthsize(struct crypto_aead *tfm, 
unsigned int authsize)
+               aeadctx->mayverify = VERIFY_SW;
+               break;
+       default:
+-
+-                crypto_tfm_set_flags((struct crypto_tfm *) tfm,
+-                      CRYPTO_TFM_RES_BAD_KEY_LEN);
+               return -EINVAL;
+       }
+       return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
+@@ -2720,8 +2717,6 @@ static int chcr_4106_4309_setauthsize(struct crypto_aead 
*tfm,
+               aeadctx->mayverify = VERIFY_HW;
+               break;
+       default:
+-              crypto_tfm_set_flags((struct crypto_tfm *)tfm,
+-                                   CRYPTO_TFM_RES_BAD_KEY_LEN);
+               return -EINVAL;
+       }
+       return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
+@@ -2762,8 +2757,6 @@ static int chcr_ccm_setauthsize(struct crypto_aead *tfm,
+               aeadctx->mayverify = VERIFY_HW;
+               break;
+       default:
+-              crypto_tfm_set_flags((struct crypto_tfm *)tfm,
+-                                   CRYPTO_TFM_RES_BAD_KEY_LEN);
+               return -EINVAL;
+       }
+       return crypto_aead_setauthsize(aeadctx->sw_cipher, authsize);
+@@ -2790,8 +2783,7 @@ static int chcr_ccm_common_setkey(struct crypto_aead 
*aead,
+               ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
+               mk_size = CHCR_KEYCTX_MAC_KEY_SIZE_256;
+       } else {
+-              crypto_tfm_set_flags((struct crypto_tfm *)aead,
+-                                   CRYPTO_TFM_RES_BAD_KEY_LEN);
++              crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN);
+               aeadctx->enckey_len = 0;
+               return  -EINVAL;
+       }
+@@ -2831,8 +2823,7 @@ static int chcr_aead_rfc4309_setkey(struct crypto_aead 
*aead, const u8 *key,
+       int error;
+ 
+       if (keylen < 3) {
+-              crypto_tfm_set_flags((struct crypto_tfm *)aead,
+-                                   CRYPTO_TFM_RES_BAD_KEY_LEN);
++              crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN);
+               aeadctx->enckey_len = 0;
+               return  -EINVAL;
+       }
+@@ -2883,8 +2874,7 @@ static int chcr_gcm_setkey(struct crypto_aead *aead, 
const u8 *key,
+       } else if (keylen == AES_KEYSIZE_256) {
+               ck_size = CHCR_KEYCTX_CIPHER_KEY_SIZE_256;
+       } else {
+-              crypto_tfm_set_flags((struct crypto_tfm *)aead,
+-                                   CRYPTO_TFM_RES_BAD_KEY_LEN);
++              crypto_aead_set_flags(aead, CRYPTO_TFM_RES_BAD_KEY_LEN);
+               pr_err("GCM: Invalid key length %d\n", keylen);
+               ret = -EINVAL;
+               goto out;
+diff --git a/drivers/devfreq/devfreq.c b/drivers/devfreq/devfreq.c
+index ad18de955b6c..58ec3abfd321 100644
+--- a/drivers/devfreq/devfreq.c
++++ b/drivers/devfreq/devfreq.c
+@@ -902,6 +902,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)
+ {
+@@ -1200,6 +1208,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/gpio/Kconfig b/drivers/gpio/Kconfig
+index 2357d2f73c1a..8d2ab77c6581 100644
+--- a/drivers/gpio/Kconfig
++++ b/drivers/gpio/Kconfig
+@@ -990,6 +990,7 @@ config GPIO_LP87565
+ config GPIO_MAX77620
+       tristate "GPIO support for PMIC MAX77620 and MAX20024"
+       depends on MFD_MAX77620
++      select GPIOLIB_IRQCHIP
+       help
+         GPIO driver for MAX77620 and MAX20024 PMIC from Maxim Semiconductor.
+         MAX77620 PMIC has 8 pins that can be configured as GPIOs. The
+diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
+index 1e2e6e58256a..9d372fa7c298 100644
+--- a/drivers/hid/hid-ids.h
++++ b/drivers/hid/hid-ids.h
+@@ -1024,6 +1024,7 @@
+ #define USB_DEVICE_ID_SYNAPTICS_LTS2  0x1d10
+ #define USB_DEVICE_ID_SYNAPTICS_HD    0x0ac3
+ #define USB_DEVICE_ID_SYNAPTICS_QUAD_HD       0x1ac3
++#define USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012      0x2968
+ #define USB_DEVICE_ID_SYNAPTICS_TP_V103       0x5710
+ 
+ #define USB_VENDOR_ID_TEXAS_INSTRUMENTS       0x2047
+diff --git a/drivers/hid/hid-ite.c b/drivers/hid/hid-ite.c
+index 98b059d79bc8..2ce1eb0c9212 100644
+--- a/drivers/hid/hid-ite.c
++++ b/drivers/hid/hid-ite.c
+@@ -43,6 +43,9 @@ static int ite_event(struct hid_device *hdev, struct 
hid_field *field,
+ static const struct hid_device_id ite_devices[] = {
+       { HID_USB_DEVICE(USB_VENDOR_ID_ITE, USB_DEVICE_ID_ITE8595) },
+       { HID_USB_DEVICE(USB_VENDOR_ID_258A, USB_DEVICE_ID_258A_6A88) },
++      /* ITE8595 USB kbd ctlr, with Synaptics touchpad connected to it. */
++      { HID_USB_DEVICE(USB_VENDOR_ID_SYNAPTICS,
++                       USB_DEVICE_ID_SYNAPTICS_ACER_SWITCH5_012) },
+       { }
+ };
+ MODULE_DEVICE_TABLE(hid, ite_devices);
+diff --git a/drivers/media/radio/si470x/radio-si470x-i2c.c 
b/drivers/media/radio/si470x/radio-si470x-i2c.c
+index b60fb6ed5aeb..527535614342 100644
+--- a/drivers/media/radio/si470x/radio-si470x-i2c.c
++++ b/drivers/media/radio/si470x/radio-si470x-i2c.c
+@@ -453,10 +453,10 @@ static int si470x_i2c_remove(struct i2c_client *client)
+ 
+       free_irq(client->irq, radio);
+       video_unregister_device(&radio->videodev);
+-      kfree(radio);
+ 
+       v4l2_ctrl_handler_free(&radio->hdl);
+       v4l2_device_unregister(&radio->v4l2_dev);
++      kfree(radio);
+       return 0;
+ }
+ 
+diff --git a/drivers/media/usb/dvb-usb/af9005.c 
b/drivers/media/usb/dvb-usb/af9005.c
+index c047a0bdf91f..66990a193bc5 100644
+--- a/drivers/media/usb/dvb-usb/af9005.c
++++ b/drivers/media/usb/dvb-usb/af9005.c
+@@ -563,7 +563,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 475a3c0cdee7..20d33f0544ed 100644
+--- a/drivers/media/usb/dvb-usb/digitv.c
++++ b/drivers/media/usb/dvb-usb/digitv.c
+@@ -233,18 +233,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/gspca/gspca.c b/drivers/media/usb/gspca/gspca.c
+index 0f141762abf1..87582be4a39d 100644
+--- a/drivers/media/usb/gspca/gspca.c
++++ b/drivers/media/usb/gspca/gspca.c
+@@ -2038,7 +2038,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/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c
+index 94ad2fdd6ef0..05440b727261 100644
+--- a/drivers/net/dsa/bcm_sf2.c
++++ b/drivers/net/dsa/bcm_sf2.c
+@@ -137,7 +137,7 @@ static void bcm_sf2_imp_setup(struct dsa_switch *ds, int 
port)
+ 
+               /* Force link status for IMP port */
+               reg = core_readl(priv, offset);
+-              reg |= (MII_SW_OR | LINK_STS);
++              reg |= (MII_SW_OR | LINK_STS | GMII_SPEED_UP_2G);
+               core_writel(priv, reg, offset);
+ 
+               /* Enable Broadcast, Multicast, Unicast forwarding to IMP port 
*/
+diff --git a/drivers/net/ethernet/broadcom/b44.c 
b/drivers/net/ethernet/broadcom/b44.c
+index a1125d10c825..8b9a0ce1d29f 100644
+--- a/drivers/net/ethernet/broadcom/b44.c
++++ b/drivers/net/ethernet/broadcom/b44.c
+@@ -1521,8 +1521,10 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, 
u8 *pmask, int offset)
+       int ethaddr_bytes = ETH_ALEN;
+ 
+       memset(ppattern + offset, 0xff, magicsync);
+-      for (j = 0; j < magicsync; j++)
+-              set_bit(len++, (unsigned long *) pmask);
++      for (j = 0; j < magicsync; j++) {
++              pmask[len >> 3] |= BIT(len & 7);
++              len++;
++      }
+ 
+       for (j = 0; j < B44_MAX_PATTERNS; j++) {
+               if ((B44_PATTERN_SIZE - len) >= ETH_ALEN)
+@@ -1534,7 +1536,8 @@ static int b44_magic_pattern(u8 *macaddr, u8 *ppattern, 
u8 *pmask, int offset)
+               for (k = 0; k< ethaddr_bytes; k++) {
+                       ppattern[offset + magicsync +
+                               (j * ETH_ALEN) + k] = macaddr[k];
+-                      set_bit(len++, (unsigned long *) pmask);
++                      pmask[len >> 3] |= BIT(len & 7);
++                      len++;
+               }
+       }
+       return len - 1;
+diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c 
b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+index 38ee7692132c..7461e7b9eaae 100644
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+@@ -7402,11 +7402,23 @@ static bool bnxt_fltr_match(struct bnxt_ntuple_filter 
*f1,
+       struct flow_keys *keys1 = &f1->fkeys;
+       struct flow_keys *keys2 = &f2->fkeys;
+ 
+-      if (keys1->addrs.v4addrs.src == keys2->addrs.v4addrs.src &&
+-          keys1->addrs.v4addrs.dst == keys2->addrs.v4addrs.dst &&
+-          keys1->ports.ports == keys2->ports.ports &&
+-          keys1->basic.ip_proto == keys2->basic.ip_proto &&
+-          keys1->basic.n_proto == keys2->basic.n_proto &&
++      if (keys1->basic.n_proto != keys2->basic.n_proto ||
++          keys1->basic.ip_proto != keys2->basic.ip_proto)
++              return false;
++
++      if (keys1->basic.n_proto == htons(ETH_P_IP)) {
++              if (keys1->addrs.v4addrs.src != keys2->addrs.v4addrs.src ||
++                  keys1->addrs.v4addrs.dst != keys2->addrs.v4addrs.dst)
++                      return false;
++      } else {
++              if (memcmp(&keys1->addrs.v6addrs.src, &keys2->addrs.v6addrs.src,
++                         sizeof(keys1->addrs.v6addrs.src)) ||
++                  memcmp(&keys1->addrs.v6addrs.dst, &keys2->addrs.v6addrs.dst,
++                         sizeof(keys1->addrs.v6addrs.dst)))
++                      return false;
++      }
++
++      if (keys1->ports.ports == keys2->ports.ports &&
+           keys1->control.flags == keys2->control.flags &&
+           ether_addr_equal(f1->src_mac_addr, f2->src_mac_addr) &&
+           ether_addr_equal(f1->dst_mac_addr, f2->dst_mac_addr))
+diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c 
b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
+index 9e5cd18e7358..8bd90ad15607 100644
+--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
++++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
+@@ -66,8 +66,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 f7ef8871dd0b..67aa3c997417 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 75ce773c21a6..b33650a897f1 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
+@@ -439,7 +439,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/igb/e1000_82575.c 
b/drivers/net/ethernet/intel/igb/e1000_82575.c
+index c37cc8bccf47..158c277ec353 100644
+--- a/drivers/net/ethernet/intel/igb/e1000_82575.c
++++ b/drivers/net/ethernet/intel/igb/e1000_82575.c
+@@ -562,7 +562,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) {
+@@ -689,14 +689,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 d06a8db514d4..82028ce355fb 100644
+--- a/drivers/net/ethernet/intel/igb/igb_ethtool.c
++++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c
+@@ -201,7 +201,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 e4c1e6345edd..ba184287e11f 100644
+--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
++++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
+@@ -5131,7 +5131,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);
+ 
+@@ -5140,17 +5140,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 e238f6e85ab6..a7708e14aa5c 100644
+--- a/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
++++ b/drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
+@@ -1858,11 +1858,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/natsemi/sonic.c 
b/drivers/net/ethernet/natsemi/sonic.c
+index a051dddcbd76..254e6dbc4c6a 100644
+--- a/drivers/net/ethernet/natsemi/sonic.c
++++ b/drivers/net/ethernet/natsemi/sonic.c
+@@ -50,6 +50,8 @@ static int sonic_open(struct net_device *dev)
+       if (sonic_debug > 2)
+               printk("sonic_open: initializing sonic driver.\n");
+ 
++      spin_lock_init(&lp->lock);
++
+       for (i = 0; i < SONIC_NUM_RRS; i++) {
+               struct sk_buff *skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2);
+               if (skb == NULL) {
+@@ -101,6 +103,24 @@ static int sonic_open(struct net_device *dev)
+       return 0;
+ }
+ 
++/* Wait for the SONIC to become idle. */
++static void sonic_quiesce(struct net_device *dev, u16 mask)
++{
++      struct sonic_local * __maybe_unused lp = netdev_priv(dev);
++      int i;
++      u16 bits;
++
++      for (i = 0; i < 1000; ++i) {
++              bits = SONIC_READ(SONIC_CMD) & mask;
++              if (!bits)
++                      return;
++              if (irqs_disabled() || in_interrupt())
++                      udelay(20);
++              else
++                      usleep_range(100, 200);
++      }
++      WARN_ONCE(1, "command deadline expired! 0x%04x\n", bits);
++}
+ 
+ /*
+  * Close the SONIC device
+@@ -118,6 +138,9 @@ static int sonic_close(struct net_device *dev)
+       /*
+        * stop the SONIC, disable interrupts
+        */
++      SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS);
++      sonic_quiesce(dev, SONIC_CR_ALL);
++
+       SONIC_WRITE(SONIC_IMR, 0);
+       SONIC_WRITE(SONIC_ISR, 0x7fff);
+       SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
+@@ -157,6 +180,9 @@ static void sonic_tx_timeout(struct net_device *dev)
+        * put the Sonic into software-reset mode and
+        * disable all interrupts before releasing DMA buffers
+        */
++      SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS);
++      sonic_quiesce(dev, SONIC_CR_ALL);
++
+       SONIC_WRITE(SONIC_IMR, 0);
+       SONIC_WRITE(SONIC_ISR, 0x7fff);
+       SONIC_WRITE(SONIC_CMD, SONIC_CR_RST);
+@@ -194,8 +220,6 @@ static void sonic_tx_timeout(struct net_device *dev)
+  *   wake the tx queue
+  * Concurrently with all of this, the SONIC is potentially writing to
+  * the status flags of the TDs.
+- * Until some mutual exclusion is added, this code will not work with SMP. 
However,
+- * MIPS Jazz machines and m68k Macs were all uni-processor machines.
+  */
+ 
+ static int sonic_send_packet(struct sk_buff *skb, struct net_device *dev)
+@@ -203,7 +227,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct 
net_device *dev)
+       struct sonic_local *lp = netdev_priv(dev);
+       dma_addr_t laddr;
+       int length;
+-      int entry = lp->next_tx;
++      int entry;
++      unsigned long flags;
+ 
+       if (sonic_debug > 2)
+               printk("sonic_send_packet: skb=%p, dev=%p\n", skb, dev);
+@@ -226,6 +251,10 @@ static int sonic_send_packet(struct sk_buff *skb, struct 
net_device *dev)
+               return NETDEV_TX_OK;
+       }
+ 
++      spin_lock_irqsave(&lp->lock, flags);
++
++      entry = lp->next_tx;
++
+       sonic_tda_put(dev, entry, SONIC_TD_STATUS, 0);       /* clear status */
+       sonic_tda_put(dev, entry, SONIC_TD_FRAG_COUNT, 1);   /* single fragment 
*/
+       sonic_tda_put(dev, entry, SONIC_TD_PKTSIZE, length); /* length of 
packet */
+@@ -235,10 +264,6 @@ static int sonic_send_packet(struct sk_buff *skb, struct 
net_device *dev)
+       sonic_tda_put(dev, entry, SONIC_TD_LINK,
+               sonic_tda_get(dev, entry, SONIC_TD_LINK) | SONIC_EOL);
+ 
+-      /*
+-       * Must set tx_skb[entry] only after clearing status, and
+-       * before clearing EOL and before stopping queue
+-       */
+       wmb();
+       lp->tx_len[entry] = length;
+       lp->tx_laddr[entry] = laddr;
+@@ -263,6 +288,8 @@ static int sonic_send_packet(struct sk_buff *skb, struct 
net_device *dev)
+ 
+       SONIC_WRITE(SONIC_CMD, SONIC_CR_TXP);
+ 
++      spin_unlock_irqrestore(&lp->lock, flags);
++
+       return NETDEV_TX_OK;
+ }
+ 
+@@ -275,9 +302,21 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id)
+       struct net_device *dev = dev_id;
+       struct sonic_local *lp = netdev_priv(dev);
+       int status;
++      unsigned long flags;
++
++      /* The lock has two purposes. Firstly, it synchronizes sonic_interrupt()
++       * with sonic_send_packet() so that the two functions can share state.
++       * Secondly, it makes sonic_interrupt() re-entrant, as that is required
++       * by macsonic which must use two IRQs with different priority levels.
++       */
++      spin_lock_irqsave(&lp->lock, flags);
++
++      status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT;
++      if (!status) {
++              spin_unlock_irqrestore(&lp->lock, flags);
+ 
+-      if (!(status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT))
+               return IRQ_NONE;
++      }
+ 
+       do {
+               if (status & SONIC_INT_PKTRX) {
+@@ -292,11 +331,12 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id)
+                       int td_status;
+                       int freed_some = 0;
+ 
+-                      /* At this point, cur_tx is the index of a TD that is 
one of:
+-                       *   unallocated/freed                          (status 
set   & tx_skb[entry] clear)
+-                       *   allocated and sent                         (status 
set   & tx_skb[entry] set  )
+-                       *   allocated and not yet sent                 (status 
clear & tx_skb[entry] set  )
+-                       *   still being allocated by sonic_send_packet (status 
clear & tx_skb[entry] clear)
++                      /* The state of a Transmit Descriptor may be inferred
++                       * from { tx_skb[entry], td_status } as follows.
++                       * { clear, clear } => the TD has never been used
++                       * { set,   clear } => the TD was handed to SONIC
++                       * { set,   set   } => the TD was handed back
++                       * { clear, set   } => the TD is available for re-use
+                        */
+ 
+                       if (sonic_debug > 2)
+@@ -398,10 +438,30 @@ static irqreturn_t sonic_interrupt(int irq, void *dev_id)
+               /* load CAM done */
+               if (status & SONIC_INT_LCD)
+                       SONIC_WRITE(SONIC_ISR, SONIC_INT_LCD); /* clear the 
interrupt */
+-      } while((status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT));
++
++              status = SONIC_READ(SONIC_ISR) & SONIC_IMR_DEFAULT;
++      } while (status);
++
++      spin_unlock_irqrestore(&lp->lock, flags);
++
+       return IRQ_HANDLED;
+ }
+ 
++/* Return the array index corresponding to a given Receive Buffer pointer. */
++static int index_from_addr(struct sonic_local *lp, dma_addr_t addr,
++                         unsigned int last)
++{
++      unsigned int i = last;
++
++      do {
++              i = (i + 1) & SONIC_RRS_MASK;
++              if (addr == lp->rx_laddr[i])
++                      return i;
++      } while (i != last);
++
++      return -ENOENT;
++}
++
+ /*
+  * We have a good packet(s), pass it/them up the network stack.
+  */
+@@ -421,6 +481,16 @@ static void sonic_rx(struct net_device *dev)
+ 
+               status = sonic_rda_get(dev, entry, SONIC_RD_STATUS);
+               if (status & SONIC_RCR_PRX) {
++                      u32 addr = (sonic_rda_get(dev, entry,
++                                                SONIC_RD_PKTPTR_H) << 16) |
++                                 sonic_rda_get(dev, entry, SONIC_RD_PKTPTR_L);
++                      int i = index_from_addr(lp, addr, entry);
++
++                      if (i < 0) {
++                              WARN_ONCE(1, "failed to find buffer!\n");
++                              break;
++                      }
++
+                       /* Malloc up new buffer. */
+                       new_skb = netdev_alloc_skb(dev, SONIC_RBSIZE + 2);
+                       if (new_skb == NULL) {
+@@ -442,7 +512,7 @@ static void sonic_rx(struct net_device *dev)
+ 
+                       /* now we have a new skb to replace it, pass the used 
one up the stack */
+                       dma_unmap_single(lp->device, lp->rx_laddr[entry], 
SONIC_RBSIZE, DMA_FROM_DEVICE);
+-                      used_skb = lp->rx_skb[entry];
++                      used_skb = lp->rx_skb[i];
+                       pkt_len = sonic_rda_get(dev, entry, SONIC_RD_PKTLEN);
+                       skb_trim(used_skb, pkt_len);
+                       used_skb->protocol = eth_type_trans(used_skb, dev);
+@@ -451,13 +521,13 @@ static void sonic_rx(struct net_device *dev)
+                       lp->stats.rx_bytes += pkt_len;
+ 
+                       /* and insert the new skb */
+-                      lp->rx_laddr[entry] = new_laddr;
+-                      lp->rx_skb[entry] = new_skb;
++                      lp->rx_laddr[i] = new_laddr;
++                      lp->rx_skb[i] = new_skb;
+ 
+                       bufadr_l = (unsigned long)new_laddr & 0xffff;
+                       bufadr_h = (unsigned long)new_laddr >> 16;
+-                      sonic_rra_put(dev, entry, SONIC_RR_BUFADR_L, bufadr_l);
+-                      sonic_rra_put(dev, entry, SONIC_RR_BUFADR_H, bufadr_h);
++                      sonic_rra_put(dev, i, SONIC_RR_BUFADR_L, bufadr_l);
++                      sonic_rra_put(dev, i, SONIC_RR_BUFADR_H, bufadr_h);
+               } else {
+                       /* This should only happen, if we enable accepting 
broken packets. */
+                       lp->stats.rx_errors++;
+@@ -592,6 +662,7 @@ static int sonic_init(struct net_device *dev)
+        */
+       SONIC_WRITE(SONIC_CMD, 0);
+       SONIC_WRITE(SONIC_CMD, SONIC_CR_RXDIS);
++      sonic_quiesce(dev, SONIC_CR_ALL);
+ 
+       /*
+        * initialize the receive resource area
+diff --git a/drivers/net/ethernet/natsemi/sonic.h 
b/drivers/net/ethernet/natsemi/sonic.h
+index 421b1a283fed..7dc011655e70 100644
+--- a/drivers/net/ethernet/natsemi/sonic.h
++++ b/drivers/net/ethernet/natsemi/sonic.h
+@@ -110,6 +110,9 @@
+ #define SONIC_CR_TXP            0x0002
+ #define SONIC_CR_HTX            0x0001
+ 
++#define SONIC_CR_ALL (SONIC_CR_LCAM | SONIC_CR_RRRA | \
++                    SONIC_CR_RXEN | SONIC_CR_TXP)
++
+ /*
+  * SONIC data configuration bits
+  */
+@@ -274,8 +277,9 @@
+ #define SONIC_NUM_RDS   SONIC_NUM_RRS /* number of receive descriptors */
+ #define SONIC_NUM_TDS   16            /* number of transmit descriptors */
+ 
+-#define SONIC_RDS_MASK  (SONIC_NUM_RDS-1)
+-#define SONIC_TDS_MASK  (SONIC_NUM_TDS-1)
++#define SONIC_RRS_MASK  (SONIC_NUM_RRS - 1)
++#define SONIC_RDS_MASK  (SONIC_NUM_RDS - 1)
++#define SONIC_TDS_MASK  (SONIC_NUM_TDS - 1)
+ 
+ #define SONIC_RBSIZE  1520          /* size of one resource buffer */
+ 
+@@ -321,6 +325,7 @@ struct sonic_local {
+       unsigned int next_tx;          /* next free TD */
+       struct device *device;         /* generic device */
+       struct net_device_stats stats;
++      spinlock_t lock;
+ };
+ 
+ #define TX_TIMEOUT (3 * HZ)
+@@ -342,30 +347,30 @@ static void sonic_tx_timeout(struct net_device *dev);
+    as far as we can tell. */
+ /* OpenBSD calls this "SWO".  I'd like to think that sonic_buf_put()
+    is a much better name. */
+-static inline void sonic_buf_put(void* base, int bitmode,
++static inline void sonic_buf_put(u16 *base, int bitmode,
+                                int offset, __u16 val)
+ {
+       if (bitmode)
+ #ifdef __BIG_ENDIAN
+-              ((__u16 *) base + (offset*2))[1] = val;
++              __raw_writew(val, base + (offset * 2) + 1);
+ #else
+-              ((__u16 *) base + (offset*2))[0] = val;
++              __raw_writew(val, base + (offset * 2) + 0);
+ #endif
+       else
+-              ((__u16 *) base)[offset] = val;
++              __raw_writew(val, base + (offset * 1) + 0);
+ }
+ 
+-static inline __u16 sonic_buf_get(void* base, int bitmode,
++static inline __u16 sonic_buf_get(u16 *base, int bitmode,
+                                 int offset)
+ {
+       if (bitmode)
+ #ifdef __BIG_ENDIAN
+-              return ((volatile __u16 *) base + (offset*2))[1];
++              return __raw_readw(base + (offset * 2) + 1);
+ #else
+-              return ((volatile __u16 *) base + (offset*2))[0];
++              return __raw_readw(base + (offset * 2) + 0);
+ #endif
+       else
+-              return ((volatile __u16 *) base)[offset];
++              return __raw_readw(base + (offset * 1) + 0);
+ }
+ 
+ /* Inlines that you should actually use for reading/writing DMA buffers */
+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 4a984b76a60e..db70d4c5778a 100644
+--- a/drivers/net/usb/qmi_wwan.c
++++ b/drivers/net/usb/qmi_wwan.c
+@@ -999,6 +999,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 0083c60f5cdf..a7f9c1886bd4 100644
+--- a/drivers/net/usb/r8152.c
++++ b/drivers/net/usb/r8152.c
+@@ -5244,6 +5244,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);
+@@ -5257,10 +5262,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/wan/sdla.c b/drivers/net/wan/sdla.c
+index 236c62538036..1eb329fc7241 100644
+--- a/drivers/net/wan/sdla.c
++++ b/drivers/net/wan/sdla.c
+@@ -711,7 +711,7 @@ static netdev_tx_t sdla_transmit(struct sk_buff *skb,
+ 
+                                       spin_lock_irqsave(&sdla_lock, flags);
+                                       SDLA_WINDOW(dev, addr);
+-                                      pbuf = (void *)(((int) dev->mem_start) 
+ (addr & SDLA_ADDR_MASK));
++                                      pbuf = (void *)(dev->mem_start + (addr 
& SDLA_ADDR_MASK));
+                                       __sdla_write(dev, pbuf->buf_addr, 
skb->data, skb->len);
+                                       SDLA_WINDOW(dev, addr);
+                                       pbuf->opp_flag = 1;
+diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c 
b/drivers/net/wireless/ath/ath9k/hif_usb.c
+index c5f4dd808745..6f669166c263 100644
+--- a/drivers/net/wireless/ath/ath9k/hif_usb.c
++++ b/drivers/net/wireless/ath/ath9k/hif_usb.c
+@@ -1214,7 +1214,7 @@ err_fw:
+ static int send_eject_command(struct usb_interface *interface)
+ {
+       struct usb_device *udev = interface_to_usbdev(interface);
+-      struct usb_host_interface *iface_desc = &interface->altsetting[0];
++      struct usb_host_interface *iface_desc = interface->cur_altsetting;
+       struct usb_endpoint_descriptor *endpoint;
+       unsigned char *cmd;
+       u8 bulk_out_ep;
+diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c 
b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+index be855aa32154..2eb5fe7367c6 100644
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/usb.c
+@@ -1333,7 +1333,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct 
usb_device_id *id)
+               goto fail;
+       }
+ 
+-      desc = &intf->altsetting[0].desc;
++      desc = &intf->cur_altsetting->desc;
+       if ((desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) ||
+           (desc->bInterfaceSubClass != 2) ||
+           (desc->bInterfaceProtocol != 0xff)) {
+@@ -1346,7 +1346,7 @@ brcmf_usb_probe(struct usb_interface *intf, const struct 
usb_device_id *id)
+ 
+       num_of_eps = desc->bNumEndpoints;
+       for (ep = 0; ep < num_of_eps; ep++) {
+-              endpoint = &intf->altsetting[0].endpoint[ep].desc;
++              endpoint = &intf->cur_altsetting->endpoint[ep].desc;
+               endpoint_num = usb_endpoint_num(endpoint);
+               if (!usb_endpoint_xfer_bulk(endpoint))
+                       continue;
+diff --git a/drivers/net/wireless/cisco/airo.c 
b/drivers/net/wireless/cisco/airo.c
+index fc49255bab00..f3f20abbe269 100644
+--- a/drivers/net/wireless/cisco/airo.c
++++ b/drivers/net/wireless/cisco/airo.c
+@@ -7788,16 +7788,8 @@ static int readrids(struct net_device *dev, 
aironet_ioctl *comp) {
+       case AIROGVLIST:    ridcode = RID_APLIST;       break;
+       case AIROGDRVNAM:   ridcode = RID_DRVNAME;      break;
+       case AIROGEHTENC:   ridcode = RID_ETHERENCAP;   break;
+-      case AIROGWEPKTMP:  ridcode = RID_WEP_TEMP;
+-              /* Only super-user can read WEP keys */
+-              if (!capable(CAP_NET_ADMIN))
+-                      return -EPERM;
+-              break;
+-      case AIROGWEPKNV:   ridcode = RID_WEP_PERM;
+-              /* Only super-user can read WEP keys */
+-              if (!capable(CAP_NET_ADMIN))
+-                      return -EPERM;
+-              break;
++      case AIROGWEPKTMP:  ridcode = RID_WEP_TEMP;     break;
++      case AIROGWEPKNV:   ridcode = RID_WEP_PERM;     break;
+       case AIROGSTAT:     ridcode = RID_STATUS;       break;
+       case AIROGSTATSD32: ridcode = RID_STATSDELTA;   break;
+       case AIROGSTATSC32: ridcode = RID_STATS;        break;
+@@ -7811,7 +7803,13 @@ static int readrids(struct net_device *dev, 
aironet_ioctl *comp) {
+               return -EINVAL;
+       }
+ 
+-      if ((iobuf = kmalloc(RIDSIZE, GFP_KERNEL)) == NULL)
++      if (ridcode == RID_WEP_TEMP || ridcode == RID_WEP_PERM) {
++              /* Only super-user can read WEP keys */
++              if (!capable(CAP_NET_ADMIN))
++                      return -EPERM;
++      }
++
++      if ((iobuf = kzalloc(RIDSIZE, GFP_KERNEL)) == NULL)
+               return -ENOMEM;
+ 
+       PC4500_readrid(ai,ridcode,iobuf,RIDSIZE, 1);
+diff --git a/drivers/net/wireless/intersil/orinoco/orinoco_usb.c 
b/drivers/net/wireless/intersil/orinoco/orinoco_usb.c
+index 56f6e3b71f48..95015d74b1c0 100644
+--- a/drivers/net/wireless/intersil/orinoco/orinoco_usb.c
++++ b/drivers/net/wireless/intersil/orinoco/orinoco_usb.c
+@@ -1613,9 +1613,9 @@ static int ezusb_probe(struct usb_interface *interface,
+       /* set up the endpoint information */
+       /* check out the endpoints */
+ 
+-      iface_desc = &interface->altsetting[0].desc;
++      iface_desc = &interface->cur_altsetting->desc;
+       for (i = 0; i < iface_desc->bNumEndpoints; ++i) {
+-              ep = &interface->altsetting[0].endpoint[i].desc;
++              ep = &interface->cur_altsetting->endpoint[i].desc;
+ 
+               if (usb_endpoint_is_bulk_in(ep)) {
+                       /* we found a bulk in endpoint */
+diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c 
b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+index 73fc5952fd37..63f37fa72e4b 100644
+--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
++++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
+@@ -5921,7 +5921,7 @@ static int rtl8xxxu_parse_usb(struct rtl8xxxu_priv *priv,
+       u8 dir, xtype, num;
+       int ret = 0;
+ 
+-      host_interface = &interface->altsetting[0];
++      host_interface = interface->cur_altsetting;
+       interface_desc = &host_interface->desc;
+       endpoints = interface_desc->bNumEndpoints;
+ 
+diff --git a/drivers/net/wireless/rsi/rsi_91x_hal.c 
b/drivers/net/wireless/rsi/rsi_91x_hal.c
+index 120b0ff545c1..d205947c4c55 100644
+--- a/drivers/net/wireless/rsi/rsi_91x_hal.c
++++ b/drivers/net/wireless/rsi/rsi_91x_hal.c
+@@ -541,6 +541,7 @@ static int bl_cmd(struct rsi_hw *adapter, u8 cmd, u8 
exp_resp, char *str)
+       bl_start_cmd_timer(adapter, timeout);
+       status = bl_write_cmd(adapter, cmd, exp_resp, &regout_val);
+       if (status < 0) {
++              bl_stop_cmd_timer(adapter);
+               rsi_dbg(ERR_ZONE,
+                       "%s: Command %s (%0x) writing failed..\n",
+                       __func__, str, cmd);
+@@ -656,10 +657,9 @@ static int ping_pong_write(struct rsi_hw *adapter, u8 
cmd, u8 *addr, u32 size)
+       }
+ 
+       status = bl_cmd(adapter, cmd_req, cmd_resp, str);
+-      if (status) {
+-              bl_stop_cmd_timer(adapter);
++      if (status)
+               return status;
+-      }
++
+       return 0;
+ }
+ 
+@@ -749,10 +749,9 @@ static int auto_fw_upgrade(struct rsi_hw *adapter, u8 
*flash_content,
+ 
+       status = bl_cmd(adapter, EOF_REACHED, FW_LOADING_SUCCESSFUL,
+                       "EOF_REACHED");
+-      if (status) {
+-              bl_stop_cmd_timer(adapter);
++      if (status)
+               return status;
+-      }
++
+       rsi_dbg(INFO_ZONE, "FW loading is done and FW is running..\n");
+       return 0;
+ }
+@@ -773,6 +772,7 @@ static int rsi_load_firmware(struct rsi_hw *adapter)
+               status = hif_ops->master_reg_read(adapter, SWBL_REGOUT,
+                                             &regout_val, 2);
+               if (status < 0) {
++                      bl_stop_cmd_timer(adapter);
+                       rsi_dbg(ERR_ZONE,
+                               "%s: REGOUT read failed\n", __func__);
+                       return status;
+diff --git a/drivers/net/wireless/rsi/rsi_91x_usb.c 
b/drivers/net/wireless/rsi/rsi_91x_usb.c
+index f90c10b3c921..786a330bc470 100644
+--- a/drivers/net/wireless/rsi/rsi_91x_usb.c
++++ b/drivers/net/wireless/rsi/rsi_91x_usb.c
+@@ -105,7 +105,7 @@ static int rsi_find_bulk_in_and_out_endpoints(struct 
usb_interface *interface,
+       __le16 buffer_size;
+       int ii, bep_found = 0;
+ 
+-      iface_desc = &(interface->altsetting[0]);
++      iface_desc = interface->cur_altsetting;
+ 
+       for (ii = 0; ii < iface_desc->desc.bNumEndpoints; ++ii) {
+               endpoint = &(iface_desc->endpoint[ii].desc);
+diff --git a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c 
b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c
+index c30bf118c67d..1e396eb26ccf 100644
+--- a/drivers/net/wireless/zydas/zd1211rw/zd_usb.c
++++ b/drivers/net/wireless/zydas/zd1211rw/zd_usb.c
+@@ -1272,7 +1272,7 @@ static void print_id(struct usb_device *udev)
+ static int eject_installer(struct usb_interface *intf)
+ {
+       struct usb_device *udev = interface_to_usbdev(intf);
+-      struct usb_host_interface *iface_desc = &intf->altsetting[0];
++      struct usb_host_interface *iface_desc = intf->cur_altsetting;
+       struct usb_endpoint_descriptor *endpoint;
+       unsigned char *cmd;
+       u8 bulk_out_ep;
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 90df085e9f92..e7ed051ec125 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -4019,6 +4019,40 @@ static void quirk_mic_x200_dma_alias(struct pci_dev 
*pdev)
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2260, 
quirk_mic_x200_dma_alias);
+ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2264, 
quirk_mic_x200_dma_alias);
+ 
++/*
++ * Intel Visual Compute Accelerator (VCA) is a family of PCIe add-in devices
++ * exposing computational units via Non Transparent Bridges (NTB, PEX 87xx).
++ *
++ * Similarly to MIC x200, we need to add DMA aliases to allow buffer access
++ * when IOMMU is enabled.  These aliases allow computational unit access to
++ * host memory.  These aliases mark the whole VCA device as one IOMMU
++ * group.
++ *
++ * All possible slot numbers (0x20) are used, since we are unable to tell
++ * what slot is used on other side.  This quirk is intended for both host
++ * and computational unit sides.  The VCA devices have up to five functions
++ * (four for DMA channels and one additional).
++ */
++static void quirk_pex_vca_alias(struct pci_dev *pdev)
++{
++      const unsigned int num_pci_slots = 0x20;
++      unsigned int slot;
++
++      for (slot = 0; slot < num_pci_slots; slot++) {
++              pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x0));
++              pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x1));
++              pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x2));
++              pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x3));
++              pci_add_dma_alias(pdev, PCI_DEVFN(slot, 0x4));
++      }
++}
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2954, quirk_pex_vca_alias);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2955, quirk_pex_vca_alias);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2956, quirk_pex_vca_alias);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2958, quirk_pex_vca_alias);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2959, quirk_pex_vca_alias);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x295A, quirk_pex_vca_alias);
++
+ /*
+  * The IOMMU and interrupt controller on Broadcom Vulcan/Cavium ThunderX2 are
+  * associated not at the root bus, but at a bridge below. This quirk avoids
+diff --git a/drivers/phy/motorola/phy-cpcap-usb.c 
b/drivers/phy/motorola/phy-cpcap-usb.c
+index 4ba3634009af..593c77dbde2e 100644
+--- a/drivers/phy/motorola/phy-cpcap-usb.c
++++ b/drivers/phy/motorola/phy-cpcap-usb.c
+@@ -115,7 +115,7 @@ struct cpcap_usb_ints_state {
+ enum cpcap_gpio_mode {
+       CPCAP_DM_DP,
+       CPCAP_MDM_RX_TX,
+-      CPCAP_UNKNOWN,
++      CPCAP_UNKNOWN_DISABLED, /* Seems to disable USB lines */
+       CPCAP_OTG_DM_DP,
+ };
+ 
+@@ -379,7 +379,8 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata 
*ddata)
+ {
+       int error;
+ 
+-      error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP);
++      /* Disable lines to prevent glitches from waking up mdm6600 */
++      error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED);
+       if (error)
+               goto out_err;
+ 
+@@ -406,6 +407,11 @@ static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata 
*ddata)
+       if (error)
+               goto out_err;
+ 
++      /* Enable UART mode */
++      error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP);
++      if (error)
++              goto out_err;
++
+       return 0;
+ 
+ out_err:
+@@ -418,7 +424,8 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata 
*ddata)
+ {
+       int error;
+ 
+-      error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP);
++      /* Disable lines to prevent glitches from waking up mdm6600 */
++      error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED);
+       if (error)
+               return error;
+ 
+@@ -458,6 +465,11 @@ static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata 
*ddata)
+       if (error)
+               goto out_err;
+ 
++      /* Enable USB mode */
++      error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP);
++      if (error)
++              goto out_err;
++
+       return 0;
+ 
+ out_err:
+diff --git a/drivers/scsi/fnic/fnic_scsi.c b/drivers/scsi/fnic/fnic_scsi.c
+index 242e2ee494a1..d79ac0b24f5a 100644
+--- a/drivers/scsi/fnic/fnic_scsi.c
++++ b/drivers/scsi/fnic/fnic_scsi.c
+@@ -446,6 +446,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 369aef5e7228..651827c6ee6f 100644
+--- a/drivers/soc/ti/wkup_m3_ipc.c
++++ b/drivers/soc/ti/wkup_m3_ipc.c
+@@ -375,6 +375,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);
+ }
+@@ -461,8 +463,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/spi/spi-dw.c b/drivers/spi/spi-dw.c
+index b217c22ff72f..b461200871f8 100644
+--- a/drivers/spi/spi-dw.c
++++ b/drivers/spi/spi-dw.c
+@@ -180,9 +180,11 @@ static inline u32 rx_max(struct dw_spi *dws)
+ 
+ static void dw_writer(struct dw_spi *dws)
+ {
+-      u32 max = tx_max(dws);
++      u32 max;
+       u16 txw = 0;
+ 
++      spin_lock(&dws->buf_lock);
++      max = tx_max(dws);
+       while (max--) {
+               /* Set the tx word if the transfer's original "tx" is not null 
*/
+               if (dws->tx_end - dws->len) {
+@@ -194,13 +196,16 @@ static void dw_writer(struct dw_spi *dws)
+               dw_write_io_reg(dws, DW_SPI_DR, txw);
+               dws->tx += dws->n_bytes;
+       }
++      spin_unlock(&dws->buf_lock);
+ }
+ 
+ static void dw_reader(struct dw_spi *dws)
+ {
+-      u32 max = rx_max(dws);
++      u32 max;
+       u16 rxw;
+ 
++      spin_lock(&dws->buf_lock);
++      max = rx_max(dws);
+       while (max--) {
+               rxw = dw_read_io_reg(dws, DW_SPI_DR);
+               /* Care rx only if the transfer's original "rx" is not null */
+@@ -212,6 +217,7 @@ static void dw_reader(struct dw_spi *dws)
+               }
+               dws->rx += dws->n_bytes;
+       }
++      spin_unlock(&dws->buf_lock);
+ }
+ 
+ static void int_error_stop(struct dw_spi *dws, const char *msg)
+@@ -284,18 +290,20 @@ static int dw_spi_transfer_one(struct spi_master *master,
+ {
+       struct dw_spi *dws = spi_master_get_devdata(master);
+       struct chip_data *chip = spi_get_ctldata(spi);
++      unsigned long flags;
+       u8 imask = 0;
+       u16 txlevel = 0;
+       u32 cr0;
+       int ret;
+ 
+       dws->dma_mapped = 0;
+-
++      spin_lock_irqsave(&dws->buf_lock, flags);
+       dws->tx = (void *)transfer->tx_buf;
+       dws->tx_end = dws->tx + transfer->len;
+       dws->rx = transfer->rx_buf;
+       dws->rx_end = dws->rx + transfer->len;
+       dws->len = transfer->len;
++      spin_unlock_irqrestore(&dws->buf_lock, flags);
+ 
+       spi_enable_chip(dws, 0);
+ 
+@@ -486,6 +494,7 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
+       dws->type = SSI_MOTO_SPI;
+       dws->dma_inited = 0;
+       dws->dma_addr = (dma_addr_t)(dws->paddr + DW_SPI_DR);
++      spin_lock_init(&dws->buf_lock);
+ 
+       ret = request_irq(dws->irq, dw_spi_irq, IRQF_SHARED, dev_name(dev),
+                         master);
+diff --git a/drivers/spi/spi-dw.h b/drivers/spi/spi-dw.h
+index 5c07cf8f19e0..45fbf3ad591c 100644
+--- a/drivers/spi/spi-dw.h
++++ b/drivers/spi/spi-dw.h
+@@ -117,6 +117,7 @@ struct dw_spi {
+       size_t                  len;
+       void                    *tx;
+       void                    *tx_end;
++      spinlock_t              buf_lock;
+       void                    *rx;
+       void                    *rx_end;
+       int                     dma_mapped;
+diff --git a/drivers/staging/most/aim-network/networking.c 
b/drivers/staging/most/aim-network/networking.c
+index 936f013c350e..6398c27563c9 100644
+--- a/drivers/staging/most/aim-network/networking.c
++++ b/drivers/staging/most/aim-network/networking.c
+@@ -85,6 +85,11 @@ static int skb_to_mamac(const struct sk_buff *skb, struct 
mbo *mbo)
+       unsigned int payload_len = skb->len - ETH_HLEN;
+       unsigned int mdp_len = payload_len + MDP_HDR_LEN;
+ 
++      if (mdp_len < skb->len) {
++              pr_err("drop: too large packet! (%u)\n", skb->len);
++              return -EINVAL;
++      }
++
+       if (mbo->buffer_length < mdp_len) {
+               pr_err("drop: too small buffer! (%d for %d)\n",
+                      mbo->buffer_length, mdp_len);
+@@ -132,6 +137,11 @@ static int skb_to_mep(const struct sk_buff *skb, struct 
mbo *mbo)
+       u8 *buff = mbo->virt_address;
+       unsigned int mep_len = skb->len + MEP_HDR_LEN;
+ 
++      if (mep_len < skb->len) {
++              pr_err("drop: too large packet! (%u)\n", skb->len);
++              return -EINVAL;
++      }
++
+       if (mbo->buffer_length < mep_len) {
+               pr_err("drop: too small buffer! (%d for %d)\n",
+                      mbo->buffer_length, mep_len);
+diff --git a/drivers/staging/vt6656/device.h b/drivers/staging/vt6656/device.h
+index 705fffa59da9..41a4f9555d07 100644
+--- a/drivers/staging/vt6656/device.h
++++ b/drivers/staging/vt6656/device.h
+@@ -62,6 +62,8 @@
+ #define RATE_AUTO     12
+ 
+ #define MAX_RATE                      12
++#define VNT_B_RATES   (BIT(RATE_1M) | BIT(RATE_2M) |\
++                      BIT(RATE_5M) | BIT(RATE_11M))
+ 
+ /*
+  * device specific
+diff --git a/drivers/staging/vt6656/int.c b/drivers/staging/vt6656/int.c
+index c6ffbe0e2728..c521729c4192 100644
+--- a/drivers/staging/vt6656/int.c
++++ b/drivers/staging/vt6656/int.c
+@@ -107,9 +107,11 @@ static int vnt_int_report_rate(struct vnt_private *priv, 
u8 pkt_no, u8 tsr)
+ 
+       info->status.rates[0].count = tx_retry;
+ 
+-      if (!(tsr & (TSR_TMO | TSR_RETRYTMO))) {
++      if (!(tsr & TSR_TMO)) {
+               info->status.rates[0].idx = idx;
+-              info->flags |= IEEE80211_TX_STAT_ACK;
++
++              if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
++                      info->flags |= IEEE80211_TX_STAT_ACK;
+       }
+ 
+       ieee80211_tx_status_irqsafe(priv->hw, context->skb);
+diff --git a/drivers/staging/vt6656/main_usb.c 
b/drivers/staging/vt6656/main_usb.c
+index 645ea16b53d5..e8ccd800c94f 100644
+--- a/drivers/staging/vt6656/main_usb.c
++++ b/drivers/staging/vt6656/main_usb.c
+@@ -977,6 +977,7 @@ vt6656_probe(struct usb_interface *intf, const struct 
usb_device_id *id)
+       ieee80211_hw_set(priv->hw, RX_INCLUDES_FCS);
+       ieee80211_hw_set(priv->hw, REPORTS_TX_ACK_STATUS);
+       ieee80211_hw_set(priv->hw, SUPPORTS_PS);
++      ieee80211_hw_set(priv->hw, PS_NULLFUNC_STACK);
+ 
+       priv->hw->max_signal = 100;
+ 
+diff --git a/drivers/staging/vt6656/rxtx.c b/drivers/staging/vt6656/rxtx.c
+index a44abcce6fb4..f78f31ce6443 100644
+--- a/drivers/staging/vt6656/rxtx.c
++++ b/drivers/staging/vt6656/rxtx.c
+@@ -288,11 +288,9 @@ static u16 vnt_rxtx_datahead_g(struct 
vnt_usb_send_context *tx_context,
+                         PK_TYPE_11B, &buf->b);
+ 
+       /* Get Duration and TimeStamp */
+-      if (ieee80211_is_pspoll(hdr->frame_control)) {
+-              __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15));
+-
+-              buf->duration_a = dur;
+-              buf->duration_b = dur;
++      if (ieee80211_is_nullfunc(hdr->frame_control)) {
++              buf->duration_a = hdr->duration_id;
++              buf->duration_b = hdr->duration_id;
+       } else {
+               buf->duration_a = vnt_get_duration_le(priv,
+                                               tx_context->pkt_type, need_ack);
+@@ -381,10 +379,8 @@ static u16 vnt_rxtx_datahead_ab(struct 
vnt_usb_send_context *tx_context,
+                         tx_context->pkt_type, &buf->ab);
+ 
+       /* Get Duration and TimeStampOff */
+-      if (ieee80211_is_pspoll(hdr->frame_control)) {
+-              __le16 dur = cpu_to_le16(priv->current_aid | BIT(14) | BIT(15));
+-
+-              buf->duration = dur;
++      if (ieee80211_is_nullfunc(hdr->frame_control)) {
++              buf->duration = hdr->duration_id;
+       } else {
+               buf->duration = vnt_get_duration_le(priv, tx_context->pkt_type,
+                                                   need_ack);
+@@ -825,10 +821,14 @@ int vnt_tx_packet(struct vnt_private *priv, struct 
sk_buff *skb)
+               if (info->band == NL80211_BAND_5GHZ) {
+                       pkt_type = PK_TYPE_11A;
+               } else {
+-                      if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT)
+-                              pkt_type = PK_TYPE_11GB;
+-                      else
+-                              pkt_type = PK_TYPE_11GA;
++                      if (tx_rate->flags & IEEE80211_TX_RC_USE_CTS_PROTECT) {
++                              if (priv->basic_rates & VNT_B_RATES)
++                                      pkt_type = PK_TYPE_11GB;
++                              else
++                                      pkt_type = PK_TYPE_11GA;
++                      } else {
++                              pkt_type = PK_TYPE_11A;
++                      }
+               }
+       } else {
+               pkt_type = PK_TYPE_11B;
+diff --git a/drivers/staging/wlan-ng/prism2mgmt.c 
b/drivers/staging/wlan-ng/prism2mgmt.c
+index c4aa9e7e7003..be89a0ee44bf 100644
+--- a/drivers/staging/wlan-ng/prism2mgmt.c
++++ b/drivers/staging/wlan-ng/prism2mgmt.c
+@@ -945,7 +945,7 @@ int prism2mgmt_flashdl_state(struct wlandevice *wlandev, 
void *msgp)
+               }
+       }
+ 
+-      return 0;
++      return result;
+ }
+ 
+ /*----------------------------------------------------------------
+diff --git a/drivers/tee/optee/Kconfig b/drivers/tee/optee/Kconfig
+index 0126de898036..108600c6eb56 100644
+--- a/drivers/tee/optee/Kconfig
++++ b/drivers/tee/optee/Kconfig
+@@ -2,6 +2,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/drivers/tty/serial/8250/8250_bcm2835aux.c 
b/drivers/tty/serial/8250/8250_bcm2835aux.c
+index a23c7da42ea8..7bbcae75e651 100644
+--- a/drivers/tty/serial/8250/8250_bcm2835aux.c
++++ b/drivers/tty/serial/8250/8250_bcm2835aux.c
+@@ -119,7 +119,7 @@ static int bcm2835aux_serial_remove(struct platform_device 
*pdev)
+ {
+       struct bcm2835aux_data *data = platform_get_drvdata(pdev);
+ 
+-      serial8250_unregister_port(data->uart.port.line);
++      serial8250_unregister_port(data->line);
+       clk_disable_unprepare(data->clk);
+ 
+       return 0;
+diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
+index a497b878c3e2..021899c58028 100644
+--- a/drivers/usb/dwc3/core.c
++++ b/drivers/usb/dwc3/core.c
+@@ -1031,6 +1031,9 @@ static void dwc3_core_exit_mode(struct dwc3 *dwc)
+               /* do nothing */
+               break;
+       }
++
++      /* de-assert DRVVBUS for HOST and OTG mode */
++      dwc3_set_prtcap(dwc, DWC3_GCTL_PRTCAP_DEVICE);
+ }
+ 
+ static void dwc3_get_properties(struct dwc3 *dwc)
+diff --git a/drivers/usb/serial/ir-usb.c b/drivers/usb/serial/ir-usb.c
+index f9734a96d516..a3e3b4703f38 100644
+--- a/drivers/usb/serial/ir-usb.c
++++ b/drivers/usb/serial/ir-usb.c
+@@ -49,9 +49,10 @@ static int buffer_size;
+ static int xbof = -1;
+ 
+ static int  ir_startup (struct usb_serial *serial);
+-static int  ir_open(struct tty_struct *tty, struct usb_serial_port *port);
+-static int ir_prepare_write_buffer(struct usb_serial_port *port,
+-                                              void *dest, size_t size);
++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port,
++              const unsigned char *buf, int count);
++static int ir_write_room(struct tty_struct *tty);
++static void ir_write_bulk_callback(struct urb *urb);
+ static void ir_process_read_urb(struct urb *urb);
+ static void ir_set_termios(struct tty_struct *tty,
+               struct usb_serial_port *port, struct ktermios *old_termios);
+@@ -81,8 +82,9 @@ static struct usb_serial_driver ir_device = {
+       .num_ports              = 1,
+       .set_termios            = ir_set_termios,
+       .attach                 = ir_startup,
+-      .open                   = ir_open,
+-      .prepare_write_buffer   = ir_prepare_write_buffer,
++      .write                  = ir_write,
++      .write_room             = ir_write_room,
++      .write_bulk_callback    = ir_write_bulk_callback,
+       .process_read_urb       = ir_process_read_urb,
+ };
+ 
+@@ -199,6 +201,9 @@ static int ir_startup(struct usb_serial *serial)
+       struct usb_irda_cs_descriptor *irda_desc;
+       int rates;
+ 
++      if (serial->num_bulk_in < 1 || serial->num_bulk_out < 1)
++              return -ENODEV;
++
+       irda_desc = irda_usb_find_class_desc(serial, 0);
+       if (!irda_desc) {
+               dev_err(&serial->dev->dev,
+@@ -255,35 +260,102 @@ static int ir_startup(struct usb_serial *serial)
+       return 0;
+ }
+ 
+-static int ir_open(struct tty_struct *tty, struct usb_serial_port *port)
++static int ir_write(struct tty_struct *tty, struct usb_serial_port *port,
++              const unsigned char *buf, int count)
+ {
+-      int i;
++      struct urb *urb = NULL;
++      unsigned long flags;
++      int ret;
+ 
+-      for (i = 0; i < ARRAY_SIZE(port->write_urbs); ++i)
+-              port->write_urbs[i]->transfer_flags = URB_ZERO_PACKET;
++      if (port->bulk_out_size == 0)
++              return -EINVAL;
+ 
+-      /* Start reading from the device */
+-      return usb_serial_generic_open(tty, port);
+-}
++      if (count == 0)
++              return 0;
+ 
+-static int ir_prepare_write_buffer(struct usb_serial_port *port,
+-                                              void *dest, size_t size)
+-{
+-      unsigned char *buf = dest;
+-      int count;
++      count = min(count, port->bulk_out_size - 1);
++
++      spin_lock_irqsave(&port->lock, flags);
++      if (__test_and_clear_bit(0, &port->write_urbs_free)) {
++              urb = port->write_urbs[0];
++              port->tx_bytes += count;
++      }
++      spin_unlock_irqrestore(&port->lock, flags);
++
++      if (!urb)
++              return 0;
+ 
+       /*
+        * The first byte of the packet we send to the device contains an
+-       * inbound header which indicates an additional number of BOFs and
++       * outbound header which indicates an additional number of BOFs and
+        * a baud rate change.
+        *
+        * See section 5.4.2.2 of the USB IrDA spec.
+        */
+-      *buf = ir_xbof | ir_baud;
++      *(u8 *)urb->transfer_buffer = ir_xbof | ir_baud;
++
++      memcpy(urb->transfer_buffer + 1, buf, count);
++
++      urb->transfer_buffer_length = count + 1;
++      urb->transfer_flags = URB_ZERO_PACKET;
++
++      ret = usb_submit_urb(urb, GFP_ATOMIC);
++      if (ret) {
++              dev_err(&port->dev, "failed to submit write urb: %d\n", ret);
++
++              spin_lock_irqsave(&port->lock, flags);
++              __set_bit(0, &port->write_urbs_free);
++              port->tx_bytes -= count;
++              spin_unlock_irqrestore(&port->lock, flags);
++
++              return ret;
++      }
++
++      return count;
++}
++
++static void ir_write_bulk_callback(struct urb *urb)
++{
++      struct usb_serial_port *port = urb->context;
++      int status = urb->status;
++      unsigned long flags;
++
++      spin_lock_irqsave(&port->lock, flags);
++      __set_bit(0, &port->write_urbs_free);
++      port->tx_bytes -= urb->transfer_buffer_length - 1;
++      spin_unlock_irqrestore(&port->lock, flags);
++
++      switch (status) {
++      case 0:
++              break;
++      case -ENOENT:
++      case -ECONNRESET:
++      case -ESHUTDOWN:
++              dev_dbg(&port->dev, "write urb stopped: %d\n", status);
++              return;
++      case -EPIPE:
++              dev_err(&port->dev, "write urb stopped: %d\n", status);
++              return;
++      default:
++              dev_err(&port->dev, "nonzero write-urb status: %d\n", status);
++              break;
++      }
++
++      usb_serial_port_softint(port);
++}
++
++static int ir_write_room(struct tty_struct *tty)
++{
++      struct usb_serial_port *port = tty->driver_data;
++      int count = 0;
++
++      if (port->bulk_out_size == 0)
++              return 0;
++
++      if (test_bit(0, &port->write_urbs_free))
++              count = port->bulk_out_size - 1;
+ 
+-      count = kfifo_out_locked(&port->write_fifo, buf + 1, size - 1,
+-                                                              &port->lock);
+-      return count + 1;
++      return count;
+ }
+ 
+ static void ir_process_read_urb(struct urb *urb)
+@@ -336,34 +408,34 @@ static void ir_set_termios(struct tty_struct *tty,
+ 
+       switch (baud) {
+       case 2400:
+-              ir_baud = USB_IRDA_BR_2400;
++              ir_baud = USB_IRDA_LS_2400;
+               break;
+       case 9600:
+-              ir_baud = USB_IRDA_BR_9600;
++              ir_baud = USB_IRDA_LS_9600;
+               break;
+       case 19200:
+-              ir_baud = USB_IRDA_BR_19200;
++              ir_baud = USB_IRDA_LS_19200;
+               break;
+       case 38400:
+-              ir_baud = USB_IRDA_BR_38400;
++              ir_baud = USB_IRDA_LS_38400;
+               break;
+       case 57600:
+-              ir_baud = USB_IRDA_BR_57600;
++              ir_baud = USB_IRDA_LS_57600;
+               break;
+       case 115200:
+-              ir_baud = USB_IRDA_BR_115200;
++              ir_baud = USB_IRDA_LS_115200;
+               break;
+       case 576000:
+-              ir_baud = USB_IRDA_BR_576000;
++              ir_baud = USB_IRDA_LS_576000;
+               break;
+       case 1152000:
+-              ir_baud = USB_IRDA_BR_1152000;
++              ir_baud = USB_IRDA_LS_1152000;
+               break;
+       case 4000000:
+-              ir_baud = USB_IRDA_BR_4000000;
++              ir_baud = USB_IRDA_LS_4000000;
+               break;
+       default:
+-              ir_baud = USB_IRDA_BR_9600;
++              ir_baud = USB_IRDA_LS_9600;
+               baud = 9600;
+       }
+ 
+diff --git a/drivers/usb/storage/unusual_uas.h 
b/drivers/usb/storage/unusual_uas.h
+index f15aa47c54a9..0eb8c67ee138 100644
+--- a/drivers/usb/storage/unusual_uas.h
++++ b/drivers/usb/storage/unusual_uas.h
+@@ -163,12 +163,15 @@ UNUSUAL_DEV(0x2537, 0x1068, 0x0000, 0x9999,
+               USB_SC_DEVICE, USB_PR_DEVICE, NULL,
+               US_FL_IGNORE_UAS),
+ 
+-/* Reported-by: Takeo Nakayama <[email protected]> */
++/*
++ * Initially Reported-by: Takeo Nakayama <[email protected]>
++ * UAS Ignore Reported by Steven Ellis <[email protected]>
++ */
+ UNUSUAL_DEV(0x357d, 0x7788, 0x0000, 0x9999,
+               "JMicron",
+               "JMS566",
+               USB_SC_DEVICE, USB_PR_DEVICE, NULL,
+-              US_FL_NO_REPORT_OPCODES),
++              US_FL_NO_REPORT_OPCODES | US_FL_IGNORE_UAS),
+ 
+ /* Reported-by: Hans de Goede <[email protected]> */
+ UNUSUAL_DEV(0x4971, 0x1012, 0x0000, 0x9999,
+diff --git a/drivers/watchdog/Kconfig b/drivers/watchdog/Kconfig
+index f55328a31629..fa15a683ae2d 100644
+--- a/drivers/watchdog/Kconfig
++++ b/drivers/watchdog/Kconfig
+@@ -563,6 +563,7 @@ config MAX63XX_WATCHDOG
+ config MAX77620_WATCHDOG
+       tristate "Maxim Max77620 Watchdog Timer"
+       depends on MFD_MAX77620 || COMPILE_TEST
++      select WATCHDOG_CORE
+       help
+        This is the driver for the Max77620 watchdog timer.
+        Say 'Y' here to enable the watchdog timer support for
+diff --git a/drivers/watchdog/rn5t618_wdt.c b/drivers/watchdog/rn5t618_wdt.c
+index e60f55702ab7..d2e79cf70e77 100644
+--- a/drivers/watchdog/rn5t618_wdt.c
++++ b/drivers/watchdog/rn5t618_wdt.c
+@@ -193,6 +193,7 @@ static struct platform_driver rn5t618_wdt_driver = {
+ 
+ module_platform_driver(rn5t618_wdt_driver);
+ 
++MODULE_ALIAS("platform:rn5t618-wdt");
+ MODULE_AUTHOR("Beniamino Galvani <[email protected]>");
+ MODULE_DESCRIPTION("RN5T618 watchdog driver");
+ MODULE_LICENSE("GPL v2");
+diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
+index 204d585e012a..3ab79fa00dc7 100644
+--- a/fs/btrfs/super.c
++++ b/fs/btrfs/super.c
+@@ -2114,7 +2114,15 @@ static int btrfs_statfs(struct dentry *dentry, struct 
kstatfs *buf)
+        */
+       thresh = 4 * 1024 * 1024;
+ 
+-      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/ext4/super.c b/fs/ext4/super.c
+index 1a0a56647974..93d8aa6ef661 100644
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -1782,6 +1782,13 @@ static int handle_mount_opt(struct super_block *sb, 
char *opt, int token,
+                       arg = JBD2_DEFAULT_MAX_COMMIT_AGE;
+               sbi->s_commit_interval = HZ * arg;
+       } else if (token == Opt_debug_want_extra_isize) {
++              if ((arg & 1) ||
++                  (arg < 4) ||
++                  (arg > (sbi->s_inode_size - EXT4_GOOD_OLD_INODE_SIZE))) {
++                      ext4_msg(sb, KERN_ERR,
++                               "Invalid want_extra_isize %d", arg);
++                      return -1;
++              }
+               sbi->s_want_extra_isize = arg;
+       } else if (token == Opt_max_batch_time) {
+               sbi->s_max_batch_time = arg;
+@@ -3454,40 +3461,6 @@ int ext4_calculate_overhead(struct super_block *sb)
+       return 0;
+ }
+ 
+-static void ext4_clamp_want_extra_isize(struct super_block *sb)
+-{
+-      struct ext4_sb_info *sbi = EXT4_SB(sb);
+-      struct ext4_super_block *es = sbi->s_es;
+-      unsigned def_extra_isize = sizeof(struct ext4_inode) -
+-                                              EXT4_GOOD_OLD_INODE_SIZE;
+-
+-      if (sbi->s_inode_size == EXT4_GOOD_OLD_INODE_SIZE) {
+-              sbi->s_want_extra_isize = 0;
+-              return;
+-      }
+-      if (sbi->s_want_extra_isize < 4) {
+-              sbi->s_want_extra_isize = def_extra_isize;
+-              if (ext4_has_feature_extra_isize(sb)) {
+-                      if (sbi->s_want_extra_isize <
+-                          le16_to_cpu(es->s_want_extra_isize))
+-                              sbi->s_want_extra_isize =
+-                                      le16_to_cpu(es->s_want_extra_isize);
+-                      if (sbi->s_want_extra_isize <
+-                          le16_to_cpu(es->s_min_extra_isize))
+-                              sbi->s_want_extra_isize =
+-                                      le16_to_cpu(es->s_min_extra_isize);
+-              }
+-      }
+-      /* Check if enough inode space is available */
+-      if ((sbi->s_want_extra_isize > sbi->s_inode_size) ||
+-          (EXT4_GOOD_OLD_INODE_SIZE + sbi->s_want_extra_isize >
+-                                                      sbi->s_inode_size)) {
+-              sbi->s_want_extra_isize = def_extra_isize;
+-              ext4_msg(sb, KERN_INFO,
+-                       "required extra inode space not available");
+-      }
+-}
+-
+ static void ext4_set_resv_clusters(struct super_block *sb)
+ {
+       ext4_fsblk_t resv_clusters;
+@@ -3695,6 +3668,65 @@ static int ext4_fill_super(struct super_block *sb, void 
*data, int silent)
+        */
+       sbi->s_li_wait_mult = EXT4_DEF_LI_WAIT_MULT;
+ 
++      if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) {
++              sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE;
++              sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO;
++      } else {
++              sbi->s_inode_size = le16_to_cpu(es->s_inode_size);
++              sbi->s_first_ino = le32_to_cpu(es->s_first_ino);
++              if (sbi->s_first_ino < EXT4_GOOD_OLD_FIRST_INO) {
++                      ext4_msg(sb, KERN_ERR, "invalid first ino: %u",
++                               sbi->s_first_ino);
++                      goto failed_mount;
++              }
++              if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) ||
++                  (!is_power_of_2(sbi->s_inode_size)) ||
++                  (sbi->s_inode_size > blocksize)) {
++                      ext4_msg(sb, KERN_ERR,
++                             "unsupported inode size: %d",
++                             sbi->s_inode_size);
++                      goto failed_mount;
++              }
++              /*
++               * i_atime_extra is the last extra field available for
++               * [acm]times in struct ext4_inode. Checking for that
++               * field should suffice to ensure we have extra space
++               * for all three.
++               */
++              if (sbi->s_inode_size >= offsetof(struct ext4_inode, 
i_atime_extra) +
++                      sizeof(((struct ext4_inode *)0)->i_atime_extra)) {
++                      sb->s_time_gran = 1;
++              } else {
++                      sb->s_time_gran = NSEC_PER_SEC;
++              }
++      }
++      if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE) {
++              sbi->s_want_extra_isize = sizeof(struct ext4_inode) -
++                      EXT4_GOOD_OLD_INODE_SIZE;
++              if (ext4_has_feature_extra_isize(sb)) {
++                      unsigned v, max = (sbi->s_inode_size -
++                                         EXT4_GOOD_OLD_INODE_SIZE);
++
++                      v = le16_to_cpu(es->s_want_extra_isize);
++                      if (v > max) {
++                              ext4_msg(sb, KERN_ERR,
++                                       "bad s_want_extra_isize: %d", v);
++                              goto failed_mount;
++                      }
++                      if (sbi->s_want_extra_isize < v)
++                              sbi->s_want_extra_isize = v;
++
++                      v = le16_to_cpu(es->s_min_extra_isize);
++                      if (v > max) {
++                              ext4_msg(sb, KERN_ERR,
++                                       "bad s_min_extra_isize: %d", v);
++                              goto failed_mount;
++                      }
++                      if (sbi->s_want_extra_isize < v)
++                              sbi->s_want_extra_isize = v;
++              }
++      }
++
+       if (sbi->s_es->s_mount_opts[0]) {
+               char *s_mount_opts = kstrndup(sbi->s_es->s_mount_opts,
+                                             sizeof(sbi->s_es->s_mount_opts),
+@@ -3893,29 +3925,6 @@ static int ext4_fill_super(struct super_block *sb, void 
*data, int silent)
+                                                     has_huge_files);
+       sb->s_maxbytes = ext4_max_size(sb->s_blocksize_bits, has_huge_files);
+ 
+-      if (le32_to_cpu(es->s_rev_level) == EXT4_GOOD_OLD_REV) {
+-              sbi->s_inode_size = EXT4_GOOD_OLD_INODE_SIZE;
+-              sbi->s_first_ino = EXT4_GOOD_OLD_FIRST_INO;
+-      } else {
+-              sbi->s_inode_size = le16_to_cpu(es->s_inode_size);
+-              sbi->s_first_ino = le32_to_cpu(es->s_first_ino);
+-              if (sbi->s_first_ino < EXT4_GOOD_OLD_FIRST_INO) {
+-                      ext4_msg(sb, KERN_ERR, "invalid first ino: %u",
+-                               sbi->s_first_ino);
+-                      goto failed_mount;
+-              }
+-              if ((sbi->s_inode_size < EXT4_GOOD_OLD_INODE_SIZE) ||
+-                  (!is_power_of_2(sbi->s_inode_size)) ||
+-                  (sbi->s_inode_size > blocksize)) {
+-                      ext4_msg(sb, KERN_ERR,
+-                             "unsupported inode size: %d",
+-                             sbi->s_inode_size);
+-                      goto failed_mount;
+-              }
+-              if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE)
+-                      sb->s_time_gran = 1 << (EXT4_EPOCH_BITS - 2);
+-      }
+-
+       sbi->s_desc_size = le16_to_cpu(es->s_desc_size);
+       if (ext4_has_feature_64bit(sb)) {
+               if (sbi->s_desc_size < EXT4_MIN_DESC_SIZE_64BIT ||
+@@ -4354,8 +4363,6 @@ no_journal:
+       if (ext4_setup_super(sb, es, sb_rdonly(sb)))
+               sb->s_flags |= MS_RDONLY;
+ 
+-      ext4_clamp_want_extra_isize(sb);
+-
+       ext4_set_resv_clusters(sb);
+ 
+       err = ext4_setup_system_zone(sb);
+@@ -5139,8 +5146,6 @@ static int ext4_remount(struct super_block *sb, int 
*flags, char *data)
+               goto restore_opts;
+       }
+ 
+-      ext4_clamp_want_extra_isize(sb);
+-
+       if ((old_opts.s_mount_opt & EXT4_MOUNT_JOURNAL_CHECKSUM) ^
+           test_opt(sb, JOURNAL_CHECKSUM)) {
+               ext4_msg(sb, KERN_ERR, "changing journal_checksum "
+diff --git a/fs/namei.c b/fs/namei.c
+index d648d6d2b635..f421f8d80f4d 100644
+--- a/fs/namei.c
++++ b/fs/namei.c
+@@ -3266,8 +3266,8 @@ static int do_last(struct nameidata *nd,
+                  int *opened)
+ {
+       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 cc0b22c72e83..5208d85dd30c 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;
+ }
+@@ -2243,6 +2244,7 @@ error_unlocked:
+                       kfree(qf_names[j]);
+       }
+ #endif
++      kfree(sbi->s_jdev);
+       kfree(sbi);
+ 
+       s->s_fs_info = NULL;
+diff --git a/include/linux/usb/irda.h b/include/linux/usb/irda.h
+index 396d2b043e64..556a801efce3 100644
+--- a/include/linux/usb/irda.h
++++ b/include/linux/usb/irda.h
+@@ -119,11 +119,22 @@ struct usb_irda_cs_descriptor {
+  * 6 - 115200 bps
+  * 7 - 576000 bps
+  * 8 - 1.152 Mbps
+- * 9 - 5 mbps
++ * 9 - 4 Mbps
+  * 10..15 - Reserved
+  */
+ #define USB_IRDA_STATUS_LINK_SPEED    0x0f
+ 
++#define USB_IRDA_LS_NO_CHANGE         0
++#define USB_IRDA_LS_2400              1
++#define USB_IRDA_LS_9600              2
++#define USB_IRDA_LS_19200             3
++#define USB_IRDA_LS_38400             4
++#define USB_IRDA_LS_57600             5
++#define USB_IRDA_LS_115200            6
++#define USB_IRDA_LS_576000            7
++#define USB_IRDA_LS_1152000           8
++#define USB_IRDA_LS_4000000           9
++
+ /* The following is a 4-bit value used only for
+  * outbound header:
+  *
+diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h
+index a4c8e9d7dd06..030eea38f258 100644
+--- a/include/net/cfg80211.h
++++ b/include/net/cfg80211.h
+@@ -2843,6 +2843,9 @@ struct cfg80211_pmk_conf {
+  *
+  * @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.
+@@ -3148,6 +3151,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 2c57030f54aa..829943aad7be 100644
+--- a/kernel/cgroup/cgroup.c
++++ b/kernel/cgroup/cgroup.c
+@@ -2884,8 +2884,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;
+ 
+@@ -2895,6 +2893,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)
+@@ -2930,11 +2930,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);
+@@ -3221,7 +3221,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/mm/mempolicy.c b/mm/mempolicy.c
+index a37cfa88669e..1b34f2e35951 100644
+--- a/mm/mempolicy.c
++++ b/mm/mempolicy.c
+@@ -2724,6 +2724,9 @@ int mpol_parse_str(char *str, struct mempolicy **mpol)
+       char *flags = strchr(str, '=');
+       int err = 1;
+ 
++      if (flags)
++              *flags++ = '\0';        /* terminate mode string */
++
+       if (nodelist) {
+               /* NUL-terminate mode or flags string */
+               *nodelist++ = '\0';
+@@ -2734,9 +2737,6 @@ int mpol_parse_str(char *str, struct mempolicy **mpol)
+       } else
+               nodes_clear(nodes);
+ 
+-      if (flags)
+-              *flags++ = '\0';        /* terminate mode string */
+-
+       for (mode = 0; mode < MPOL_MAX; mode++) {
+               if (!strcmp(str, policy_modes[mode])) {
+                       break;
+diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
+index 4a05235929b9..93093d7c3824 100644
+--- a/net/bluetooth/hci_sock.c
++++ b/net/bluetooth/hci_sock.c
+@@ -826,6 +826,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);
+@@ -873,6 +875,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/utils.c b/net/core/utils.c
+index 93066bd0305a..b1823e76b877 100644
+--- a/net/core/utils.c
++++ b/net/core/utils.c
+@@ -419,6 +419,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)
+@@ -430,9 +447,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 08c15dd42d93..59384ffe89f7 100644
+--- a/net/ipv4/ip_vti.c
++++ b/net/ipv4/ip_vti.c
+@@ -208,8 +208,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 557fe3880a3f..396a0f61f5f8 100644
+--- a/net/ipv6/ip6_vti.c
++++ b/net/ipv6/ip6_vti.c
+@@ -453,8 +453,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 d437007b15bb..b1484b8316e8 100644
+--- a/net/mac80211/cfg.c
++++ b/net/mac80211/cfg.c
+@@ -2800,6 +2800,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)
+ {
+@@ -3730,6 +3752,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 fab0764c315f..994dde6e5f9d 100644
+--- a/net/mac80211/mesh_hwmp.c
++++ b/net/mac80211/mesh_hwmp.c
+@@ -326,6 +326,9 @@ static 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 b3622823bad2..ebd66e8f46b3 100644
+--- a/net/mac80211/tkip.c
++++ b/net/mac80211/tkip.c
+@@ -266,9 +266,21 @@ int ieee80211_tkip_decrypt_data(struct crypto_cipher *tfm,
+       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/sched/ematch.c b/net/sched/ematch.c
+index 60f2354c1789..a48dca26f178 100644
+--- a/net/sched/ematch.c
++++ b/net/sched/ematch.c
+@@ -242,6 +242,9 @@ static int tcf_em_validate(struct tcf_proto *tp,
+                       goto errout;
+ 
+               if (em->ops->change) {
++                      err = -EINVAL;
++                      if (em_hdr->flags & TCF_EM_SIMPLE)
++                              goto errout;
+                       err = em->ops->change(net, data, data_len, em);
+                       if (err < 0)
+                               goto errout;
+diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h
+index 249919bdfc64..4077bb3af440 100644
+--- a/net/wireless/rdev-ops.h
++++ b/net/wireless/rdev-ops.h
+@@ -1143,6 +1143,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 804eac073b6b..a520f433d476 100644
+--- a/net/wireless/reg.c
++++ b/net/wireless/reg.c
+@@ -1718,14 +1718,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))
+@@ -1781,8 +1782,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 */
+@@ -3296,6 +3303,25 @@ bool regulatory_pre_cac_allowed(struct wiphy *wiphy)
+       return 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,
+@@ -3322,8 +3348,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 f3353fe5b35b..cd0a1c7c185d 100644
+--- a/net/wireless/trace.h
++++ b/net/wireless/trace.h
+@@ -607,6 +607,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 6cdb054484d6..5236a3c2c0cc 100644
+--- a/net/wireless/wext-core.c
++++ b/net/wireless/wext-core.c
+@@ -659,7 +659,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/sound/soc/sti/uniperif_player.c b/sound/soc/sti/uniperif_player.c
+index d8b6936e544e..908f13623f8c 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 6c3e2cc274c5..0ec646f127dc 100644
+--- a/tools/include/linux/string.h
++++ b/tools/include/linux/string.h
+@@ -14,7 +14,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 93b3d4b6feac..ee0afcbdd696 100644
+--- a/tools/lib/string.c
++++ b/tools/lib/string.c
+@@ -95,6 +95,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);
+@@ -106,3 +110,6 @@ size_t __weak strlcpy(char *dest, const char *src, size_t 
size)
+       }
+       return ret;
+ }
++#ifdef __clang__
++#pragma clang diagnostic pop
++#endif
+diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
+index bec7a2f1fb4d..264d458bfe2a 100644
+--- a/tools/perf/builtin-c2c.c
++++ b/tools/perf/builtin-c2c.c
+@@ -528,8 +528,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);
+@@ -562,7 +562,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)          \
+@@ -615,7 +616,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 17b26661b2f6..429c3e140dc3 100644
+--- a/tools/perf/builtin-report.c
++++ b/tools/perf/builtin-report.c
+@@ -342,10 +342,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