diff options
author | 2019-12-05 18:55:18 +0900 | |
---|---|---|
committer | 2019-12-05 21:03:05 +0900 | |
commit | ebb766182011641851104e6bf4dd7c1bc6639034 (patch) | |
tree | 94224b6470e5c73c7f3930c21da72f3550f56c58 | |
parent | Linux patch 4.19.87 (diff) | |
download | linux-patches-4.19-87.tar.gz linux-patches-4.19-87.tar.bz2 linux-patches-4.19-87.zip |
Linux patch 4.19.884.19-87
Signed-off-by: Alice Ferrazzi <alicef@gentoo.org>
-rw-r--r-- | 0000_README | 8 | ||||
-rw-r--r-- | 1087_linux-4.19.88.patch | 10961 |
2 files changed, 10969 insertions, 0 deletions
diff --git a/0000_README b/0000_README index 89fef486..a04c9e99 100644 --- a/0000_README +++ b/0000_README @@ -383,6 +383,14 @@ Patch: 1085_linux-4.19.86.patch From: https://www.kernel.org Desc: Linux 4.19.86 +Patch: 1086_linux-4.19.87.patch +From: https://www.kernel.org +Desc: Linux 4.19.87 + +Patch: 1087_linux-4.19.88.patch +From: https://www.kernel.org +Desc: Linux 4.19.88 + 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/1087_linux-4.19.88.patch b/1087_linux-4.19.88.patch new file mode 100644 index 00000000..b5d6c80a --- /dev/null +++ b/1087_linux-4.19.88.patch @@ -0,0 +1,10961 @@ +diff --git a/Documentation/hid/uhid.txt b/Documentation/hid/uhid.txt +index c8656dd029a9..958fff945304 100644 +--- a/Documentation/hid/uhid.txt ++++ b/Documentation/hid/uhid.txt +@@ -160,7 +160,7 @@ them but you should handle them according to your needs. + UHID_OUTPUT: + This is sent if the HID device driver wants to send raw data to the I/O + device on the interrupt channel. You should read the payload and forward it to +- the device. The payload is of type "struct uhid_data_req". ++ the device. The payload is of type "struct uhid_output_req". + This may be received even though you haven't received UHID_OPEN, yet. + + UHID_GET_REPORT: +diff --git a/Makefile b/Makefile +index 9240f36099de..f9ebb74e8e43 100644 +--- a/Makefile ++++ b/Makefile +@@ -1,7 +1,7 @@ + # SPDX-License-Identifier: GPL-2.0 + VERSION = 4 + PATCHLEVEL = 19 +-SUBLEVEL = 87 ++SUBLEVEL = 88 + EXTRAVERSION = + NAME = "People's Front" + +diff --git a/arch/arm/Kconfig.debug b/arch/arm/Kconfig.debug +index f6fcb8a79889..f95a90dfc282 100644 +--- a/arch/arm/Kconfig.debug ++++ b/arch/arm/Kconfig.debug +@@ -1432,21 +1432,21 @@ config DEBUG_OMAP2PLUS_UART + depends on ARCH_OMAP2PLUS + + config DEBUG_IMX_UART_PORT +- int "i.MX Debug UART Port Selection" if DEBUG_IMX1_UART || \ +- DEBUG_IMX25_UART || \ +- DEBUG_IMX21_IMX27_UART || \ +- DEBUG_IMX31_UART || \ +- DEBUG_IMX35_UART || \ +- DEBUG_IMX50_UART || \ +- DEBUG_IMX51_UART || \ +- DEBUG_IMX53_UART || \ +- DEBUG_IMX6Q_UART || \ +- DEBUG_IMX6SL_UART || \ +- DEBUG_IMX6SX_UART || \ +- DEBUG_IMX6UL_UART || \ +- DEBUG_IMX7D_UART ++ int "i.MX Debug UART Port Selection" ++ depends on DEBUG_IMX1_UART || \ ++ DEBUG_IMX25_UART || \ ++ DEBUG_IMX21_IMX27_UART || \ ++ DEBUG_IMX31_UART || \ ++ DEBUG_IMX35_UART || \ ++ DEBUG_IMX50_UART || \ ++ DEBUG_IMX51_UART || \ ++ DEBUG_IMX53_UART || \ ++ DEBUG_IMX6Q_UART || \ ++ DEBUG_IMX6SL_UART || \ ++ DEBUG_IMX6SX_UART || \ ++ DEBUG_IMX6UL_UART || \ ++ DEBUG_IMX7D_UART + default 1 +- depends on ARCH_MXC + help + Choose UART port on which kernel low-level debug messages + should be output. +diff --git a/arch/arm/boot/dts/gemini-sq201.dts b/arch/arm/boot/dts/gemini-sq201.dts +index 3787cf3763c4..e9e4a8a02600 100644 +--- a/arch/arm/boot/dts/gemini-sq201.dts ++++ b/arch/arm/boot/dts/gemini-sq201.dts +@@ -20,7 +20,7 @@ + }; + + chosen { +- bootargs = "console=ttyS0,115200n8"; ++ bootargs = "console=ttyS0,115200n8 root=/dev/mtdblock2 rw rootfstype=squashfs,jffs2 rootwait"; + stdout-path = &uart0; + }; + +@@ -138,37 +138,10 @@ + /* 16MB of flash */ + reg = <0x30000000 0x01000000>; + +- partition@0 { +- label = "RedBoot"; +- reg = <0x00000000 0x00120000>; +- read-only; +- }; +- partition@120000 { +- label = "Kernel"; +- reg = <0x00120000 0x00200000>; +- }; +- partition@320000 { +- label = "Ramdisk"; +- reg = <0x00320000 0x00600000>; +- }; +- partition@920000 { +- label = "Application"; +- reg = <0x00920000 0x00600000>; +- }; +- partition@f20000 { +- label = "VCTL"; +- reg = <0x00f20000 0x00020000>; +- read-only; +- }; +- partition@f40000 { +- label = "CurConf"; +- reg = <0x00f40000 0x000a0000>; +- read-only; +- }; +- partition@fe0000 { +- label = "FIS directory"; +- reg = <0x00fe0000 0x00020000>; +- read-only; ++ partitions { ++ compatible = "redboot-fis"; ++ /* Eraseblock at 0xfe0000 */ ++ fis-index-block = <0x1fc>; + }; + }; + +diff --git a/arch/arm/boot/dts/imx1-ads.dts b/arch/arm/boot/dts/imx1-ads.dts +index a1d81badb5c8..119b19ba53b6 100644 +--- a/arch/arm/boot/dts/imx1-ads.dts ++++ b/arch/arm/boot/dts/imx1-ads.dts +@@ -21,6 +21,7 @@ + }; + + memory@8000000 { ++ device_type = "memory"; + reg = <0x08000000 0x04000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx1-apf9328.dts b/arch/arm/boot/dts/imx1-apf9328.dts +index 11515c0cb195..ee4b1b106b1a 100644 +--- a/arch/arm/boot/dts/imx1-apf9328.dts ++++ b/arch/arm/boot/dts/imx1-apf9328.dts +@@ -21,6 +21,7 @@ + }; + + memory@8000000 { ++ device_type = "memory"; + reg = <0x08000000 0x00800000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx1.dtsi b/arch/arm/boot/dts/imx1.dtsi +index 3edc7b5550d8..2b6e77029de4 100644 +--- a/arch/arm/boot/dts/imx1.dtsi ++++ b/arch/arm/boot/dts/imx1.dtsi +@@ -15,10 +15,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + gpio0 = &gpio1; +diff --git a/arch/arm/boot/dts/imx23-evk.dts b/arch/arm/boot/dts/imx23-evk.dts +index ad2ae25b7b4d..aca27aa2d44b 100644 +--- a/arch/arm/boot/dts/imx23-evk.dts ++++ b/arch/arm/boot/dts/imx23-evk.dts +@@ -10,6 +10,7 @@ + compatible = "fsl,imx23-evk", "fsl,imx23"; + + memory@40000000 { ++ device_type = "memory"; + reg = <0x40000000 0x08000000>; + }; + +diff --git a/arch/arm/boot/dts/imx23-olinuxino.dts b/arch/arm/boot/dts/imx23-olinuxino.dts +index e9351774c619..109f51603d45 100644 +--- a/arch/arm/boot/dts/imx23-olinuxino.dts ++++ b/arch/arm/boot/dts/imx23-olinuxino.dts +@@ -20,6 +20,7 @@ + compatible = "olimex,imx23-olinuxino", "fsl,imx23"; + + memory@40000000 { ++ device_type = "memory"; + reg = <0x40000000 0x04000000>; + }; + +diff --git a/arch/arm/boot/dts/imx23-sansa.dts b/arch/arm/boot/dts/imx23-sansa.dts +index 67de7863ad79..fa22fd9b2412 100644 +--- a/arch/arm/boot/dts/imx23-sansa.dts ++++ b/arch/arm/boot/dts/imx23-sansa.dts +@@ -50,6 +50,7 @@ + compatible = "sandisk,sansa_fuze_plus", "fsl,imx23"; + + memory@40000000 { ++ device_type = "memory"; + reg = <0x40000000 0x04000000>; + }; + +diff --git a/arch/arm/boot/dts/imx23-stmp378x_devb.dts b/arch/arm/boot/dts/imx23-stmp378x_devb.dts +index 95c7b918f6d6..aab029349420 100644 +--- a/arch/arm/boot/dts/imx23-stmp378x_devb.dts ++++ b/arch/arm/boot/dts/imx23-stmp378x_devb.dts +@@ -17,6 +17,7 @@ + compatible = "fsl,stmp378x-devb", "fsl,imx23"; + + memory@40000000 { ++ device_type = "memory"; + reg = <0x40000000 0x04000000>; + }; + +diff --git a/arch/arm/boot/dts/imx23-xfi3.dts b/arch/arm/boot/dts/imx23-xfi3.dts +index 9616e500b996..2b5df8dfd3ff 100644 +--- a/arch/arm/boot/dts/imx23-xfi3.dts ++++ b/arch/arm/boot/dts/imx23-xfi3.dts +@@ -49,6 +49,7 @@ + compatible = "creative,x-fi3", "fsl,imx23"; + + memory@40000000 { ++ device_type = "memory"; + reg = <0x40000000 0x04000000>; + }; + +diff --git a/arch/arm/boot/dts/imx23.dtsi b/arch/arm/boot/dts/imx23.dtsi +index 71bfd2b15609..aaaa987d8eff 100644 +--- a/arch/arm/boot/dts/imx23.dtsi ++++ b/arch/arm/boot/dts/imx23.dtsi +@@ -13,10 +13,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + gpio0 = &gpio0; +diff --git a/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi b/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi +index e316fe08837a..e4d7da267532 100644 +--- a/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi ++++ b/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi +@@ -18,6 +18,7 @@ + compatible = "eukrea,cpuimx25", "fsl,imx25"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x4000000>; /* 64M */ + }; + }; +diff --git a/arch/arm/boot/dts/imx25-karo-tx25.dts b/arch/arm/boot/dts/imx25-karo-tx25.dts +index 5cb6967866c0..f37e9a75a3ca 100644 +--- a/arch/arm/boot/dts/imx25-karo-tx25.dts ++++ b/arch/arm/boot/dts/imx25-karo-tx25.dts +@@ -37,6 +37,7 @@ + }; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x02000000 0x90000000 0x02000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx25-pdk.dts b/arch/arm/boot/dts/imx25-pdk.dts +index a5626b46ac4e..f8544a9e4633 100644 +--- a/arch/arm/boot/dts/imx25-pdk.dts ++++ b/arch/arm/boot/dts/imx25-pdk.dts +@@ -12,6 +12,7 @@ + compatible = "fsl,imx25-pdk", "fsl,imx25"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x4000000>; + }; + +diff --git a/arch/arm/boot/dts/imx25.dtsi b/arch/arm/boot/dts/imx25.dtsi +index 85c15ee63272..8c8ad80de461 100644 +--- a/arch/arm/boot/dts/imx25.dtsi ++++ b/arch/arm/boot/dts/imx25.dtsi +@@ -12,10 +12,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + ethernet0 = &fec; +diff --git a/arch/arm/boot/dts/imx27-apf27.dts b/arch/arm/boot/dts/imx27-apf27.dts +index 3eddd805a793..f635d5c5029c 100644 +--- a/arch/arm/boot/dts/imx27-apf27.dts ++++ b/arch/arm/boot/dts/imx27-apf27.dts +@@ -20,6 +20,7 @@ + compatible = "armadeus,imx27-apf27", "fsl,imx27"; + + memory@a0000000 { ++ device_type = "memory"; + reg = <0xa0000000 0x04000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi b/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi +index 9c455dcbe6eb..c85f9d01768a 100644 +--- a/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi ++++ b/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi +@@ -17,6 +17,7 @@ + compatible = "eukrea,cpuimx27", "fsl,imx27"; + + memory@a0000000 { ++ device_type = "memory"; + reg = <0xa0000000 0x04000000>; + }; + +diff --git a/arch/arm/boot/dts/imx27-pdk.dts b/arch/arm/boot/dts/imx27-pdk.dts +index f9a882d99132..35123b7cb6b3 100644 +--- a/arch/arm/boot/dts/imx27-pdk.dts ++++ b/arch/arm/boot/dts/imx27-pdk.dts +@@ -10,6 +10,7 @@ + compatible = "fsl,imx27-pdk", "fsl,imx27"; + + memory@a0000000 { ++ device_type = "memory"; + reg = <0xa0000000 0x08000000>; + }; + +diff --git a/arch/arm/boot/dts/imx27-phytec-phycard-s-som.dtsi b/arch/arm/boot/dts/imx27-phytec-phycard-s-som.dtsi +index cbad7c88c58c..b0b4f7c00246 100644 +--- a/arch/arm/boot/dts/imx27-phytec-phycard-s-som.dtsi ++++ b/arch/arm/boot/dts/imx27-phytec-phycard-s-som.dtsi +@@ -18,6 +18,7 @@ + compatible = "phytec,imx27-pca100", "fsl,imx27"; + + memory@a0000000 { ++ device_type = "memory"; + reg = <0xa0000000 0x08000000>; /* 128MB */ + }; + }; +diff --git a/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi b/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi +index ec466b4bfd41..0935e1400e5d 100644 +--- a/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi ++++ b/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi +@@ -17,6 +17,7 @@ + compatible = "phytec,imx27-pcm038", "fsl,imx27"; + + memory@a0000000 { ++ device_type = "memory"; + reg = <0xa0000000 0x08000000>; + }; + +diff --git a/arch/arm/boot/dts/imx27.dtsi b/arch/arm/boot/dts/imx27.dtsi +index 753d88df1627..39e75b997bdc 100644 +--- a/arch/arm/boot/dts/imx27.dtsi ++++ b/arch/arm/boot/dts/imx27.dtsi +@@ -16,10 +16,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + ethernet0 = &fec; +diff --git a/arch/arm/boot/dts/imx31-bug.dts b/arch/arm/boot/dts/imx31-bug.dts +index 6ee4ff8e4e8f..9eb960cc02cc 100644 +--- a/arch/arm/boot/dts/imx31-bug.dts ++++ b/arch/arm/boot/dts/imx31-bug.dts +@@ -17,6 +17,7 @@ + compatible = "buglabs,imx31-bug", "fsl,imx31"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x8000000>; /* 128M */ + }; + }; +diff --git a/arch/arm/boot/dts/imx31-lite.dts b/arch/arm/boot/dts/imx31-lite.dts +index db52ddccabc3..d17abdfb6330 100644 +--- a/arch/arm/boot/dts/imx31-lite.dts ++++ b/arch/arm/boot/dts/imx31-lite.dts +@@ -18,6 +18,7 @@ + }; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x8000000>; + }; + +diff --git a/arch/arm/boot/dts/imx31.dtsi b/arch/arm/boot/dts/imx31.dtsi +index ca1419ca303c..2fc64d2c7c88 100644 +--- a/arch/arm/boot/dts/imx31.dtsi ++++ b/arch/arm/boot/dts/imx31.dtsi +@@ -10,10 +10,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + gpio0 = &gpio1; +diff --git a/arch/arm/boot/dts/imx35-eukrea-cpuimx35.dtsi b/arch/arm/boot/dts/imx35-eukrea-cpuimx35.dtsi +index ba39d938f289..5f8a47a9fcd4 100644 +--- a/arch/arm/boot/dts/imx35-eukrea-cpuimx35.dtsi ++++ b/arch/arm/boot/dts/imx35-eukrea-cpuimx35.dtsi +@@ -18,6 +18,7 @@ + compatible = "eukrea,cpuimx35", "fsl,imx35"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x8000000>; /* 128M */ + }; + }; +diff --git a/arch/arm/boot/dts/imx35-pdk.dts b/arch/arm/boot/dts/imx35-pdk.dts +index df613e88fd2c..ddce0a844758 100644 +--- a/arch/arm/boot/dts/imx35-pdk.dts ++++ b/arch/arm/boot/dts/imx35-pdk.dts +@@ -11,6 +11,7 @@ + compatible = "fsl,imx35-pdk", "fsl,imx35"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x8000000>, + <0x90000000 0x8000000>; + }; +diff --git a/arch/arm/boot/dts/imx35.dtsi b/arch/arm/boot/dts/imx35.dtsi +index 1c50b785cad4..b36b97b655dd 100644 +--- a/arch/arm/boot/dts/imx35.dtsi ++++ b/arch/arm/boot/dts/imx35.dtsi +@@ -13,10 +13,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + ethernet0 = &fec; +diff --git a/arch/arm/boot/dts/imx50-evk.dts b/arch/arm/boot/dts/imx50-evk.dts +index 682a99783ee6..a25da415cb02 100644 +--- a/arch/arm/boot/dts/imx50-evk.dts ++++ b/arch/arm/boot/dts/imx50-evk.dts +@@ -12,6 +12,7 @@ + compatible = "fsl,imx50-evk", "fsl,imx50"; + + memory@70000000 { ++ device_type = "memory"; + reg = <0x70000000 0x80000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx50.dtsi b/arch/arm/boot/dts/imx50.dtsi +index ab522c2da6df..9e9e92acceb2 100644 +--- a/arch/arm/boot/dts/imx50.dtsi ++++ b/arch/arm/boot/dts/imx50.dtsi +@@ -22,10 +22,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + ethernet0 = &fec; +diff --git a/arch/arm/boot/dts/imx51-apf51.dts b/arch/arm/boot/dts/imx51-apf51.dts +index 79d80036f74d..1eddf2908b3f 100644 +--- a/arch/arm/boot/dts/imx51-apf51.dts ++++ b/arch/arm/boot/dts/imx51-apf51.dts +@@ -22,6 +22,7 @@ + compatible = "armadeus,imx51-apf51", "fsl,imx51"; + + memory@90000000 { ++ device_type = "memory"; + reg = <0x90000000 0x20000000>; + }; + +diff --git a/arch/arm/boot/dts/imx51-babbage.dts b/arch/arm/boot/dts/imx51-babbage.dts +index ba60b0cb3cc1..99191466a808 100644 +--- a/arch/arm/boot/dts/imx51-babbage.dts ++++ b/arch/arm/boot/dts/imx51-babbage.dts +@@ -15,6 +15,7 @@ + }; + + memory@90000000 { ++ device_type = "memory"; + reg = <0x90000000 0x20000000>; + }; + +diff --git a/arch/arm/boot/dts/imx51-digi-connectcore-som.dtsi b/arch/arm/boot/dts/imx51-digi-connectcore-som.dtsi +index 5761a66e8a0d..82d8df097ef1 100644 +--- a/arch/arm/boot/dts/imx51-digi-connectcore-som.dtsi ++++ b/arch/arm/boot/dts/imx51-digi-connectcore-som.dtsi +@@ -17,6 +17,7 @@ + compatible = "digi,connectcore-ccxmx51-som", "fsl,imx51"; + + memory@90000000 { ++ device_type = "memory"; + reg = <0x90000000 0x08000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx51-eukrea-cpuimx51.dtsi b/arch/arm/boot/dts/imx51-eukrea-cpuimx51.dtsi +index f8902a338e49..2e3125391bc4 100644 +--- a/arch/arm/boot/dts/imx51-eukrea-cpuimx51.dtsi ++++ b/arch/arm/boot/dts/imx51-eukrea-cpuimx51.dtsi +@@ -23,6 +23,7 @@ + compatible = "eukrea,cpuimx51", "fsl,imx51"; + + memory@90000000 { ++ device_type = "memory"; + reg = <0x90000000 0x10000000>; /* 256M */ + }; + }; +diff --git a/arch/arm/boot/dts/imx51-ts4800.dts b/arch/arm/boot/dts/imx51-ts4800.dts +index 39eb067904c3..4344632f7940 100644 +--- a/arch/arm/boot/dts/imx51-ts4800.dts ++++ b/arch/arm/boot/dts/imx51-ts4800.dts +@@ -18,6 +18,7 @@ + }; + + memory@90000000 { ++ device_type = "memory"; + reg = <0x90000000 0x10000000>; + }; + +diff --git a/arch/arm/boot/dts/imx51-zii-rdu1.dts b/arch/arm/boot/dts/imx51-zii-rdu1.dts +index 3fb66ddfe93a..9235fd45a824 100644 +--- a/arch/arm/boot/dts/imx51-zii-rdu1.dts ++++ b/arch/arm/boot/dts/imx51-zii-rdu1.dts +@@ -53,6 +53,7 @@ + + /* Will be filled by the bootloader */ + memory@90000000 { ++ device_type = "memory"; + reg = <0x90000000 0>; + }; + +diff --git a/arch/arm/boot/dts/imx51-zii-scu2-mezz.dts b/arch/arm/boot/dts/imx51-zii-scu2-mezz.dts +index 26cf08549df4..f5b2d768fe47 100644 +--- a/arch/arm/boot/dts/imx51-zii-scu2-mezz.dts ++++ b/arch/arm/boot/dts/imx51-zii-scu2-mezz.dts +@@ -18,6 +18,7 @@ + + /* Will be filled by the bootloader */ + memory@90000000 { ++ device_type = "memory"; + reg = <0x90000000 0>; + }; + +diff --git a/arch/arm/boot/dts/imx51-zii-scu3-esb.dts b/arch/arm/boot/dts/imx51-zii-scu3-esb.dts +index e6ebac8f43e4..ad90d66ccca6 100644 +--- a/arch/arm/boot/dts/imx51-zii-scu3-esb.dts ++++ b/arch/arm/boot/dts/imx51-zii-scu3-esb.dts +@@ -18,6 +18,7 @@ + + /* Will be filled by the bootloader */ + memory@90000000 { ++ device_type = "memory"; + reg = <0x90000000 0>; + }; + +diff --git a/arch/arm/boot/dts/imx51.dtsi b/arch/arm/boot/dts/imx51.dtsi +index ef2abc097843..81f60c96a2e4 100644 +--- a/arch/arm/boot/dts/imx51.dtsi ++++ b/arch/arm/boot/dts/imx51.dtsi +@@ -16,10 +16,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + ethernet0 = &fec; +diff --git a/arch/arm/boot/dts/imx53-ard.dts b/arch/arm/boot/dts/imx53-ard.dts +index 117bd002dd1d..7d5a48250f86 100644 +--- a/arch/arm/boot/dts/imx53-ard.dts ++++ b/arch/arm/boot/dts/imx53-ard.dts +@@ -19,6 +19,7 @@ + compatible = "fsl,imx53-ard", "fsl,imx53"; + + memory@70000000 { ++ device_type = "memory"; + reg = <0x70000000 0x40000000>; + }; + +diff --git a/arch/arm/boot/dts/imx53-cx9020.dts b/arch/arm/boot/dts/imx53-cx9020.dts +index cf70ebc4399a..c875e23ee45f 100644 +--- a/arch/arm/boot/dts/imx53-cx9020.dts ++++ b/arch/arm/boot/dts/imx53-cx9020.dts +@@ -22,6 +22,7 @@ + }; + + memory@70000000 { ++ device_type = "memory"; + reg = <0x70000000 0x20000000>, + <0xb0000000 0x20000000>; + }; +diff --git a/arch/arm/boot/dts/imx53-m53.dtsi b/arch/arm/boot/dts/imx53-m53.dtsi +index ce45f08e3051..db2e5bce9b6a 100644 +--- a/arch/arm/boot/dts/imx53-m53.dtsi ++++ b/arch/arm/boot/dts/imx53-m53.dtsi +@@ -16,6 +16,7 @@ + compatible = "aries,imx53-m53", "denx,imx53-m53", "fsl,imx53"; + + memory@70000000 { ++ device_type = "memory"; + reg = <0x70000000 0x20000000>, + <0xb0000000 0x20000000>; + }; +diff --git a/arch/arm/boot/dts/imx53-qsb-common.dtsi b/arch/arm/boot/dts/imx53-qsb-common.dtsi +index 50dde84b72ed..f00dda334976 100644 +--- a/arch/arm/boot/dts/imx53-qsb-common.dtsi ++++ b/arch/arm/boot/dts/imx53-qsb-common.dtsi +@@ -11,6 +11,7 @@ + }; + + memory@70000000 { ++ device_type = "memory"; + reg = <0x70000000 0x20000000>, + <0xb0000000 0x20000000>; + }; +diff --git a/arch/arm/boot/dts/imx53-smd.dts b/arch/arm/boot/dts/imx53-smd.dts +index 462071c9ddd7..09071ca11c6c 100644 +--- a/arch/arm/boot/dts/imx53-smd.dts ++++ b/arch/arm/boot/dts/imx53-smd.dts +@@ -12,6 +12,7 @@ + compatible = "fsl,imx53-smd", "fsl,imx53"; + + memory@70000000 { ++ device_type = "memory"; + reg = <0x70000000 0x40000000>; + }; + +diff --git a/arch/arm/boot/dts/imx53-tqma53.dtsi b/arch/arm/boot/dts/imx53-tqma53.dtsi +index a72b8981fc3b..c77d58f06c94 100644 +--- a/arch/arm/boot/dts/imx53-tqma53.dtsi ++++ b/arch/arm/boot/dts/imx53-tqma53.dtsi +@@ -17,6 +17,7 @@ + compatible = "tq,tqma53", "fsl,imx53"; + + memory@70000000 { ++ device_type = "memory"; + reg = <0x70000000 0x40000000>; /* Up to 1GiB */ + }; + +diff --git a/arch/arm/boot/dts/imx53-tx53.dtsi b/arch/arm/boot/dts/imx53-tx53.dtsi +index 54cf3e67069a..4ab135906949 100644 +--- a/arch/arm/boot/dts/imx53-tx53.dtsi ++++ b/arch/arm/boot/dts/imx53-tx53.dtsi +@@ -51,6 +51,7 @@ + + /* Will be filled by the bootloader */ + memory@70000000 { ++ device_type = "memory"; + reg = <0x70000000 0>; + }; + +diff --git a/arch/arm/boot/dts/imx53-usbarmory.dts b/arch/arm/boot/dts/imx53-usbarmory.dts +index f6268d0ded29..ee6263d1c2d3 100644 +--- a/arch/arm/boot/dts/imx53-usbarmory.dts ++++ b/arch/arm/boot/dts/imx53-usbarmory.dts +@@ -58,6 +58,7 @@ + }; + + memory@70000000 { ++ device_type = "memory"; + reg = <0x70000000 0x20000000>; + }; + +diff --git a/arch/arm/boot/dts/imx53-voipac-dmm-668.dtsi b/arch/arm/boot/dts/imx53-voipac-dmm-668.dtsi +index f83a8c62ea53..d595034f3f1b 100644 +--- a/arch/arm/boot/dts/imx53-voipac-dmm-668.dtsi ++++ b/arch/arm/boot/dts/imx53-voipac-dmm-668.dtsi +@@ -17,12 +17,8 @@ + + memory@70000000 { + device_type = "memory"; +- reg = <0x70000000 0x20000000>; +- }; +- +- memory@b0000000 { +- device_type = "memory"; +- reg = <0xb0000000 0x20000000>; ++ reg = <0x70000000 0x20000000>, ++ <0xb0000000 0x20000000>; + }; + + regulators { +diff --git a/arch/arm/boot/dts/imx53.dtsi b/arch/arm/boot/dts/imx53.dtsi +index b6b0818343c4..8accbe16b758 100644 +--- a/arch/arm/boot/dts/imx53.dtsi ++++ b/arch/arm/boot/dts/imx53.dtsi +@@ -23,10 +23,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + ethernet0 = &fec; +diff --git a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi +index 9f11f1fcc3e6..9d086a3b5ffc 100644 +--- a/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi ++++ b/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi +@@ -177,6 +177,8 @@ + accelerometer@1c { + compatible = "fsl,mma8451"; + reg = <0x1c>; ++ pinctrl-names = "default"; ++ pinctrl-0 = <&pinctrl_mma8451_int>; + interrupt-parent = <&gpio6>; + interrupts = <31 IRQ_TYPE_LEVEL_LOW>; + }; +@@ -522,6 +524,12 @@ + >; + }; + ++ pinctrl_mma8451_int: mma8451intgrp { ++ fsl,pins = < ++ MX6QDL_PAD_EIM_BCLK__GPIO6_IO31 0xb0b1 ++ >; ++ }; ++ + pinctrl_pwm3: pwm1grp { + fsl,pins = < + MX6QDL_PAD_SD4_DAT1__PWM3_OUT 0x1b0b1 +diff --git a/arch/arm/boot/dts/imx6sl-evk.dts b/arch/arm/boot/dts/imx6sl-evk.dts +index 679b4482ab13..f7a48e4622e1 100644 +--- a/arch/arm/boot/dts/imx6sl-evk.dts ++++ b/arch/arm/boot/dts/imx6sl-evk.dts +@@ -17,6 +17,7 @@ + }; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x40000000>; + }; + +diff --git a/arch/arm/boot/dts/imx6sl-warp.dts b/arch/arm/boot/dts/imx6sl-warp.dts +index 404e602e6781..408da704c459 100644 +--- a/arch/arm/boot/dts/imx6sl-warp.dts ++++ b/arch/arm/boot/dts/imx6sl-warp.dts +@@ -55,6 +55,7 @@ + compatible = "warp,imx6sl-warp", "fsl,imx6sl"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x20000000>; + }; + +diff --git a/arch/arm/boot/dts/imx6sl.dtsi b/arch/arm/boot/dts/imx6sl.dtsi +index 2fa88c6f1882..55d1872aa81a 100644 +--- a/arch/arm/boot/dts/imx6sl.dtsi ++++ b/arch/arm/boot/dts/imx6sl.dtsi +@@ -13,10 +13,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + ethernet0 = &fec; +diff --git a/arch/arm/boot/dts/imx6sll-evk.dts b/arch/arm/boot/dts/imx6sll-evk.dts +index c8e115564ba2..0c2406ac8a63 100644 +--- a/arch/arm/boot/dts/imx6sll-evk.dts ++++ b/arch/arm/boot/dts/imx6sll-evk.dts +@@ -20,6 +20,7 @@ + }; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x80000000>; + }; + +diff --git a/arch/arm/boot/dts/imx6sx-nitrogen6sx.dts b/arch/arm/boot/dts/imx6sx-nitrogen6sx.dts +index adb5cc7d8ce2..832b5c5d7441 100644 +--- a/arch/arm/boot/dts/imx6sx-nitrogen6sx.dts ++++ b/arch/arm/boot/dts/imx6sx-nitrogen6sx.dts +@@ -12,6 +12,7 @@ + compatible = "boundary,imx6sx-nitrogen6sx", "fsl,imx6sx"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x40000000>; + }; + +diff --git a/arch/arm/boot/dts/imx6sx-sabreauto.dts b/arch/arm/boot/dts/imx6sx-sabreauto.dts +index 841a27f3198f..48aede543612 100644 +--- a/arch/arm/boot/dts/imx6sx-sabreauto.dts ++++ b/arch/arm/boot/dts/imx6sx-sabreauto.dts +@@ -11,6 +11,7 @@ + compatible = "fsl,imx6sx-sabreauto", "fsl,imx6sx"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x80000000>; + }; + +diff --git a/arch/arm/boot/dts/imx6sx-sdb.dtsi b/arch/arm/boot/dts/imx6sx-sdb.dtsi +index d6d517e4922f..91f809ed1370 100644 +--- a/arch/arm/boot/dts/imx6sx-sdb.dtsi ++++ b/arch/arm/boot/dts/imx6sx-sdb.dtsi +@@ -21,6 +21,7 @@ + }; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x40000000>; + }; + +diff --git a/arch/arm/boot/dts/imx6sx-softing-vining-2000.dts b/arch/arm/boot/dts/imx6sx-softing-vining-2000.dts +index 252175b59247..2bc51623a806 100644 +--- a/arch/arm/boot/dts/imx6sx-softing-vining-2000.dts ++++ b/arch/arm/boot/dts/imx6sx-softing-vining-2000.dts +@@ -21,6 +21,7 @@ + }; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x40000000>; + }; + +diff --git a/arch/arm/boot/dts/imx6sx-udoo-neo-basic.dts b/arch/arm/boot/dts/imx6sx-udoo-neo-basic.dts +index 40ccdf43dffc..db0feb9b9f5d 100644 +--- a/arch/arm/boot/dts/imx6sx-udoo-neo-basic.dts ++++ b/arch/arm/boot/dts/imx6sx-udoo-neo-basic.dts +@@ -49,6 +49,7 @@ + compatible = "udoo,neobasic", "fsl,imx6sx"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x20000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx6sx-udoo-neo-extended.dts b/arch/arm/boot/dts/imx6sx-udoo-neo-extended.dts +index 42bfc8f8f7f6..5c7a2bb9141c 100644 +--- a/arch/arm/boot/dts/imx6sx-udoo-neo-extended.dts ++++ b/arch/arm/boot/dts/imx6sx-udoo-neo-extended.dts +@@ -49,6 +49,7 @@ + compatible = "udoo,neoextended", "fsl,imx6sx"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x40000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx6sx-udoo-neo-full.dts b/arch/arm/boot/dts/imx6sx-udoo-neo-full.dts +index c84c877f09d4..13dfe2afaba5 100644 +--- a/arch/arm/boot/dts/imx6sx-udoo-neo-full.dts ++++ b/arch/arm/boot/dts/imx6sx-udoo-neo-full.dts +@@ -49,6 +49,7 @@ + compatible = "udoo,neofull", "fsl,imx6sx"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x40000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx6sx.dtsi b/arch/arm/boot/dts/imx6sx.dtsi +index 7b62e6fb47eb..ae0728df542e 100644 +--- a/arch/arm/boot/dts/imx6sx.dtsi ++++ b/arch/arm/boot/dts/imx6sx.dtsi +@@ -15,10 +15,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + can0 = &flexcan1; +diff --git a/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi b/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi +index 32a07232c034..818021126559 100644 +--- a/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi ++++ b/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi +@@ -12,6 +12,7 @@ + }; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x20000000>; + }; + +diff --git a/arch/arm/boot/dts/imx6ul-geam.dts b/arch/arm/boot/dts/imx6ul-geam.dts +index d81d20f8fc8d..85cfad080f15 100644 +--- a/arch/arm/boot/dts/imx6ul-geam.dts ++++ b/arch/arm/boot/dts/imx6ul-geam.dts +@@ -51,6 +51,7 @@ + compatible = "engicam,imx6ul-geam", "fsl,imx6ul"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x08000000>; + }; + +diff --git a/arch/arm/boot/dts/imx6ul-isiot.dtsi b/arch/arm/boot/dts/imx6ul-isiot.dtsi +index cd9928551154..1cb52744f58a 100644 +--- a/arch/arm/boot/dts/imx6ul-isiot.dtsi ++++ b/arch/arm/boot/dts/imx6ul-isiot.dtsi +@@ -46,6 +46,7 @@ + + / { + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x20000000>; + }; + +diff --git a/arch/arm/boot/dts/imx6ul-litesom.dtsi b/arch/arm/boot/dts/imx6ul-litesom.dtsi +index 8f775f6974d1..8d6893210842 100644 +--- a/arch/arm/boot/dts/imx6ul-litesom.dtsi ++++ b/arch/arm/boot/dts/imx6ul-litesom.dtsi +@@ -48,6 +48,7 @@ + compatible = "grinn,imx6ul-litesom", "fsl,imx6ul"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x20000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx6ul-opos6ul.dtsi b/arch/arm/boot/dts/imx6ul-opos6ul.dtsi +index a031bee311df..cf7faf4b9c47 100644 +--- a/arch/arm/boot/dts/imx6ul-opos6ul.dtsi ++++ b/arch/arm/boot/dts/imx6ul-opos6ul.dtsi +@@ -49,6 +49,7 @@ + + / { + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0>; /* will be filled by U-Boot */ + }; + +diff --git a/arch/arm/boot/dts/imx6ul-pico-hobbit.dts b/arch/arm/boot/dts/imx6ul-pico-hobbit.dts +index 0c09420f9951..797262d2f27f 100644 +--- a/arch/arm/boot/dts/imx6ul-pico-hobbit.dts ++++ b/arch/arm/boot/dts/imx6ul-pico-hobbit.dts +@@ -53,6 +53,7 @@ + + /* Will be filled by the bootloader */ + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0>; + }; + +diff --git a/arch/arm/boot/dts/imx6ul-tx6ul.dtsi b/arch/arm/boot/dts/imx6ul-tx6ul.dtsi +index 02b5ba42cd59..bb6dbfd5546b 100644 +--- a/arch/arm/boot/dts/imx6ul-tx6ul.dtsi ++++ b/arch/arm/boot/dts/imx6ul-tx6ul.dtsi +@@ -71,6 +71,7 @@ + }; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0>; /* will be filled by U-Boot */ + }; + +diff --git a/arch/arm/boot/dts/imx6ul.dtsi b/arch/arm/boot/dts/imx6ul.dtsi +index 336cdead3da5..50834a43e5fb 100644 +--- a/arch/arm/boot/dts/imx6ul.dtsi ++++ b/arch/arm/boot/dts/imx6ul.dtsi +@@ -15,10 +15,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + ethernet0 = &fec1; +diff --git a/arch/arm/boot/dts/imx6ull-colibri-nonwifi.dtsi b/arch/arm/boot/dts/imx6ull-colibri-nonwifi.dtsi +index 10ab4697950f..fb213bec4654 100644 +--- a/arch/arm/boot/dts/imx6ull-colibri-nonwifi.dtsi ++++ b/arch/arm/boot/dts/imx6ull-colibri-nonwifi.dtsi +@@ -7,6 +7,7 @@ + + / { + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x10000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi b/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi +index 183193e8580d..038d8c90f6df 100644 +--- a/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi ++++ b/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi +@@ -7,6 +7,7 @@ + + / { + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x20000000>; + }; + +diff --git a/arch/arm/boot/dts/imx7d-cl-som-imx7.dts b/arch/arm/boot/dts/imx7d-cl-som-imx7.dts +index 584418f517a8..62d5e9a4a781 100644 +--- a/arch/arm/boot/dts/imx7d-cl-som-imx7.dts ++++ b/arch/arm/boot/dts/imx7d-cl-som-imx7.dts +@@ -19,6 +19,7 @@ + compatible = "compulab,cl-som-imx7", "fsl,imx7d"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x10000000>; /* 256 MB - minimal configuration */ + }; + +@@ -284,4 +285,4 @@ + MX7D_PAD_LPSR_GPIO1_IO05__GPIO1_IO5 0x14 /* OTG PWREN */ + >; + }; +-}; +\ No newline at end of file ++}; +diff --git a/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi b/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi +index 04d24ee17b14..898f4b8d7421 100644 +--- a/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi ++++ b/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi +@@ -8,6 +8,7 @@ + + / { + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x40000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx7d-colibri.dtsi b/arch/arm/boot/dts/imx7d-colibri.dtsi +index d9f8fb69511b..e2e327f437e3 100644 +--- a/arch/arm/boot/dts/imx7d-colibri.dtsi ++++ b/arch/arm/boot/dts/imx7d-colibri.dtsi +@@ -45,6 +45,7 @@ + + / { + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x20000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx7d-nitrogen7.dts b/arch/arm/boot/dts/imx7d-nitrogen7.dts +index 177d21fdeb28..6b4acea1ef79 100644 +--- a/arch/arm/boot/dts/imx7d-nitrogen7.dts ++++ b/arch/arm/boot/dts/imx7d-nitrogen7.dts +@@ -12,6 +12,7 @@ + compatible = "boundary,imx7d-nitrogen7", "fsl,imx7d"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x40000000>; + }; + +diff --git a/arch/arm/boot/dts/imx7d-pico.dtsi b/arch/arm/boot/dts/imx7d-pico.dtsi +index f27b3849d3ff..934a019f341e 100644 +--- a/arch/arm/boot/dts/imx7d-pico.dtsi ++++ b/arch/arm/boot/dts/imx7d-pico.dtsi +@@ -49,6 +49,7 @@ + compatible = "technexion,imx7d-pico", "fsl,imx7d"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x80000000>; + }; + +diff --git a/arch/arm/boot/dts/imx7d-sdb.dts b/arch/arm/boot/dts/imx7d-sdb.dts +index c9b3c60b0eb2..317f1bcc56e2 100644 +--- a/arch/arm/boot/dts/imx7d-sdb.dts ++++ b/arch/arm/boot/dts/imx7d-sdb.dts +@@ -15,6 +15,7 @@ + }; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x80000000>; + }; + +diff --git a/arch/arm/boot/dts/imx7s-colibri.dtsi b/arch/arm/boot/dts/imx7s-colibri.dtsi +index fe8344cee864..1fb1ec5d3d70 100644 +--- a/arch/arm/boot/dts/imx7s-colibri.dtsi ++++ b/arch/arm/boot/dts/imx7s-colibri.dtsi +@@ -45,6 +45,7 @@ + + / { + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x10000000>; + }; + }; +diff --git a/arch/arm/boot/dts/imx7s-warp.dts b/arch/arm/boot/dts/imx7s-warp.dts +index fa390da636de..97d5c711eb0c 100644 +--- a/arch/arm/boot/dts/imx7s-warp.dts ++++ b/arch/arm/boot/dts/imx7s-warp.dts +@@ -51,6 +51,7 @@ + compatible = "warp,imx7s-warp", "fsl,imx7s"; + + memory@80000000 { ++ device_type = "memory"; + reg = <0x80000000 0x20000000>; + }; + +diff --git a/arch/arm/boot/dts/imx7s.dtsi b/arch/arm/boot/dts/imx7s.dtsi +index 90f5bdfa9b3c..7eaf96b425be 100644 +--- a/arch/arm/boot/dts/imx7s.dtsi ++++ b/arch/arm/boot/dts/imx7s.dtsi +@@ -17,10 +17,8 @@ + * The decompressor and also some bootloaders rely on a + * pre-existing /chosen node to be available to insert the + * command line and merge other ATAGS info. +- * Also for U-Boot there must be a pre-existing /memory node. + */ + chosen {}; +- memory { device_type = "memory"; }; + + aliases { + gpio0 = &gpio1; +diff --git a/arch/arm/boot/dts/omap4-l4.dtsi b/arch/arm/boot/dts/omap4-l4.dtsi +index 6eb26b837446..5059ecac4478 100644 +--- a/arch/arm/boot/dts/omap4-l4.dtsi ++++ b/arch/arm/boot/dts/omap4-l4.dtsi +@@ -196,12 +196,12 @@ + clock-names = "fck"; + #address-cells = <1>; + #size-cells = <1>; +- ranges = <0x0 0x58000 0x4000>; ++ ranges = <0x0 0x58000 0x5000>; + + hsi: hsi@0 { + compatible = "ti,omap4-hsi"; + reg = <0x0 0x4000>, +- <0x4a05c000 0x1000>; ++ <0x5000 0x1000>; + reg-names = "sys", "gdd"; + + clocks = <&l3_init_clkctrl OMAP4_HSI_CLKCTRL 0>; +diff --git a/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts b/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts +index 1537ce148cc1..49547a43cc90 100644 +--- a/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts ++++ b/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts +@@ -171,6 +171,7 @@ + vqmmc-supply = <®_dldo1>; + non-removable; + wakeup-source; ++ keep-power-in-suspend; + status = "okay"; + + brcmf: wifi@1 { +diff --git a/arch/arm/mach-ks8695/board-acs5k.c b/arch/arm/mach-ks8695/board-acs5k.c +index ef835d82cdb9..5783062224c3 100644 +--- a/arch/arm/mach-ks8695/board-acs5k.c ++++ b/arch/arm/mach-ks8695/board-acs5k.c +@@ -100,7 +100,7 @@ static struct i2c_board_info acs5k_i2c_devs[] __initdata = { + }, + }; + +-static void acs5k_i2c_init(void) ++static void __init acs5k_i2c_init(void) + { + /* The gpio interface */ + gpiod_add_lookup_table(&acs5k_i2c_gpiod_table); +diff --git a/arch/arm/mach-omap1/Makefile b/arch/arm/mach-omap1/Makefile +index e8ccf51c6f29..ec0235899de2 100644 +--- a/arch/arm/mach-omap1/Makefile ++++ b/arch/arm/mach-omap1/Makefile +@@ -25,7 +25,7 @@ obj-y += $(i2c-omap-m) $(i2c-omap-y) + + led-y := leds.o + +-usb-fs-$(CONFIG_USB) := usb.o ++usb-fs-$(CONFIG_USB_SUPPORT) := usb.o + obj-y += $(usb-fs-m) $(usb-fs-y) + + # Specific board support +diff --git a/arch/arm/mach-omap1/include/mach/usb.h b/arch/arm/mach-omap1/include/mach/usb.h +index 77867778d4ec..5429d86c7190 100644 +--- a/arch/arm/mach-omap1/include/mach/usb.h ++++ b/arch/arm/mach-omap1/include/mach/usb.h +@@ -11,7 +11,7 @@ + + #include <linux/platform_data/usb-omap1.h> + +-#if IS_ENABLED(CONFIG_USB) ++#if IS_ENABLED(CONFIG_USB_SUPPORT) + void omap1_usb_init(struct omap_usb_config *pdata); + #else + static inline void omap1_usb_init(struct omap_usb_config *pdata) +diff --git a/arch/arm64/boot/dts/renesas/r8a77995-draak.dts b/arch/arm64/boot/dts/renesas/r8a77995-draak.dts +index a8e8f2669d4c..1b8f19ee257f 100644 +--- a/arch/arm64/boot/dts/renesas/r8a77995-draak.dts ++++ b/arch/arm64/boot/dts/renesas/r8a77995-draak.dts +@@ -188,7 +188,7 @@ + compatible = "adi,adv7180cp"; + reg = <0x20>; + +- port { ++ ports { + #address-cells = <1>; + #size-cells = <0>; + +diff --git a/arch/arm64/include/asm/assembler.h b/arch/arm64/include/asm/assembler.h +index 5a97ac853168..0c100506a29a 100644 +--- a/arch/arm64/include/asm/assembler.h ++++ b/arch/arm64/include/asm/assembler.h +@@ -683,11 +683,9 @@ USER(\label, ic ivau, \tmp2) // invalidate I line PoU + .macro if_will_cond_yield_neon + #ifdef CONFIG_PREEMPT + get_thread_info x0 +- ldr w1, [x0, #TSK_TI_PREEMPT] +- ldr x0, [x0, #TSK_TI_FLAGS] +- cmp w1, #PREEMPT_DISABLE_OFFSET +- csel x0, x0, xzr, eq +- tbnz x0, #TIF_NEED_RESCHED, .Lyield_\@ // needs rescheduling? ++ ldr x0, [x0, #TSK_TI_PREEMPT] ++ sub x0, x0, #PREEMPT_DISABLE_OFFSET ++ cbz x0, .Lyield_\@ + /* fall through to endif_yield_neon */ + .subsection 1 + .Lyield_\@ : +diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S +index 5f800384cb9a..bb6832353045 100644 +--- a/arch/arm64/kernel/entry.S ++++ b/arch/arm64/kernel/entry.S +@@ -622,10 +622,8 @@ el1_irq: + irq_handler + + #ifdef CONFIG_PREEMPT +- ldr w24, [tsk, #TSK_TI_PREEMPT] // get preempt count +- cbnz w24, 1f // preempt count != 0 +- ldr x0, [tsk, #TSK_TI_FLAGS] // get flags +- tbz x0, #TIF_NEED_RESCHED, 1f // needs rescheduling? ++ ldr x24, [tsk, #TSK_TI_PREEMPT] // get preempt count ++ cbnz x24, 1f // preempt count != 0 + bl el1_preempt + 1: + #endif +diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S +index 77ca59598c8b..06058fba5f86 100644 +--- a/arch/arm64/kernel/head.S ++++ b/arch/arm64/kernel/head.S +@@ -703,6 +703,7 @@ secondary_startup: + /* + * Common entry point for secondary CPUs. + */ ++ bl __cpu_secondary_check52bitva + bl __cpu_setup // initialise processor + bl __enable_mmu + ldr x8, =__secondary_switched +@@ -779,6 +780,31 @@ ENTRY(__enable_mmu) + ret + ENDPROC(__enable_mmu) + ++ENTRY(__cpu_secondary_check52bitva) ++#ifdef CONFIG_ARM64_52BIT_VA ++ ldr_l x0, vabits_user ++ cmp x0, #52 ++ b.ne 2f ++ ++ mrs_s x0, SYS_ID_AA64MMFR2_EL1 ++ and x0, x0, #(0xf << ID_AA64MMFR2_LVA_SHIFT) ++ cbnz x0, 2f ++ ++ adr_l x0, va52mismatch ++ mov w1, #1 ++ strb w1, [x0] ++ dmb sy ++ dc ivac, x0 // Invalidate potentially stale cache line ++ ++ update_early_cpu_boot_status CPU_STUCK_IN_KERNEL, x0, x1 ++1: wfe ++ wfi ++ b 1b ++ ++#endif ++2: ret ++ENDPROC(__cpu_secondary_check52bitva) ++ + __no_granule_support: + /* Indicate that this CPU can't boot and is stuck in the kernel */ + update_early_cpu_boot_status CPU_STUCK_IN_KERNEL, x1, x2 +diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c +index 25fcd22a4bb2..52aa51f6310b 100644 +--- a/arch/arm64/kernel/smp.c ++++ b/arch/arm64/kernel/smp.c +@@ -108,6 +108,7 @@ static int boot_secondary(unsigned int cpu, struct task_struct *idle) + } + + static DECLARE_COMPLETION(cpu_running); ++bool va52mismatch __ro_after_init; + + int __cpu_up(unsigned int cpu, struct task_struct *idle) + { +@@ -137,10 +138,15 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle) + + if (!cpu_online(cpu)) { + pr_crit("CPU%u: failed to come online\n", cpu); ++ ++ if (IS_ENABLED(CONFIG_ARM64_52BIT_VA) && va52mismatch) ++ pr_crit("CPU%u: does not support 52-bit VAs\n", cpu); ++ + ret = -EIO; + } + } else { + pr_err("CPU%u: failed to boot: %d\n", cpu, ret); ++ return ret; + } + + secondary_data.task = NULL; +diff --git a/arch/microblaze/Makefile b/arch/microblaze/Makefile +index 4f3ab5707265..548bac6c60f8 100644 +--- a/arch/microblaze/Makefile ++++ b/arch/microblaze/Makefile +@@ -83,19 +83,21 @@ archclean: + + linux.bin linux.bin.gz linux.bin.ub: vmlinux + $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ ++ @echo 'Kernel: $(boot)/$@ is ready' ' (#'`cat .version`')' + + simpleImage.%: vmlinux +- $(Q)$(MAKE) $(build)=$(boot) $(boot)/$@ ++ $(Q)$(MAKE) $(build)=$(boot) $(addprefix $(boot)/$@., ub unstrip strip) ++ @echo 'Kernel: $(boot)/$@ is ready' ' (#'`cat .version`')' + + define archhelp + echo '* linux.bin - Create raw binary' + echo ' linux.bin.gz - Create compressed raw binary' + echo ' linux.bin.ub - Create U-Boot wrapped raw binary' +- echo ' simpleImage.<dt> - ELF image with $(arch)/boot/dts/<dt>.dts linked in' +- echo ' - stripped elf with fdt blob' +- echo ' simpleImage.<dt>.unstrip - full ELF image with fdt blob' +- echo ' *_defconfig - Select default config from arch/microblaze/configs' +- echo '' ++ echo ' simpleImage.<dt> - Create the following images with <dt>.dtb linked in' ++ echo ' simpleImage.<dt> : raw image' ++ echo ' simpleImage.<dt>.ub : raw image with U-Boot header' ++ echo ' simpleImage.<dt>.unstrip: ELF (identical to vmlinux)' ++ echo ' simpleImage.<dt>.strip : stripped ELF' + echo ' Targets with <dt> embed a device tree blob inside the image' + echo ' These targets support board with firmware that does not' + echo ' support passing a device tree directly. Replace <dt> with the' +diff --git a/arch/microblaze/boot/Makefile b/arch/microblaze/boot/Makefile +index 600e5a198bd2..cff570a71946 100644 +--- a/arch/microblaze/boot/Makefile ++++ b/arch/microblaze/boot/Makefile +@@ -3,38 +3,33 @@ + # arch/microblaze/boot/Makefile + # + +-targets := linux.bin linux.bin.gz linux.bin.ub simpleImage.% ++targets := linux.bin linux.bin.gz linux.bin.ub simpleImage.* + + OBJCOPYFLAGS := -R .note -R .comment -R .note.gnu.build-id -O binary + + $(obj)/linux.bin: vmlinux FORCE + $(call if_changed,objcopy) +- @echo 'Kernel: $@ is ready' ' (#'`cat .version`')' + + $(obj)/linux.bin.ub: $(obj)/linux.bin FORCE + $(call if_changed,uimage) +- @echo 'Kernel: $@ is ready' ' (#'`cat .version`')' + + $(obj)/linux.bin.gz: $(obj)/linux.bin FORCE + $(call if_changed,gzip) +- @echo 'Kernel: $@ is ready' ' (#'`cat .version`')' +- +-quiet_cmd_cp = CP $< $@$2 +- cmd_cp = cat $< >$@$2 || (rm -f $@ && echo false) + + quiet_cmd_strip = STRIP $< $@$2 + cmd_strip = $(STRIP) -K microblaze_start -K _end -K __log_buf \ + -K _fdt_start $< -o $@$2 + + UIMAGE_LOADADDR = $(CONFIG_KERNEL_BASE_ADDR) +-UIMAGE_IN = $@ +-UIMAGE_OUT = $@.ub + +-$(obj)/simpleImage.%: vmlinux FORCE +- $(call if_changed,cp,.unstrip) ++$(obj)/simpleImage.$(DTB): vmlinux FORCE + $(call if_changed,objcopy) ++ ++$(obj)/simpleImage.$(DTB).ub: $(obj)/simpleImage.$(DTB) FORCE + $(call if_changed,uimage) +- $(call if_changed,strip,.strip) +- @echo 'Kernel: $(UIMAGE_OUT) is ready' ' (#'`cat .version`')' + +-clean-files += simpleImage.*.unstrip linux.bin.ub ++$(obj)/simpleImage.$(DTB).unstrip: vmlinux FORCE ++ $(call if_changed,shipped) ++ ++$(obj)/simpleImage.$(DTB).strip: vmlinux FORCE ++ $(call if_changed,strip) +diff --git a/arch/openrisc/kernel/entry.S b/arch/openrisc/kernel/entry.S +index 0c826ad6e994..ee6159d2ed22 100644 +--- a/arch/openrisc/kernel/entry.S ++++ b/arch/openrisc/kernel/entry.S +@@ -240,7 +240,7 @@ handler: ;\ + * occured. in fact they never do. if you need them use + * values saved on stack (for SPR_EPC, SPR_ESR) or content + * of r4 (for SPR_EEAR). for details look at EXCEPTION_HANDLE() +- * in 'arch/or32/kernel/head.S' ++ * in 'arch/openrisc/kernel/head.S' + */ + + /* =====================================================[ exceptions] === */ +diff --git a/arch/openrisc/kernel/head.S b/arch/openrisc/kernel/head.S +index 9fc6b60140f0..31ed257ff061 100644 +--- a/arch/openrisc/kernel/head.S ++++ b/arch/openrisc/kernel/head.S +@@ -1728,7 +1728,7 @@ _string_nl: + + /* + * .data section should be page aligned +- * (look into arch/or32/kernel/vmlinux.lds) ++ * (look into arch/openrisc/kernel/vmlinux.lds.S) + */ + .section .data,"aw" + .align 8192 +diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile +index c4c03992ee82..dfcb698ec8f3 100644 +--- a/arch/powerpc/Makefile ++++ b/arch/powerpc/Makefile +@@ -145,7 +145,14 @@ endif + CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mcmodel=medium,$(call cc-option,-mminimal-toc)) + CFLAGS-$(CONFIG_PPC64) += $(call cc-option,-mno-pointers-to-nested-functions) + +-CFLAGS-$(CONFIG_PPC32) := -ffixed-r2 $(MULTIPLEWORD) ++# Clang unconditionally reserves r2 on ppc32 and does not support the flag ++# https://bugs.llvm.org/show_bug.cgi?id=39555 ++CFLAGS-$(CONFIG_PPC32) := $(call cc-option, -ffixed-r2) ++ ++# Clang doesn't support -mmultiple / -mno-multiple ++# https://bugs.llvm.org/show_bug.cgi?id=39556 ++CFLAGS-$(CONFIG_PPC32) += $(call cc-option, $(MULTIPLEWORD)) ++ + CFLAGS-$(CONFIG_PPC32) += $(call cc-option,-mno-readonly-in-sdata) + + ifdef CONFIG_PPC_BOOK3S_64 +diff --git a/arch/powerpc/boot/dts/bamboo.dts b/arch/powerpc/boot/dts/bamboo.dts +index 538e42b1120d..b5861fa3836c 100644 +--- a/arch/powerpc/boot/dts/bamboo.dts ++++ b/arch/powerpc/boot/dts/bamboo.dts +@@ -268,8 +268,10 @@ + /* Outbound ranges, one memory and one IO, + * later cannot be changed. Chip supports a second + * IO range but we don't use it for now ++ * The chip also supports a larger memory range but ++ * it's not naturally aligned, so our code will break + */ +- ranges = <0x02000000 0x00000000 0xa0000000 0x00000000 0xa0000000 0x00000000 0x40000000 ++ ranges = <0x02000000 0x00000000 0xa0000000 0x00000000 0xa0000000 0x00000000 0x20000000 + 0x02000000 0x00000000 0x00000000 0x00000000 0xe0000000 0x00000000 0x00100000 + 0x01000000 0x00000000 0x00000000 0x00000000 0xe8000000 0x00000000 0x00010000>; + +diff --git a/arch/powerpc/include/asm/cputable.h b/arch/powerpc/include/asm/cputable.h +index 3ce690e5f345..59b35b93eade 100644 +--- a/arch/powerpc/include/asm/cputable.h ++++ b/arch/powerpc/include/asm/cputable.h +@@ -44,6 +44,7 @@ extern int machine_check_e500(struct pt_regs *regs); + extern int machine_check_e200(struct pt_regs *regs); + extern int machine_check_47x(struct pt_regs *regs); + int machine_check_8xx(struct pt_regs *regs); ++int machine_check_83xx(struct pt_regs *regs); + + extern void cpu_down_flush_e500v2(void); + extern void cpu_down_flush_e500mc(void); +diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h +index 640a4d818772..af9971661512 100644 +--- a/arch/powerpc/include/asm/reg.h ++++ b/arch/powerpc/include/asm/reg.h +@@ -768,6 +768,8 @@ + #define SRR1_PROGTRAP 0x00020000 /* Trap */ + #define SRR1_PROGADDR 0x00010000 /* SRR0 contains subsequent addr */ + ++#define SRR1_MCE_MCP 0x00080000 /* Machine check signal caused interrupt */ ++ + #define SPRN_HSRR0 0x13A /* Save/Restore Register 0 */ + #define SPRN_HSRR1 0x13B /* Save/Restore Register 1 */ + #define HSRR1_DENORM 0x00100000 /* Denorm exception */ +diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c +index 2da01340c84c..1eab54bc6ee9 100644 +--- a/arch/powerpc/kernel/cputable.c ++++ b/arch/powerpc/kernel/cputable.c +@@ -1141,6 +1141,7 @@ static struct cpu_spec __initdata cpu_specs[] = { + .machine_check = machine_check_generic, + .platform = "ppc603", + }, ++#ifdef CONFIG_PPC_83xx + { /* e300c1 (a 603e core, plus some) on 83xx */ + .pvr_mask = 0x7fff0000, + .pvr_value = 0x00830000, +@@ -1151,7 +1152,7 @@ static struct cpu_spec __initdata cpu_specs[] = { + .icache_bsize = 32, + .dcache_bsize = 32, + .cpu_setup = __setup_cpu_603, +- .machine_check = machine_check_generic, ++ .machine_check = machine_check_83xx, + .platform = "ppc603", + }, + { /* e300c2 (an e300c1 core, plus some, minus FPU) on 83xx */ +@@ -1165,7 +1166,7 @@ static struct cpu_spec __initdata cpu_specs[] = { + .icache_bsize = 32, + .dcache_bsize = 32, + .cpu_setup = __setup_cpu_603, +- .machine_check = machine_check_generic, ++ .machine_check = machine_check_83xx, + .platform = "ppc603", + }, + { /* e300c3 (e300c1, plus one IU, half cache size) on 83xx */ +@@ -1179,7 +1180,7 @@ static struct cpu_spec __initdata cpu_specs[] = { + .icache_bsize = 32, + .dcache_bsize = 32, + .cpu_setup = __setup_cpu_603, +- .machine_check = machine_check_generic, ++ .machine_check = machine_check_83xx, + .num_pmcs = 4, + .oprofile_cpu_type = "ppc/e300", + .oprofile_type = PPC_OPROFILE_FSL_EMB, +@@ -1196,12 +1197,13 @@ static struct cpu_spec __initdata cpu_specs[] = { + .icache_bsize = 32, + .dcache_bsize = 32, + .cpu_setup = __setup_cpu_603, +- .machine_check = machine_check_generic, ++ .machine_check = machine_check_83xx, + .num_pmcs = 4, + .oprofile_cpu_type = "ppc/e300", + .oprofile_type = PPC_OPROFILE_FSL_EMB, + .platform = "ppc603", + }, ++#endif + { /* default match, we assume split I/D cache & TB (non-601)... */ + .pvr_mask = 0x00000000, + .pvr_value = 0x00000000, +diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S +index 90af86f143a9..e1dab9b1e447 100644 +--- a/arch/powerpc/kernel/exceptions-64s.S ++++ b/arch/powerpc/kernel/exceptions-64s.S +@@ -1123,7 +1123,7 @@ TRAMP_REAL_BEGIN(hmi_exception_early) + EXCEPTION_PROLOG_COMMON_2(PACA_EXGEN) + EXCEPTION_PROLOG_COMMON_3(0xe60) + addi r3,r1,STACK_FRAME_OVERHEAD +- BRANCH_LINK_TO_FAR(hmi_exception_realmode) /* Function call ABI */ ++ BRANCH_LINK_TO_FAR(DOTSYM(hmi_exception_realmode)) /* Function call ABI */ + cmpdi cr0,r3,0 + + /* Windup the stack. */ +diff --git a/arch/powerpc/kernel/prom.c b/arch/powerpc/kernel/prom.c +index c4d7078e5295..8e88f78e57db 100644 +--- a/arch/powerpc/kernel/prom.c ++++ b/arch/powerpc/kernel/prom.c +@@ -129,7 +129,7 @@ static void __init move_device_tree(void) + p = __va(memblock_alloc(size, PAGE_SIZE)); + memcpy(p, initial_boot_params, size); + initial_boot_params = p; +- DBG("Moved device tree to 0x%p\n", p); ++ DBG("Moved device tree to 0x%px\n", p); + } + + DBG("<- move_device_tree\n"); +@@ -689,7 +689,7 @@ void __init early_init_devtree(void *params) + { + phys_addr_t limit; + +- DBG(" -> early_init_devtree(%p)\n", params); ++ DBG(" -> early_init_devtree(%px)\n", params); + + /* Too early to BUG_ON(), do it by hand */ + if (!early_init_dt_verify(params)) +@@ -749,7 +749,7 @@ void __init early_init_devtree(void *params) + memblock_allow_resize(); + memblock_dump_all(); + +- DBG("Phys. mem: %llx\n", memblock_phys_mem_size()); ++ DBG("Phys. mem: %llx\n", (unsigned long long)memblock_phys_mem_size()); + + /* We may need to relocate the flat tree, do it now. + * FIXME .. and the initrd too? */ +diff --git a/arch/powerpc/mm/fault.c b/arch/powerpc/mm/fault.c +index 365526ee29b8..6e0ff8b600ce 100644 +--- a/arch/powerpc/mm/fault.c ++++ b/arch/powerpc/mm/fault.c +@@ -633,21 +633,22 @@ void bad_page_fault(struct pt_regs *regs, unsigned long address, int sig) + switch (TRAP(regs)) { + case 0x300: + case 0x380: +- printk(KERN_ALERT "Unable to handle kernel paging request for " +- "data at address 0x%08lx\n", regs->dar); ++ pr_alert("BUG: %s at 0x%08lx\n", ++ regs->dar < PAGE_SIZE ? "Kernel NULL pointer dereference" : ++ "Unable to handle kernel data access", regs->dar); + break; + case 0x400: + case 0x480: +- printk(KERN_ALERT "Unable to handle kernel paging request for " +- "instruction fetch\n"); ++ pr_alert("BUG: Unable to handle kernel instruction fetch%s", ++ regs->nip < PAGE_SIZE ? " (NULL pointer?)\n" : "\n"); + break; + case 0x600: +- printk(KERN_ALERT "Unable to handle kernel paging request for " +- "unaligned access at address 0x%08lx\n", regs->dar); ++ pr_alert("BUG: Unable to handle kernel unaligned access at 0x%08lx\n", ++ regs->dar); + break; + default: +- printk(KERN_ALERT "Unable to handle kernel paging request for " +- "unknown fault\n"); ++ pr_alert("BUG: Unable to handle unknown paging fault at 0x%08lx\n", ++ regs->dar); + break; + } + printk(KERN_ALERT "Faulting instruction address: 0x%08lx\n", +diff --git a/arch/powerpc/mm/ppc_mmu_32.c b/arch/powerpc/mm/ppc_mmu_32.c +index bea6c544e38f..06783270a124 100644 +--- a/arch/powerpc/mm/ppc_mmu_32.c ++++ b/arch/powerpc/mm/ppc_mmu_32.c +@@ -52,7 +52,7 @@ struct batrange { /* stores address ranges mapped by BATs */ + phys_addr_t v_block_mapped(unsigned long va) + { + int b; +- for (b = 0; b < 4; ++b) ++ for (b = 0; b < ARRAY_SIZE(bat_addrs); ++b) + if (va >= bat_addrs[b].start && va < bat_addrs[b].limit) + return bat_addrs[b].phys + (va - bat_addrs[b].start); + return 0; +@@ -64,7 +64,7 @@ phys_addr_t v_block_mapped(unsigned long va) + unsigned long p_block_mapped(phys_addr_t pa) + { + int b; +- for (b = 0; b < 4; ++b) ++ for (b = 0; b < ARRAY_SIZE(bat_addrs); ++b) + if (pa >= bat_addrs[b].phys + && pa < (bat_addrs[b].limit-bat_addrs[b].start) + +bat_addrs[b].phys) +diff --git a/arch/powerpc/net/bpf_jit_comp64.c b/arch/powerpc/net/bpf_jit_comp64.c +index 279a51bf94d0..7e3ab477f67f 100644 +--- a/arch/powerpc/net/bpf_jit_comp64.c ++++ b/arch/powerpc/net/bpf_jit_comp64.c +@@ -949,6 +949,19 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *fp) + goto out_addrs; + } + ++ /* ++ * If we have seen a tail call, we need a second pass. ++ * This is because bpf_jit_emit_common_epilogue() is called ++ * from bpf_jit_emit_tail_call() with a not yet stable ctx->seen. ++ */ ++ if (cgctx.seen & SEEN_TAILCALL) { ++ cgctx.idx = 0; ++ if (bpf_jit_build_body(fp, 0, &cgctx, addrs, false)) { ++ fp = org_fp; ++ goto out_addrs; ++ } ++ } ++ + /* + * Pretend to build prologue, given the features we've seen. This will + * update ctgtx.idx as it pretends to output instructions, then we can +diff --git a/arch/powerpc/perf/isa207-common.c b/arch/powerpc/perf/isa207-common.c +index 6a2f65d3d088..053b8e9aa9e7 100644 +--- a/arch/powerpc/perf/isa207-common.c ++++ b/arch/powerpc/perf/isa207-common.c +@@ -148,6 +148,14 @@ static bool is_thresh_cmp_valid(u64 event) + return true; + } + ++static unsigned int dc_ic_rld_quad_l1_sel(u64 event) ++{ ++ unsigned int cache; ++ ++ cache = (event >> EVENT_CACHE_SEL_SHIFT) & MMCR1_DC_IC_QUAL_MASK; ++ return cache; ++} ++ + static inline u64 isa207_find_source(u64 idx, u32 sub_idx) + { + u64 ret = PERF_MEM_NA; +@@ -288,10 +296,10 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp) + * have a cache selector of zero. The bank selector (bit 3) is + * irrelevant, as long as the rest of the value is 0. + */ +- if (cache & 0x7) ++ if (!cpu_has_feature(CPU_FTR_ARCH_300) && (cache & 0x7)) + return -1; + +- } else if (event & EVENT_IS_L1) { ++ } else if (cpu_has_feature(CPU_FTR_ARCH_300) || (event & EVENT_IS_L1)) { + mask |= CNST_L1_QUAL_MASK; + value |= CNST_L1_QUAL_VAL(cache); + } +@@ -394,11 +402,14 @@ int isa207_compute_mmcr(u64 event[], int n_ev, + /* In continuous sampling mode, update SDAR on TLB miss */ + mmcra_sdar_mode(event[i], &mmcra); + +- if (event[i] & EVENT_IS_L1) { +- cache = event[i] >> EVENT_CACHE_SEL_SHIFT; +- mmcr1 |= (cache & 1) << MMCR1_IC_QUAL_SHIFT; +- cache >>= 1; +- mmcr1 |= (cache & 1) << MMCR1_DC_QUAL_SHIFT; ++ if (cpu_has_feature(CPU_FTR_ARCH_300)) { ++ cache = dc_ic_rld_quad_l1_sel(event[i]); ++ mmcr1 |= (cache) << MMCR1_DC_IC_QUAL_SHIFT; ++ } else { ++ if (event[i] & EVENT_IS_L1) { ++ cache = dc_ic_rld_quad_l1_sel(event[i]); ++ mmcr1 |= (cache) << MMCR1_DC_IC_QUAL_SHIFT; ++ } + } + + if (is_event_marked(event[i])) { +diff --git a/arch/powerpc/perf/isa207-common.h b/arch/powerpc/perf/isa207-common.h +index 0028f4b9490d..e5a621699a6d 100644 +--- a/arch/powerpc/perf/isa207-common.h ++++ b/arch/powerpc/perf/isa207-common.h +@@ -163,8 +163,8 @@ + #define MMCR1_COMBINE_SHIFT(pmc) (35 - ((pmc) - 1)) + #define MMCR1_PMCSEL_SHIFT(pmc) (24 - (((pmc) - 1)) * 8) + #define MMCR1_FAB_SHIFT 36 +-#define MMCR1_DC_QUAL_SHIFT 47 +-#define MMCR1_IC_QUAL_SHIFT 46 ++#define MMCR1_DC_IC_QUAL_MASK 0x3 ++#define MMCR1_DC_IC_QUAL_SHIFT 46 + + /* MMCR1 Combine bits macro for power9 */ + #define p9_MMCR1_COMBINE_SHIFT(pmc) (38 - ((pmc - 1) * 2)) +diff --git a/arch/powerpc/platforms/83xx/misc.c b/arch/powerpc/platforms/83xx/misc.c +index d75c9816a5c9..2b6589fe812d 100644 +--- a/arch/powerpc/platforms/83xx/misc.c ++++ b/arch/powerpc/platforms/83xx/misc.c +@@ -14,6 +14,7 @@ + #include <linux/of_platform.h> + #include <linux/pci.h> + ++#include <asm/debug.h> + #include <asm/io.h> + #include <asm/hw_irq.h> + #include <asm/ipic.h> +@@ -150,3 +151,19 @@ void __init mpc83xx_setup_arch(void) + + mpc83xx_setup_pci(); + } ++ ++int machine_check_83xx(struct pt_regs *regs) ++{ ++ u32 mask = 1 << (31 - IPIC_MCP_WDT); ++ ++ if (!(regs->msr & SRR1_MCE_MCP) || !(ipic_get_mcp_status() & mask)) ++ return machine_check_generic(regs); ++ ipic_clear_mcp_status(mask); ++ ++ if (debugger_fault_handler(regs)) ++ return 1; ++ ++ die("Watchdog NMI Reset", regs, 0); ++ ++ return 1; ++} +diff --git a/arch/powerpc/platforms/powernv/eeh-powernv.c b/arch/powerpc/platforms/powernv/eeh-powernv.c +index 3c1beae29f2d..9dd5b8909178 100644 +--- a/arch/powerpc/platforms/powernv/eeh-powernv.c ++++ b/arch/powerpc/platforms/powernv/eeh-powernv.c +@@ -578,8 +578,8 @@ static void pnv_eeh_get_phb_diag(struct eeh_pe *pe) + static int pnv_eeh_get_phb_state(struct eeh_pe *pe) + { + struct pnv_phb *phb = pe->phb->private_data; +- u8 fstate; +- __be16 pcierr; ++ u8 fstate = 0; ++ __be16 pcierr = 0; + s64 rc; + int result = 0; + +@@ -617,8 +617,8 @@ static int pnv_eeh_get_phb_state(struct eeh_pe *pe) + static int pnv_eeh_get_pe_state(struct eeh_pe *pe) + { + struct pnv_phb *phb = pe->phb->private_data; +- u8 fstate; +- __be16 pcierr; ++ u8 fstate = 0; ++ __be16 pcierr = 0; + s64 rc; + int result; + +diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c +index 326ca6288bb1..ee63749a2d47 100644 +--- a/arch/powerpc/platforms/powernv/pci-ioda.c ++++ b/arch/powerpc/platforms/powernv/pci-ioda.c +@@ -605,8 +605,8 @@ static int pnv_ioda_unfreeze_pe(struct pnv_phb *phb, int pe_no, int opt) + static int pnv_ioda_get_pe_state(struct pnv_phb *phb, int pe_no) + { + struct pnv_ioda_pe *slave, *pe; +- u8 fstate, state; +- __be16 pcierr; ++ u8 fstate = 0, state; ++ __be16 pcierr = 0; + s64 rc; + + /* Sanity check on PE number */ +diff --git a/arch/powerpc/platforms/powernv/pci.c b/arch/powerpc/platforms/powernv/pci.c +index 13aef2323bbc..db230a35609b 100644 +--- a/arch/powerpc/platforms/powernv/pci.c ++++ b/arch/powerpc/platforms/powernv/pci.c +@@ -602,8 +602,8 @@ static void pnv_pci_handle_eeh_config(struct pnv_phb *phb, u32 pe_no) + static void pnv_pci_config_check_eeh(struct pci_dn *pdn) + { + struct pnv_phb *phb = pdn->phb->private_data; +- u8 fstate; +- __be16 pcierr; ++ u8 fstate = 0; ++ __be16 pcierr = 0; + unsigned int pe_no; + s64 rc; + +diff --git a/arch/powerpc/platforms/pseries/dlpar.c b/arch/powerpc/platforms/pseries/dlpar.c +index e3010b14aea5..c5ffcadab730 100644 +--- a/arch/powerpc/platforms/pseries/dlpar.c ++++ b/arch/powerpc/platforms/pseries/dlpar.c +@@ -63,6 +63,10 @@ static struct property *dlpar_parse_cc_property(struct cc_workarea *ccwa) + + name = (char *)ccwa + be32_to_cpu(ccwa->name_offset); + prop->name = kstrdup(name, GFP_KERNEL); ++ if (!prop->name) { ++ dlpar_free_cc_property(prop); ++ return NULL; ++ } + + prop->length = be32_to_cpu(ccwa->prop_length); + value = (char *)ccwa + be32_to_cpu(ccwa->prop_offset); +diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c +index d93ff494e778..7f86bc3eaade 100644 +--- a/arch/powerpc/platforms/pseries/hotplug-memory.c ++++ b/arch/powerpc/platforms/pseries/hotplug-memory.c +@@ -202,6 +202,7 @@ static int update_lmb_associativity_index(struct drmem_lmb *lmb) + + aa_index = find_aa_index(dr_node, ala_prop, lmb_assoc); + ++ of_node_put(dr_node); + dlpar_free_cc_nodes(lmb_node); + + if (aa_index < 0) { +diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c +index bb5db7bfd853..f0fa22e7d36c 100644 +--- a/arch/powerpc/xmon/xmon.c ++++ b/arch/powerpc/xmon/xmon.c +@@ -3493,7 +3493,7 @@ void dump_segments(void) + + printf("sr0-15 ="); + for (i = 0; i < 16; ++i) +- printf(" %x", mfsrin(i)); ++ printf(" %x", mfsrin(i << 28)); + printf("\n"); + } + #endif +diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c +index 3c317bc6b799..db3196aebaa1 100644 +--- a/arch/s390/kvm/kvm-s390.c ++++ b/arch/s390/kvm/kvm-s390.c +@@ -416,19 +416,30 @@ static void kvm_s390_cpu_feat_init(void) + + int kvm_arch_init(void *opaque) + { ++ int rc; ++ + kvm_s390_dbf = debug_register("kvm-trace", 32, 1, 7 * sizeof(long)); + if (!kvm_s390_dbf) + return -ENOMEM; + + if (debug_register_view(kvm_s390_dbf, &debug_sprintf_view)) { +- debug_unregister(kvm_s390_dbf); +- return -ENOMEM; ++ rc = -ENOMEM; ++ goto out_debug_unreg; + } + + kvm_s390_cpu_feat_init(); + + /* Register floating interrupt controller interface. */ +- return kvm_register_device_ops(&kvm_flic_ops, KVM_DEV_TYPE_FLIC); ++ rc = kvm_register_device_ops(&kvm_flic_ops, KVM_DEV_TYPE_FLIC); ++ if (rc) { ++ pr_err("Failed to register FLIC rc=%d\n", rc); ++ goto out_debug_unreg; ++ } ++ return 0; ++ ++out_debug_unreg: ++ debug_unregister(kvm_s390_dbf); ++ return rc; + } + + void kvm_arch_exit(void) +diff --git a/arch/s390/mm/gup.c b/arch/s390/mm/gup.c +index 2809d11c7a28..9b5b866d8adf 100644 +--- a/arch/s390/mm/gup.c ++++ b/arch/s390/mm/gup.c +@@ -39,7 +39,8 @@ static inline int gup_pte_range(pmd_t *pmdp, pmd_t pmd, unsigned long addr, + VM_BUG_ON(!pfn_valid(pte_pfn(pte))); + page = pte_page(pte); + head = compound_head(page); +- if (!page_cache_get_speculative(head)) ++ if (unlikely(WARN_ON_ONCE(page_ref_count(head) < 0) ++ || !page_cache_get_speculative(head))) + return 0; + if (unlikely(pte_val(pte) != pte_val(*ptep))) { + put_page(head); +@@ -77,7 +78,8 @@ static inline int gup_huge_pmd(pmd_t *pmdp, pmd_t pmd, unsigned long addr, + refs++; + } while (addr += PAGE_SIZE, addr != end); + +- if (!page_cache_add_speculative(head, refs)) { ++ if (unlikely(WARN_ON_ONCE(page_ref_count(head) < 0) ++ || !page_cache_add_speculative(head, refs))) { + *nr -= refs; + return 0; + } +@@ -151,7 +153,8 @@ static int gup_huge_pud(pud_t *pudp, pud_t pud, unsigned long addr, + refs++; + } while (addr += PAGE_SIZE, addr != end); + +- if (!page_cache_add_speculative(head, refs)) { ++ if (unlikely(WARN_ON_ONCE(page_ref_count(head) < 0) ++ || !page_cache_add_speculative(head, refs))) { + *nr -= refs; + return 0; + } +diff --git a/arch/um/Kconfig.debug b/arch/um/Kconfig.debug +index 2014597605ea..85726eeec345 100644 +--- a/arch/um/Kconfig.debug ++++ b/arch/um/Kconfig.debug +@@ -16,6 +16,7 @@ config GPROF + config GCOV + bool "Enable gcov support" + depends on DEBUG_INFO ++ depends on !KCOV + help + This option allows developers to retrieve coverage data from a UML + session. +diff --git a/arch/um/drivers/vector_user.c b/arch/um/drivers/vector_user.c +index 4d6a78e31089..00c4c2735a5f 100644 +--- a/arch/um/drivers/vector_user.c ++++ b/arch/um/drivers/vector_user.c +@@ -30,6 +30,7 @@ + #include <stdlib.h> + #include <os.h> + #include <um_malloc.h> ++#include <sys/uio.h> + #include "vector_user.h" + + #define ID_GRE 0 +diff --git a/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c b/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c +index c8b72aff55e0..2052e1e6a11c 100644 +--- a/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c ++++ b/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c +@@ -459,6 +459,10 @@ int rdtgroup_mondata_show(struct seq_file *m, void *arg) + int ret = 0; + + rdtgrp = rdtgroup_kn_lock_live(of->kn); ++ if (!rdtgrp) { ++ ret = -ENOENT; ++ goto out; ++ } + + md.priv = of->kn->priv; + resid = md.u.rid; +diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c +index e83a057564d1..173e915e11d5 100644 +--- a/arch/x86/kernel/kprobes/core.c ++++ b/arch/x86/kernel/kprobes/core.c +@@ -1140,6 +1140,12 @@ bool arch_within_kprobe_blacklist(unsigned long addr) + is_in_entry_trampoline_section; + } + ++int __init arch_populate_kprobe_blacklist(void) ++{ ++ return kprobe_add_area_blacklist((unsigned long)__entry_text_start, ++ (unsigned long)__entry_text_end); ++} ++ + int __init arch_init_kprobes(void) + { + return 0; +diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c +index 0b7559bf15ea..fa2abed1a14d 100644 +--- a/arch/x86/kvm/vmx.c ++++ b/arch/x86/kvm/vmx.c +@@ -3404,9 +3404,6 @@ static void setup_msrs(struct vcpu_vmx *vmx) + index = __find_msr_index(vmx, MSR_CSTAR); + if (index >= 0) + move_msr_up(vmx, index, save_nmsrs++); +- index = __find_msr_index(vmx, MSR_TSC_AUX); +- if (index >= 0 && guest_cpuid_has(&vmx->vcpu, X86_FEATURE_RDTSCP)) +- move_msr_up(vmx, index, save_nmsrs++); + /* + * MSR_STAR is only needed on long mode guests, and only + * if efer.sce is enabled. +@@ -3419,6 +3416,9 @@ static void setup_msrs(struct vcpu_vmx *vmx) + index = __find_msr_index(vmx, MSR_EFER); + if (index >= 0 && update_transition_efer(vmx, index)) + move_msr_up(vmx, index, save_nmsrs++); ++ index = __find_msr_index(vmx, MSR_TSC_AUX); ++ if (index >= 0 && guest_cpuid_has(&vmx->vcpu, X86_FEATURE_RDTSCP)) ++ move_msr_up(vmx, index, save_nmsrs++); + + vmx->save_nmsrs = save_nmsrs; + vmx->guest_msrs_dirty = true; +@@ -11013,10 +11013,6 @@ static void vmx_switch_vmcs(struct kvm_vcpu *vcpu, struct loaded_vmcs *vmcs) + vmx->loaded_vmcs = vmcs; + vmx_vcpu_load(vcpu, cpu); + put_cpu(); +- +- vm_entry_controls_reset_shadow(vmx); +- vm_exit_controls_reset_shadow(vmx); +- vmx_segment_cache_clear(vmx); + } + + /* +@@ -12694,9 +12690,6 @@ static int enter_vmx_non_root_mode(struct kvm_vcpu *vcpu, u32 *exit_qual) + if (likely(!evaluate_pending_interrupts) && kvm_vcpu_apicv_active(vcpu)) + evaluate_pending_interrupts |= vmx_has_apicv_interrupt(vcpu); + +- if (from_vmentry && check_vmentry_postreqs(vcpu, vmcs12, exit_qual)) +- return EXIT_REASON_INVALID_STATE; +- + enter_guest_mode(vcpu); + + if (!(vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS)) +@@ -12706,6 +12699,7 @@ static int enter_vmx_non_root_mode(struct kvm_vcpu *vcpu, u32 *exit_qual) + vmx->nested.vmcs01_guest_bndcfgs = vmcs_read64(GUEST_BNDCFGS); + + vmx_switch_vmcs(vcpu, &vmx->nested.vmcs02); ++ vmx_segment_cache_clear(vmx); + + if (vmcs12->cpu_based_vm_exec_control & CPU_BASED_USE_TSC_OFFSETING) + vcpu->arch.tsc_offset += vmcs12->tsc_offset; +@@ -12839,6 +12833,13 @@ static int nested_vmx_run(struct kvm_vcpu *vcpu, bool launch) + */ + skip_emulated_instruction(vcpu); + ++ ret = check_vmentry_postreqs(vcpu, vmcs12, &exit_qual); ++ if (ret) { ++ nested_vmx_entry_failure(vcpu, vmcs12, ++ EXIT_REASON_INVALID_STATE, exit_qual); ++ return 1; ++ } ++ + /* + * We're finally done with prerequisite checking, and can start with + * the nested entry. +@@ -13529,6 +13530,9 @@ static void nested_vmx_vmexit(struct kvm_vcpu *vcpu, u32 exit_reason, + } + + vmx_switch_vmcs(vcpu, &vmx->vmcs01); ++ vm_entry_controls_reset_shadow(vmx); ++ vm_exit_controls_reset_shadow(vmx); ++ vmx_segment_cache_clear(vmx); + + /* Update any VMCS fields that might have changed while L2 ran */ + vmcs_write32(VM_EXIT_MSR_LOAD_COUNT, vmx->msr_autoload.host.nr); +diff --git a/arch/x86/xen/xen-asm_64.S b/arch/x86/xen/xen-asm_64.S +index 3a6feed76dfc..a93d8a7cef26 100644 +--- a/arch/x86/xen/xen-asm_64.S ++++ b/arch/x86/xen/xen-asm_64.S +@@ -12,6 +12,7 @@ + #include <asm/segment.h> + #include <asm/asm-offsets.h> + #include <asm/thread_info.h> ++#include <asm/asm.h> + + #include <xen/interface/xen.h> + +@@ -24,6 +25,7 @@ ENTRY(xen_\name) + pop %r11 + jmp \name + END(xen_\name) ++_ASM_NOKPROBE(xen_\name) + .endm + + xen_pv_trap divide_error +diff --git a/crypto/crypto_user.c b/crypto/crypto_user.c +index 3cca814348a2..74cb166097cd 100644 +--- a/crypto/crypto_user.c ++++ b/crypto/crypto_user.c +@@ -296,30 +296,33 @@ drop_alg: + + static int crypto_dump_report(struct sk_buff *skb, struct netlink_callback *cb) + { +- struct crypto_alg *alg; ++ const size_t start_pos = cb->args[0]; ++ size_t pos = 0; + struct crypto_dump_info info; +- int err; +- +- if (cb->args[0]) +- goto out; +- +- cb->args[0] = 1; ++ struct crypto_alg *alg; ++ int res; + + info.in_skb = cb->skb; + info.out_skb = skb; + info.nlmsg_seq = cb->nlh->nlmsg_seq; + info.nlmsg_flags = NLM_F_MULTI; + ++ down_read(&crypto_alg_sem); + list_for_each_entry(alg, &crypto_alg_list, cra_list) { +- err = crypto_report_alg(alg, &info); +- if (err) +- goto out_err; ++ if (pos >= start_pos) { ++ res = crypto_report_alg(alg, &info); ++ if (res == -EMSGSIZE) ++ break; ++ if (res) ++ goto out; ++ } ++ pos++; + } +- ++ cb->args[0] = pos; ++ res = skb->len; + out: +- return skb->len; +-out_err: +- return err; ++ up_read(&crypto_alg_sem); ++ return res; + } + + static int crypto_dump_report_done(struct netlink_callback *cb) +@@ -503,7 +506,7 @@ static int crypto_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, + if ((type == (CRYPTO_MSG_GETALG - CRYPTO_MSG_BASE) && + (nlh->nlmsg_flags & NLM_F_DUMP))) { + struct crypto_alg *alg; +- u16 dump_alloc = 0; ++ unsigned long dump_alloc = 0; + + if (link->dump == NULL) + return -EINVAL; +@@ -511,16 +514,16 @@ static int crypto_user_rcv_msg(struct sk_buff *skb, struct nlmsghdr *nlh, + down_read(&crypto_alg_sem); + list_for_each_entry(alg, &crypto_alg_list, cra_list) + dump_alloc += CRYPTO_REPORT_MAXSIZE; ++ up_read(&crypto_alg_sem); + + { + struct netlink_dump_control c = { + .dump = link->dump, + .done = link->done, +- .min_dump_alloc = dump_alloc, ++ .min_dump_alloc = min(dump_alloc, 65535UL), + }; + err = netlink_dump_start(crypto_nlsk, skb, nlh, &c); + } +- up_read(&crypto_alg_sem); + + return err; + } +diff --git a/drivers/acpi/acpi_lpss.c b/drivers/acpi/acpi_lpss.c +index b21c241aaab9..30ccd94f87d2 100644 +--- a/drivers/acpi/acpi_lpss.c ++++ b/drivers/acpi/acpi_lpss.c +@@ -665,12 +665,7 @@ static int acpi_lpss_create_device(struct acpi_device *adev, + * have _PS0 and _PS3 without _PSC (and no power resources), so + * acpi_bus_init_power() will assume that the BIOS has put them into D0. + */ +- ret = acpi_device_fix_up_power(adev); +- if (ret) { +- /* Skip the device, but continue the namespace scan. */ +- ret = 0; +- goto err_out; +- } ++ acpi_device_fix_up_power(adev); + + adev->driver_data = pdata; + pdev = acpi_create_platform_device(adev, dev_desc->properties); +diff --git a/drivers/acpi/apei/ghes.c b/drivers/acpi/apei/ghes.c +index f008ba7c9ced..73177b8a07bd 100644 +--- a/drivers/acpi/apei/ghes.c ++++ b/drivers/acpi/apei/ghes.c +@@ -33,7 +33,6 @@ + #include <linux/interrupt.h> + #include <linux/timer.h> + #include <linux/cper.h> +-#include <linux/kdebug.h> + #include <linux/platform_device.h> + #include <linux/mutex.h> + #include <linux/ratelimit.h> +@@ -171,40 +170,40 @@ static int ghes_estatus_pool_init(void) + return 0; + } + +-static void ghes_estatus_pool_free_chunk_page(struct gen_pool *pool, ++static void ghes_estatus_pool_free_chunk(struct gen_pool *pool, + struct gen_pool_chunk *chunk, + void *data) + { +- free_page(chunk->start_addr); ++ vfree((void *)chunk->start_addr); + } + + static void ghes_estatus_pool_exit(void) + { + gen_pool_for_each_chunk(ghes_estatus_pool, +- ghes_estatus_pool_free_chunk_page, NULL); ++ ghes_estatus_pool_free_chunk, NULL); + gen_pool_destroy(ghes_estatus_pool); + } + + static int ghes_estatus_pool_expand(unsigned long len) + { +- unsigned long i, pages, size, addr; +- int ret; ++ unsigned long size, addr; + + ghes_estatus_pool_size_request += PAGE_ALIGN(len); + size = gen_pool_size(ghes_estatus_pool); + if (size >= ghes_estatus_pool_size_request) + return 0; +- pages = (ghes_estatus_pool_size_request - size) / PAGE_SIZE; +- for (i = 0; i < pages; i++) { +- addr = __get_free_page(GFP_KERNEL); +- if (!addr) +- return -ENOMEM; +- ret = gen_pool_add(ghes_estatus_pool, addr, PAGE_SIZE, -1); +- if (ret) +- return ret; +- } + +- return 0; ++ addr = (unsigned long)vmalloc(PAGE_ALIGN(len)); ++ if (!addr) ++ return -ENOMEM; ++ ++ /* ++ * New allocation must be visible in all pgd before it can be found by ++ * an NMI allocating from the pool. ++ */ ++ vmalloc_sync_all(); ++ ++ return gen_pool_add(ghes_estatus_pool, addr, PAGE_ALIGN(len), -1); + } + + static int map_gen_v2(struct ghes *ghes) +@@ -949,7 +948,6 @@ static int ghes_notify_nmi(unsigned int cmd, struct pt_regs *regs) + + sev = ghes_severity(ghes->estatus->error_severity); + if (sev >= GHES_SEV_PANIC) { +- oops_begin(); + ghes_print_queued_estatus(); + __ghes_panic(ghes); + } +diff --git a/drivers/ata/ahci_mvebu.c b/drivers/ata/ahci_mvebu.c +index f9cb51be38eb..a54214291481 100644 +--- a/drivers/ata/ahci_mvebu.c ++++ b/drivers/ata/ahci_mvebu.c +@@ -28,6 +28,10 @@ + #define AHCI_WINDOW_BASE(win) (0x64 + ((win) << 4)) + #define AHCI_WINDOW_SIZE(win) (0x68 + ((win) << 4)) + ++struct ahci_mvebu_plat_data { ++ int (*plat_config)(struct ahci_host_priv *hpriv); ++}; ++ + static void ahci_mvebu_mbus_config(struct ahci_host_priv *hpriv, + const struct mbus_dram_target_info *dram) + { +@@ -62,6 +66,22 @@ static void ahci_mvebu_regret_option(struct ahci_host_priv *hpriv) + writel(0x80, hpriv->mmio + AHCI_VENDOR_SPECIFIC_0_DATA); + } + ++static int ahci_mvebu_armada_380_config(struct ahci_host_priv *hpriv) ++{ ++ const struct mbus_dram_target_info *dram; ++ int rc = 0; ++ ++ dram = mv_mbus_dram_info(); ++ if (dram) ++ ahci_mvebu_mbus_config(hpriv, dram); ++ else ++ rc = -ENODEV; ++ ++ ahci_mvebu_regret_option(hpriv); ++ ++ return rc; ++} ++ + /** + * ahci_mvebu_stop_engine + * +@@ -126,13 +146,10 @@ static int ahci_mvebu_resume(struct platform_device *pdev) + { + struct ata_host *host = platform_get_drvdata(pdev); + struct ahci_host_priv *hpriv = host->private_data; +- const struct mbus_dram_target_info *dram; ++ const struct ahci_mvebu_plat_data *pdata = hpriv->plat_data; + +- dram = mv_mbus_dram_info(); +- if (dram) +- ahci_mvebu_mbus_config(hpriv, dram); +- +- ahci_mvebu_regret_option(hpriv); ++ if (pdata->plat_config) ++ pdata->plat_config(hpriv); + + return ahci_platform_resume_host(&pdev->dev); + } +@@ -154,28 +171,31 @@ static struct scsi_host_template ahci_platform_sht = { + + static int ahci_mvebu_probe(struct platform_device *pdev) + { ++ const struct ahci_mvebu_plat_data *pdata; + struct ahci_host_priv *hpriv; +- const struct mbus_dram_target_info *dram; + int rc; + ++ pdata = of_device_get_match_data(&pdev->dev); ++ if (!pdata) ++ return -EINVAL; ++ + hpriv = ahci_platform_get_resources(pdev, 0); + if (IS_ERR(hpriv)) + return PTR_ERR(hpriv); + ++ hpriv->plat_data = (void *)pdata; ++ + rc = ahci_platform_enable_resources(hpriv); + if (rc) + return rc; + + hpriv->stop_engine = ahci_mvebu_stop_engine; + +- if (of_device_is_compatible(pdev->dev.of_node, +- "marvell,armada-380-ahci")) { +- dram = mv_mbus_dram_info(); +- if (!dram) +- return -ENODEV; +- +- ahci_mvebu_mbus_config(hpriv, dram); +- ahci_mvebu_regret_option(hpriv); ++ pdata = hpriv->plat_data; ++ if (pdata->plat_config) { ++ rc = pdata->plat_config(hpriv); ++ if (rc) ++ goto disable_resources; + } + + rc = ahci_platform_init_host(pdev, hpriv, &ahci_mvebu_port_info, +@@ -190,9 +210,23 @@ disable_resources: + return rc; + } + ++static const struct ahci_mvebu_plat_data ahci_mvebu_armada_380_plat_data = { ++ .plat_config = ahci_mvebu_armada_380_config, ++}; ++ ++static const struct ahci_mvebu_plat_data ahci_mvebu_armada_3700_plat_data = { ++ .plat_config = NULL, ++}; ++ + static const struct of_device_id ahci_mvebu_of_match[] = { +- { .compatible = "marvell,armada-380-ahci", }, +- { .compatible = "marvell,armada-3700-ahci", }, ++ { ++ .compatible = "marvell,armada-380-ahci", ++ .data = &ahci_mvebu_armada_380_plat_data, ++ }, ++ { ++ .compatible = "marvell,armada-3700-ahci", ++ .data = &ahci_mvebu_armada_3700_plat_data, ++ }, + { }, + }; + MODULE_DEVICE_TABLE(of, ahci_mvebu_of_match); +diff --git a/drivers/base/platform.c b/drivers/base/platform.c +index dff82a3c2caa..e9be1f56929a 100644 +--- a/drivers/base/platform.c ++++ b/drivers/base/platform.c +@@ -26,6 +26,7 @@ + #include <linux/clk/clk-conf.h> + #include <linux/limits.h> + #include <linux/property.h> ++#include <linux/kmemleak.h> + + #include "base.h" + #include "power/power.h" +@@ -525,6 +526,8 @@ struct platform_device *platform_device_register_full( + if (!pdev->dev.dma_mask) + goto err; + ++ kmemleak_ignore(pdev->dev.dma_mask); ++ + *pdev->dev.dma_mask = pdevinfo->dma_mask; + pdev->dev.coherent_dma_mask = pdevinfo->dma_mask; + } +diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c +index ef8212a4b73e..a49a8d91a599 100644 +--- a/drivers/block/drbd/drbd_main.c ++++ b/drivers/block/drbd/drbd_main.c +@@ -796,7 +796,6 @@ int __drbd_send_protocol(struct drbd_connection *connection, enum drbd_packet cm + + if (nc->tentative && connection->agreed_pro_version < 92) { + rcu_read_unlock(); +- mutex_unlock(&sock->mutex); + drbd_err(connection, "--dry-run is not supported by peer"); + return -EOPNOTSUPP; + } +diff --git a/drivers/block/drbd/drbd_nl.c b/drivers/block/drbd/drbd_nl.c +index 319fabdd63a3..5b15ffd0c7f5 100644 +--- a/drivers/block/drbd/drbd_nl.c ++++ b/drivers/block/drbd/drbd_nl.c +@@ -1515,6 +1515,30 @@ static void sanitize_disk_conf(struct drbd_device *device, struct disk_conf *dis + } + } + ++static int disk_opts_check_al_size(struct drbd_device *device, struct disk_conf *dc) ++{ ++ int err = -EBUSY; ++ ++ if (device->act_log && ++ device->act_log->nr_elements == dc->al_extents) ++ return 0; ++ ++ drbd_suspend_io(device); ++ /* If IO completion is currently blocked, we would likely wait ++ * "forever" for the activity log to become unused. So we don't. */ ++ if (atomic_read(&device->ap_bio_cnt)) ++ goto out; ++ ++ wait_event(device->al_wait, lc_try_lock(device->act_log)); ++ drbd_al_shrink(device); ++ err = drbd_check_al_size(device, dc); ++ lc_unlock(device->act_log); ++ wake_up(&device->al_wait); ++out: ++ drbd_resume_io(device); ++ return err; ++} ++ + int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info) + { + struct drbd_config_context adm_ctx; +@@ -1577,15 +1601,12 @@ int drbd_adm_disk_opts(struct sk_buff *skb, struct genl_info *info) + } + } + +- drbd_suspend_io(device); +- wait_event(device->al_wait, lc_try_lock(device->act_log)); +- drbd_al_shrink(device); +- err = drbd_check_al_size(device, new_disk_conf); +- lc_unlock(device->act_log); +- wake_up(&device->al_wait); +- drbd_resume_io(device); +- ++ err = disk_opts_check_al_size(device, new_disk_conf); + if (err) { ++ /* Could be just "busy". Ignore? ++ * Introduce dedicated error code? */ ++ drbd_msg_put_info(adm_ctx.reply_skb, ++ "Try again without changing current al-extents setting"); + retcode = ERR_NOMEM; + goto fail_unlock; + } +@@ -1935,9 +1956,9 @@ int drbd_adm_attach(struct sk_buff *skb, struct genl_info *info) + } + } + +- if (device->state.conn < C_CONNECTED && +- device->state.role == R_PRIMARY && device->ed_uuid && +- (device->ed_uuid & ~((u64)1)) != (nbc->md.uuid[UI_CURRENT] & ~((u64)1))) { ++ if (device->state.pdsk != D_UP_TO_DATE && device->ed_uuid && ++ (device->state.role == R_PRIMARY || device->state.peer == R_PRIMARY) && ++ (device->ed_uuid & ~((u64)1)) != (nbc->md.uuid[UI_CURRENT] & ~((u64)1))) { + drbd_err(device, "Can only attach to data with current UUID=%016llX\n", + (unsigned long long)device->ed_uuid); + retcode = ERR_DATA_NOT_CURRENT; +diff --git a/drivers/block/drbd/drbd_receiver.c b/drivers/block/drbd/drbd_receiver.c +index 3cdadf75c82d..cbb6ef719978 100644 +--- a/drivers/block/drbd/drbd_receiver.c ++++ b/drivers/block/drbd/drbd_receiver.c +@@ -3980,6 +3980,7 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info + struct o_qlim *o = (connection->agreed_features & DRBD_FF_WSAME) ? p->qlim : NULL; + enum determine_dev_size dd = DS_UNCHANGED; + sector_t p_size, p_usize, p_csize, my_usize; ++ sector_t new_size, cur_size; + int ldsc = 0; /* local disk size changed */ + enum dds_flags ddsf; + +@@ -3987,6 +3988,7 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info + if (!peer_device) + return config_unknown_volume(connection, pi); + device = peer_device->device; ++ cur_size = drbd_get_capacity(device->this_bdev); + + p_size = be64_to_cpu(p->d_size); + p_usize = be64_to_cpu(p->u_size); +@@ -3997,7 +3999,6 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info + device->p_size = p_size; + + if (get_ldev(device)) { +- sector_t new_size, cur_size; + rcu_read_lock(); + my_usize = rcu_dereference(device->ldev->disk_conf)->disk_size; + rcu_read_unlock(); +@@ -4015,7 +4016,6 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info + /* Never shrink a device with usable data during connect. + But allow online shrinking if we are connected. */ + new_size = drbd_new_dev_size(device, device->ldev, p_usize, 0); +- cur_size = drbd_get_capacity(device->this_bdev); + if (new_size < cur_size && + device->state.disk >= D_OUTDATED && + device->state.conn < C_CONNECTED) { +@@ -4080,9 +4080,36 @@ static int receive_sizes(struct drbd_connection *connection, struct packet_info + * + * However, if he sends a zero current size, + * take his (user-capped or) backing disk size anyways. ++ * ++ * Unless of course he does not have a disk himself. ++ * In which case we ignore this completely. + */ ++ sector_t new_size = p_csize ?: p_usize ?: p_size; + drbd_reconsider_queue_parameters(device, NULL, o); +- drbd_set_my_capacity(device, p_csize ?: p_usize ?: p_size); ++ if (new_size == 0) { ++ /* Ignore, peer does not know nothing. */ ++ } else if (new_size == cur_size) { ++ /* nothing to do */ ++ } else if (cur_size != 0 && p_size == 0) { ++ drbd_warn(device, "Ignored diskless peer device size (peer:%llu != me:%llu sectors)!\n", ++ (unsigned long long)new_size, (unsigned long long)cur_size); ++ } else if (new_size < cur_size && device->state.role == R_PRIMARY) { ++ drbd_err(device, "The peer's device size is too small! (%llu < %llu sectors); demote me first!\n", ++ (unsigned long long)new_size, (unsigned long long)cur_size); ++ conn_request_state(peer_device->connection, NS(conn, C_DISCONNECTING), CS_HARD); ++ return -EIO; ++ } else { ++ /* I believe the peer, if ++ * - I don't have a current size myself ++ * - we agree on the size anyways ++ * - I do have a current size, am Secondary, ++ * and he has the only disk ++ * - I do have a current size, am Primary, ++ * and he has the only disk, ++ * which is larger than my current size ++ */ ++ drbd_set_my_capacity(device, new_size); ++ } + } + + if (get_ldev(device)) { +@@ -4368,6 +4395,25 @@ static int receive_state(struct drbd_connection *connection, struct packet_info + if (peer_state.conn == C_AHEAD) + ns.conn = C_BEHIND; + ++ /* TODO: ++ * if (primary and diskless and peer uuid != effective uuid) ++ * abort attach on peer; ++ * ++ * If this node does not have good data, was already connected, but ++ * the peer did a late attach only now, trying to "negotiate" with me, ++ * AND I am currently Primary, possibly frozen, with some specific ++ * "effective" uuid, this should never be reached, really, because ++ * we first send the uuids, then the current state. ++ * ++ * In this scenario, we already dropped the connection hard ++ * when we received the unsuitable uuids (receive_uuids(). ++ * ++ * Should we want to change this, that is: not drop the connection in ++ * receive_uuids() already, then we would need to add a branch here ++ * that aborts the attach of "unsuitable uuids" on the peer in case ++ * this node is currently Diskless Primary. ++ */ ++ + if (device->p_uuid && peer_state.disk >= D_NEGOTIATING && + get_ldev_if_state(device, D_NEGOTIATING)) { + int cr; /* consider resync */ +diff --git a/drivers/block/drbd/drbd_state.h b/drivers/block/drbd/drbd_state.h +index ea58301d0895..b2a390ba73a0 100644 +--- a/drivers/block/drbd/drbd_state.h ++++ b/drivers/block/drbd/drbd_state.h +@@ -131,7 +131,7 @@ extern enum drbd_state_rv _drbd_set_state(struct drbd_device *, union drbd_state + enum chg_state_flags, + struct completion *done); + extern void print_st_err(struct drbd_device *, union drbd_state, +- union drbd_state, int); ++ union drbd_state, enum drbd_state_rv); + + enum drbd_state_rv + _conn_request_state(struct drbd_connection *connection, union drbd_state mask, union drbd_state val, +diff --git a/drivers/bluetooth/hci_bcm.c b/drivers/bluetooth/hci_bcm.c +index aa6b7ed9fdf1..59e5fc5eec8f 100644 +--- a/drivers/bluetooth/hci_bcm.c ++++ b/drivers/bluetooth/hci_bcm.c +@@ -51,6 +51,12 @@ + #define BCM_LM_DIAG_PKT 0x07 + #define BCM_LM_DIAG_SIZE 63 + ++#define BCM_TYPE49_PKT 0x31 ++#define BCM_TYPE49_SIZE 0 ++ ++#define BCM_TYPE52_PKT 0x34 ++#define BCM_TYPE52_SIZE 0 ++ + #define BCM_AUTOSUSPEND_DELAY 5000 /* default autosleep delay */ + + /** +@@ -564,12 +570,28 @@ finalize: + .lsize = 0, \ + .maxlen = BCM_NULL_SIZE + ++#define BCM_RECV_TYPE49 \ ++ .type = BCM_TYPE49_PKT, \ ++ .hlen = BCM_TYPE49_SIZE, \ ++ .loff = 0, \ ++ .lsize = 0, \ ++ .maxlen = BCM_TYPE49_SIZE ++ ++#define BCM_RECV_TYPE52 \ ++ .type = BCM_TYPE52_PKT, \ ++ .hlen = BCM_TYPE52_SIZE, \ ++ .loff = 0, \ ++ .lsize = 0, \ ++ .maxlen = BCM_TYPE52_SIZE ++ + static const struct h4_recv_pkt bcm_recv_pkts[] = { + { H4_RECV_ACL, .recv = hci_recv_frame }, + { H4_RECV_SCO, .recv = hci_recv_frame }, + { H4_RECV_EVENT, .recv = hci_recv_frame }, + { BCM_RECV_LM_DIAG, .recv = hci_recv_diag }, + { BCM_RECV_NULL, .recv = hci_recv_diag }, ++ { BCM_RECV_TYPE49, .recv = hci_recv_diag }, ++ { BCM_RECV_TYPE52, .recv = hci_recv_diag }, + }; + + static int bcm_recv(struct hci_uart *hu, const void *data, int count) +diff --git a/drivers/bus/ti-sysc.c b/drivers/bus/ti-sysc.c +index e95b26319cd9..5b31131d0cba 100644 +--- a/drivers/bus/ti-sysc.c ++++ b/drivers/bus/ti-sysc.c +@@ -91,6 +91,9 @@ struct sysc { + struct delayed_work idle_work; + }; + ++static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np, ++ bool is_child); ++ + void sysc_write(struct sysc *ddata, int offset, u32 value) + { + writel_relaxed(value, ddata->module_va + offset); +@@ -374,6 +377,7 @@ static int sysc_check_one_child(struct sysc *ddata, + dev_warn(ddata->dev, "really a child ti,hwmods property?"); + + sysc_check_quirk_stdout(ddata, np); ++ sysc_parse_dts_quirks(ddata, np, true); + + return 0; + } +@@ -1343,23 +1347,37 @@ static const struct sysc_dts_quirk sysc_dts_quirks[] = { + .mask = SYSC_QUIRK_NO_RESET_ON_INIT, }, + }; + +-static int sysc_init_dts_quirks(struct sysc *ddata) ++static void sysc_parse_dts_quirks(struct sysc *ddata, struct device_node *np, ++ bool is_child) + { +- struct device_node *np = ddata->dev->of_node; + const struct property *prop; +- int i, len, error; +- u32 val; +- +- ddata->legacy_mode = of_get_property(np, "ti,hwmods", NULL); ++ int i, len; + + for (i = 0; i < ARRAY_SIZE(sysc_dts_quirks); i++) { +- prop = of_get_property(np, sysc_dts_quirks[i].name, &len); ++ const char *name = sysc_dts_quirks[i].name; ++ ++ prop = of_get_property(np, name, &len); + if (!prop) + continue; + + ddata->cfg.quirks |= sysc_dts_quirks[i].mask; ++ if (is_child) { ++ dev_warn(ddata->dev, ++ "dts flag should be at module level for %s\n", ++ name); ++ } + } ++} ++ ++static int sysc_init_dts_quirks(struct sysc *ddata) ++{ ++ struct device_node *np = ddata->dev->of_node; ++ int error; ++ u32 val; ++ ++ ddata->legacy_mode = of_get_property(np, "ti,hwmods", NULL); + ++ sysc_parse_dts_quirks(ddata, np, false); + error = of_property_read_u32(np, "ti,sysc-delay-us", &val); + if (!error) { + if (val > 255) { +diff --git a/drivers/char/hw_random/stm32-rng.c b/drivers/char/hw_random/stm32-rng.c +index 042860d97b15..37b338a76ba4 100644 +--- a/drivers/char/hw_random/stm32-rng.c ++++ b/drivers/char/hw_random/stm32-rng.c +@@ -169,6 +169,13 @@ static int stm32_rng_probe(struct platform_device *ofdev) + return devm_hwrng_register(dev, &priv->rng); + } + ++static int stm32_rng_remove(struct platform_device *ofdev) ++{ ++ pm_runtime_disable(&ofdev->dev); ++ ++ return 0; ++} ++ + #ifdef CONFIG_PM + static int stm32_rng_runtime_suspend(struct device *dev) + { +@@ -210,6 +217,7 @@ static struct platform_driver stm32_rng_driver = { + .of_match_table = stm32_rng_match, + }, + .probe = stm32_rng_probe, ++ .remove = stm32_rng_remove, + }; + + module_platform_driver(stm32_rng_driver); +diff --git a/drivers/clk/at91/clk-generated.c b/drivers/clk/at91/clk-generated.c +index 113152425a95..ea23002be4de 100644 +--- a/drivers/clk/at91/clk-generated.c ++++ b/drivers/clk/at91/clk-generated.c +@@ -284,7 +284,7 @@ static void clk_generated_startup(struct clk_generated *gck) + static struct clk_hw * __init + at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock, + const char *name, const char **parent_names, +- u8 num_parents, u8 id, ++ u8 num_parents, u8 id, bool pll_audio, + const struct clk_range *range) + { + struct clk_generated *gck; +@@ -308,6 +308,7 @@ at91_clk_register_generated(struct regmap *regmap, spinlock_t *lock, + gck->regmap = regmap; + gck->lock = lock; + gck->range = *range; ++ gck->audio_pll_allowed = pll_audio; + + clk_generated_startup(gck); + hw = &gck->hw; +@@ -333,7 +334,6 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np) + struct device_node *gcknp; + struct clk_range range = CLK_RANGE(0, 0); + struct regmap *regmap; +- struct clk_generated *gck; + + num_parents = of_clk_get_parent_count(np); + if (num_parents == 0 || num_parents > GENERATED_SOURCE_MAX) +@@ -350,6 +350,8 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np) + return; + + for_each_child_of_node(np, gcknp) { ++ bool pll_audio = false; ++ + if (of_property_read_u32(gcknp, "reg", &id)) + continue; + +@@ -362,24 +364,14 @@ static void __init of_sama5d2_clk_generated_setup(struct device_node *np) + of_at91_get_clk_range(gcknp, "atmel,clk-output-range", + &range); + ++ if (of_device_is_compatible(np, "atmel,sama5d2-clk-generated") && ++ (id == GCK_ID_I2S0 || id == GCK_ID_I2S1 || ++ id == GCK_ID_CLASSD)) ++ pll_audio = true; ++ + hw = at91_clk_register_generated(regmap, &pmc_pcr_lock, name, + parent_names, num_parents, +- id, &range); +- +- gck = to_clk_generated(hw); +- +- if (of_device_is_compatible(np, +- "atmel,sama5d2-clk-generated")) { +- if (gck->id == GCK_ID_SSC0 || gck->id == GCK_ID_SSC1 || +- gck->id == GCK_ID_I2S0 || gck->id == GCK_ID_I2S1 || +- gck->id == GCK_ID_CLASSD) +- gck->audio_pll_allowed = true; +- else +- gck->audio_pll_allowed = false; +- } else { +- gck->audio_pll_allowed = false; +- } +- ++ id, pll_audio, &range); + if (IS_ERR(hw)) + continue; + +diff --git a/drivers/clk/at91/clk-main.c b/drivers/clk/at91/clk-main.c +index 2f97a843d6d6..90988e7a5b47 100644 +--- a/drivers/clk/at91/clk-main.c ++++ b/drivers/clk/at91/clk-main.c +@@ -162,7 +162,7 @@ at91_clk_register_main_osc(struct regmap *regmap, + if (bypass) + regmap_update_bits(regmap, + AT91_CKGR_MOR, MOR_KEY_MASK | +- AT91_PMC_MOSCEN, ++ AT91_PMC_OSCBYPASS, + AT91_PMC_OSCBYPASS | AT91_PMC_KEY); + + hw = &osc->hw; +@@ -354,7 +354,10 @@ static int clk_main_probe_frequency(struct regmap *regmap) + regmap_read(regmap, AT91_CKGR_MCFR, &mcfr); + if (mcfr & AT91_PMC_MAINRDY) + return 0; +- usleep_range(MAINF_LOOP_MIN_WAIT, MAINF_LOOP_MAX_WAIT); ++ if (system_state < SYSTEM_RUNNING) ++ udelay(MAINF_LOOP_MIN_WAIT); ++ else ++ usleep_range(MAINF_LOOP_MIN_WAIT, MAINF_LOOP_MAX_WAIT); + } while (time_before(prep_time, timeout)); + + return -ETIMEDOUT; +diff --git a/drivers/clk/at91/sckc.c b/drivers/clk/at91/sckc.c +index ab6ecefc49ad..43ba2a8b03fa 100644 +--- a/drivers/clk/at91/sckc.c ++++ b/drivers/clk/at91/sckc.c +@@ -74,7 +74,10 @@ static int clk_slow_osc_prepare(struct clk_hw *hw) + + writel(tmp | AT91_SCKC_OSC32EN, sckcr); + +- usleep_range(osc->startup_usec, osc->startup_usec + 1); ++ if (system_state < SYSTEM_RUNNING) ++ udelay(osc->startup_usec); ++ else ++ usleep_range(osc->startup_usec, osc->startup_usec + 1); + + return 0; + } +@@ -197,7 +200,10 @@ static int clk_slow_rc_osc_prepare(struct clk_hw *hw) + + writel(readl(sckcr) | AT91_SCKC_RCEN, sckcr); + +- usleep_range(osc->startup_usec, osc->startup_usec + 1); ++ if (system_state < SYSTEM_RUNNING) ++ udelay(osc->startup_usec); ++ else ++ usleep_range(osc->startup_usec, osc->startup_usec + 1); + + return 0; + } +@@ -310,7 +316,10 @@ static int clk_sam9x5_slow_set_parent(struct clk_hw *hw, u8 index) + + writel(tmp, sckcr); + +- usleep_range(SLOWCK_SW_TIME_USEC, SLOWCK_SW_TIME_USEC + 1); ++ if (system_state < SYSTEM_RUNNING) ++ udelay(SLOWCK_SW_TIME_USEC); ++ else ++ usleep_range(SLOWCK_SW_TIME_USEC, SLOWCK_SW_TIME_USEC + 1); + + return 0; + } +@@ -443,7 +452,10 @@ static int clk_sama5d4_slow_osc_prepare(struct clk_hw *hw) + return 0; + } + +- usleep_range(osc->startup_usec, osc->startup_usec + 1); ++ if (system_state < SYSTEM_RUNNING) ++ udelay(osc->startup_usec); ++ else ++ usleep_range(osc->startup_usec, osc->startup_usec + 1); + osc->prepared = true; + + return 0; +diff --git a/drivers/clk/clk-stm32mp1.c b/drivers/clk/clk-stm32mp1.c +index a907555b2a3d..bf3b6a4c78d0 100644 +--- a/drivers/clk/clk-stm32mp1.c ++++ b/drivers/clk/clk-stm32mp1.c +@@ -121,7 +121,7 @@ static const char * const cpu_src[] = { + }; + + static const char * const axi_src[] = { +- "ck_hsi", "ck_hse", "pll2_p", "pll3_p" ++ "ck_hsi", "ck_hse", "pll2_p" + }; + + static const char * const per_src[] = { +@@ -225,19 +225,19 @@ static const char * const usart6_src[] = { + }; + + static const char * const fdcan_src[] = { +- "ck_hse", "pll3_q", "pll4_q" ++ "ck_hse", "pll3_q", "pll4_q", "pll4_r" + }; + + static const char * const sai_src[] = { +- "pll4_q", "pll3_q", "i2s_ckin", "ck_per" ++ "pll4_q", "pll3_q", "i2s_ckin", "ck_per", "pll3_r" + }; + + static const char * const sai2_src[] = { +- "pll4_q", "pll3_q", "i2s_ckin", "ck_per", "spdif_ck_symb" ++ "pll4_q", "pll3_q", "i2s_ckin", "ck_per", "spdif_ck_symb", "pll3_r" + }; + + static const char * const adc12_src[] = { +- "pll4_q", "ck_per" ++ "pll4_r", "ck_per", "pll3_q" + }; + + static const char * const dsi_src[] = { +@@ -269,7 +269,7 @@ static const struct clk_div_table axi_div_table[] = { + static const struct clk_div_table mcu_div_table[] = { + { 0, 1 }, { 1, 2 }, { 2, 4 }, { 3, 8 }, + { 4, 16 }, { 5, 32 }, { 6, 64 }, { 7, 128 }, +- { 8, 512 }, { 9, 512 }, { 10, 512}, { 11, 512 }, ++ { 8, 256 }, { 9, 512 }, { 10, 512}, { 11, 512 }, + { 12, 512 }, { 13, 512 }, { 14, 512}, { 15, 512 }, + { 0 }, + }; +@@ -1286,10 +1286,11 @@ _clk_stm32_register_composite(struct device *dev, + MGATE_MP1(_id, _name, _parent, _flags, _mgate) + + #define KCLK(_id, _name, _parents, _flags, _mgate, _mmux)\ +- COMPOSITE(_id, _name, _parents, CLK_OPS_PARENT_ENABLE | _flags,\ +- _MGATE_MP1(_mgate),\ +- _MMUX(_mmux),\ +- _NO_DIV) ++ COMPOSITE(_id, _name, _parents, CLK_OPS_PARENT_ENABLE |\ ++ CLK_SET_RATE_NO_REPARENT | _flags,\ ++ _MGATE_MP1(_mgate),\ ++ _MMUX(_mmux),\ ++ _NO_DIV) + + enum { + G_SAI1, +@@ -1655,8 +1656,8 @@ static const struct stm32_mux_cfg ker_mux_cfg[M_LAST] = { + + static const struct clock_config stm32mp1_clock_cfg[] = { + /* Oscillator divider */ +- DIV(NO_ID, "clk-hsi-div", "clk-hsi", 0, RCC_HSICFGR, 0, 2, +- CLK_DIVIDER_READ_ONLY), ++ DIV(NO_ID, "clk-hsi-div", "clk-hsi", CLK_DIVIDER_POWER_OF_TWO, ++ RCC_HSICFGR, 0, 2, CLK_DIVIDER_READ_ONLY), + + /* External / Internal Oscillators */ + GATE_MP1(CK_HSE, "ck_hse", "clk-hse", 0, RCC_OCENSETR, 8, 0), +@@ -1952,7 +1953,8 @@ static const struct clock_config stm32mp1_clock_cfg[] = { + MGATE_MP1(GPU_K, "gpu_k", "pll2_q", 0, G_GPU), + MGATE_MP1(DAC12_K, "dac12_k", "ck_lsi", 0, G_DAC12), + +- COMPOSITE(ETHPTP_K, "ethptp_k", eth_src, CLK_OPS_PARENT_ENABLE, ++ COMPOSITE(ETHPTP_K, "ethptp_k", eth_src, CLK_OPS_PARENT_ENABLE | ++ CLK_SET_RATE_NO_REPARENT, + _NO_GATE, + _MMUX(M_ETHCK), + _DIV(RCC_ETHCKSELR, 4, 4, CLK_DIVIDER_ALLOW_ZERO, NULL)), +diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c +index 4d4f6d842c31..d94b65061b9f 100644 +--- a/drivers/clk/meson/gxbb.c ++++ b/drivers/clk/meson/gxbb.c +@@ -836,6 +836,7 @@ static struct clk_regmap gxbb_sar_adc_clk_div = { + .ops = &clk_regmap_divider_ops, + .parent_names = (const char *[]){ "sar_adc_clk_sel" }, + .num_parents = 1, ++ .flags = CLK_SET_RATE_PARENT, + }, + }; + +diff --git a/drivers/clk/samsung/clk-exynos5420.c b/drivers/clk/samsung/clk-exynos5420.c +index ce30862617a6..d5af93721299 100644 +--- a/drivers/clk/samsung/clk-exynos5420.c ++++ b/drivers/clk/samsung/clk-exynos5420.c +@@ -171,12 +171,18 @@ static const unsigned long exynos5x_clk_regs[] __initconst = { + GATE_BUS_CPU, + GATE_SCLK_CPU, + CLKOUT_CMU_CPU, ++ CPLL_CON0, ++ DPLL_CON0, + EPLL_CON0, + EPLL_CON1, + EPLL_CON2, + RPLL_CON0, + RPLL_CON1, + RPLL_CON2, ++ IPLL_CON0, ++ SPLL_CON0, ++ VPLL_CON0, ++ MPLL_CON0, + SRC_TOP0, + SRC_TOP1, + SRC_TOP2, +diff --git a/drivers/clk/samsung/clk-exynos5433.c b/drivers/clk/samsung/clk-exynos5433.c +index 426980514e67..302596dc79a2 100644 +--- a/drivers/clk/samsung/clk-exynos5433.c ++++ b/drivers/clk/samsung/clk-exynos5433.c +@@ -16,6 +16,7 @@ + #include <linux/of_device.h> + #include <linux/platform_device.h> + #include <linux/pm_runtime.h> ++#include <linux/slab.h> + + #include <dt-bindings/clock/exynos5433.h> + +@@ -5527,6 +5528,8 @@ static int __init exynos5433_cmu_probe(struct platform_device *pdev) + + data->clk_save = samsung_clk_alloc_reg_dump(info->clk_regs, + info->nr_clk_regs); ++ if (!data->clk_save) ++ return -ENOMEM; + data->nr_clk_save = info->nr_clk_regs; + data->clk_suspend = info->suspend_regs; + data->nr_clk_suspend = info->nr_suspend_regs; +@@ -5535,12 +5538,19 @@ static int __init exynos5433_cmu_probe(struct platform_device *pdev) + if (data->nr_pclks > 0) { + data->pclks = devm_kcalloc(dev, sizeof(struct clk *), + data->nr_pclks, GFP_KERNEL); +- ++ if (!data->pclks) { ++ kfree(data->clk_save); ++ return -ENOMEM; ++ } + for (i = 0; i < data->nr_pclks; i++) { + struct clk *clk = of_clk_get(dev->of_node, i); + +- if (IS_ERR(clk)) ++ if (IS_ERR(clk)) { ++ kfree(data->clk_save); ++ while (--i >= 0) ++ clk_put(data->pclks[i]); + return PTR_ERR(clk); ++ } + data->pclks[i] = clk; + } + } +diff --git a/drivers/clk/sunxi-ng/ccu-sun9i-a80.c b/drivers/clk/sunxi-ng/ccu-sun9i-a80.c +index 8936ef87652c..c14bf782b2b3 100644 +--- a/drivers/clk/sunxi-ng/ccu-sun9i-a80.c ++++ b/drivers/clk/sunxi-ng/ccu-sun9i-a80.c +@@ -1231,7 +1231,7 @@ static int sun9i_a80_ccu_probe(struct platform_device *pdev) + + /* Enforce d1 = 0, d2 = 0 for Audio PLL */ + val = readl(reg + SUN9I_A80_PLL_AUDIO_REG); +- val &= (BIT(16) & BIT(18)); ++ val &= ~(BIT(16) | BIT(18)); + writel(val, reg + SUN9I_A80_PLL_AUDIO_REG); + + /* Enforce P = 1 for both CPU cluster PLLs */ +diff --git a/drivers/clk/sunxi/clk-sunxi.c b/drivers/clk/sunxi/clk-sunxi.c +index 012714d94b42..004b411b640b 100644 +--- a/drivers/clk/sunxi/clk-sunxi.c ++++ b/drivers/clk/sunxi/clk-sunxi.c +@@ -1086,8 +1086,8 @@ static struct clk ** __init sunxi_divs_clk_setup(struct device_node *node, + rate_hw, rate_ops, + gate_hw, &clk_gate_ops, + clkflags | +- data->div[i].critical ? +- CLK_IS_CRITICAL : 0); ++ (data->div[i].critical ? ++ CLK_IS_CRITICAL : 0)); + + WARN_ON(IS_ERR(clk_data->clks[i])); + } +diff --git a/drivers/clk/ti/clk-dra7-atl.c b/drivers/clk/ti/clk-dra7-atl.c +index 148815470431..beb672a215b6 100644 +--- a/drivers/clk/ti/clk-dra7-atl.c ++++ b/drivers/clk/ti/clk-dra7-atl.c +@@ -174,7 +174,6 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node) + struct clk_init_data init = { NULL }; + const char **parent_names = NULL; + struct clk *clk; +- int ret; + + clk_hw = kzalloc(sizeof(*clk_hw), GFP_KERNEL); + if (!clk_hw) { +@@ -207,11 +206,6 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node) + clk = ti_clk_register(NULL, &clk_hw->hw, node->name); + + if (!IS_ERR(clk)) { +- ret = ti_clk_add_alias(NULL, clk, node->name); +- if (ret) { +- clk_unregister(clk); +- goto cleanup; +- } + of_clk_add_provider(node, of_clk_src_simple_get, clk); + kfree(parent_names); + return; +diff --git a/drivers/clk/ti/clkctrl.c b/drivers/clk/ti/clkctrl.c +index dfaa5aad0692..2c2564acad22 100644 +--- a/drivers/clk/ti/clkctrl.c ++++ b/drivers/clk/ti/clkctrl.c +@@ -100,11 +100,12 @@ static bool _omap4_is_timeout(union omap4_timeout *time, u32 timeout) + * can be from a timer that requires pm_runtime access, which + * will eventually bring us here with timekeeping_suspended, + * during both suspend entry and resume paths. This happens +- * at least on am43xx platform. ++ * at least on am43xx platform. Account for flakeyness ++ * with udelay() by multiplying the timeout value by 2. + */ + if (unlikely(_early_timeout || timekeeping_suspended)) { + if (time->cycles++ < timeout) { +- udelay(1); ++ udelay(1 * 2); + return false; + } + } else { +diff --git a/drivers/clocksource/timer-fttmr010.c b/drivers/clocksource/timer-fttmr010.c +index cf93f6419b51..fadff7915dd9 100644 +--- a/drivers/clocksource/timer-fttmr010.c ++++ b/drivers/clocksource/timer-fttmr010.c +@@ -21,7 +21,7 @@ + #include <linux/delay.h> + + /* +- * Register definitions for the timers ++ * Register definitions common for all the timer variants. + */ + #define TIMER1_COUNT (0x00) + #define TIMER1_LOAD (0x04) +@@ -36,9 +36,10 @@ + #define TIMER3_MATCH1 (0x28) + #define TIMER3_MATCH2 (0x2c) + #define TIMER_CR (0x30) +-#define TIMER_INTR_STATE (0x34) +-#define TIMER_INTR_MASK (0x38) + ++/* ++ * Control register (TMC30) bit fields for fttmr010/gemini/moxart timers. ++ */ + #define TIMER_1_CR_ENABLE BIT(0) + #define TIMER_1_CR_CLOCK BIT(1) + #define TIMER_1_CR_INT BIT(2) +@@ -53,8 +54,9 @@ + #define TIMER_3_CR_UPDOWN BIT(11) + + /* +- * The Aspeed AST2400 moves bits around in the control register +- * and lacks bits for setting the timer to count upwards. ++ * Control register (TMC30) bit fields for aspeed ast2400/ast2500 timers. ++ * The aspeed timers move bits around in the control register and lacks ++ * bits for setting the timer to count upwards. + */ + #define TIMER_1_CR_ASPEED_ENABLE BIT(0) + #define TIMER_1_CR_ASPEED_CLOCK BIT(1) +@@ -66,6 +68,18 @@ + #define TIMER_3_CR_ASPEED_CLOCK BIT(9) + #define TIMER_3_CR_ASPEED_INT BIT(10) + ++/* ++ * Interrupt status/mask register definitions for fttmr010/gemini/moxart ++ * timers. ++ * The registers don't exist and they are not needed on aspeed timers ++ * because: ++ * - aspeed timer overflow interrupt is controlled by bits in Control ++ * Register (TMC30). ++ * - aspeed timers always generate interrupt when either one of the ++ * Match registers equals to Status register. ++ */ ++#define TIMER_INTR_STATE (0x34) ++#define TIMER_INTR_MASK (0x38) + #define TIMER_1_INT_MATCH1 BIT(0) + #define TIMER_1_INT_MATCH2 BIT(1) + #define TIMER_1_INT_OVERFLOW BIT(2) +@@ -80,7 +94,7 @@ + struct fttmr010 { + void __iomem *base; + unsigned int tick_rate; +- bool count_down; ++ bool is_aspeed; + u32 t1_enable_val; + struct clock_event_device clkevt; + #ifdef CONFIG_ARM +@@ -130,7 +144,7 @@ static int fttmr010_timer_set_next_event(unsigned long cycles, + cr &= ~fttmr010->t1_enable_val; + writel(cr, fttmr010->base + TIMER_CR); + +- if (fttmr010->count_down) { ++ if (fttmr010->is_aspeed) { + /* + * ASPEED Timer Controller will load TIMER1_LOAD register + * into TIMER1_COUNT register when the timer is re-enabled. +@@ -175,16 +189,17 @@ static int fttmr010_timer_set_oneshot(struct clock_event_device *evt) + + /* Setup counter start from 0 or ~0 */ + writel(0, fttmr010->base + TIMER1_COUNT); +- if (fttmr010->count_down) ++ if (fttmr010->is_aspeed) { + writel(~0, fttmr010->base + TIMER1_LOAD); +- else ++ } else { + writel(0, fttmr010->base + TIMER1_LOAD); + +- /* Enable interrupt */ +- cr = readl(fttmr010->base + TIMER_INTR_MASK); +- cr &= ~(TIMER_1_INT_OVERFLOW | TIMER_1_INT_MATCH2); +- cr |= TIMER_1_INT_MATCH1; +- writel(cr, fttmr010->base + TIMER_INTR_MASK); ++ /* Enable interrupt */ ++ cr = readl(fttmr010->base + TIMER_INTR_MASK); ++ cr &= ~(TIMER_1_INT_OVERFLOW | TIMER_1_INT_MATCH2); ++ cr |= TIMER_1_INT_MATCH1; ++ writel(cr, fttmr010->base + TIMER_INTR_MASK); ++ } + + return 0; + } +@@ -201,9 +216,8 @@ static int fttmr010_timer_set_periodic(struct clock_event_device *evt) + writel(cr, fttmr010->base + TIMER_CR); + + /* Setup timer to fire at 1/HZ intervals. */ +- if (fttmr010->count_down) { ++ if (fttmr010->is_aspeed) { + writel(period, fttmr010->base + TIMER1_LOAD); +- writel(0, fttmr010->base + TIMER1_MATCH1); + } else { + cr = 0xffffffff - (period - 1); + writel(cr, fttmr010->base + TIMER1_COUNT); +@@ -281,23 +295,21 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed) + } + + /* +- * The Aspeed AST2400 moves bits around in the control register, +- * otherwise it works the same. ++ * The Aspeed timers move bits around in the control register. + */ + if (is_aspeed) { + fttmr010->t1_enable_val = TIMER_1_CR_ASPEED_ENABLE | + TIMER_1_CR_ASPEED_INT; +- /* Downward not available */ +- fttmr010->count_down = true; ++ fttmr010->is_aspeed = true; + } else { + fttmr010->t1_enable_val = TIMER_1_CR_ENABLE | TIMER_1_CR_INT; +- } + +- /* +- * Reset the interrupt mask and status +- */ +- writel(TIMER_INT_ALL_MASK, fttmr010->base + TIMER_INTR_MASK); +- writel(0, fttmr010->base + TIMER_INTR_STATE); ++ /* ++ * Reset the interrupt mask and status ++ */ ++ writel(TIMER_INT_ALL_MASK, fttmr010->base + TIMER_INTR_MASK); ++ writel(0, fttmr010->base + TIMER_INTR_STATE); ++ } + + /* + * Enable timer 1 count up, timer 2 count up, except on Aspeed, +@@ -306,9 +318,8 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed) + if (is_aspeed) + val = TIMER_2_CR_ASPEED_ENABLE; + else { +- val = TIMER_2_CR_ENABLE; +- if (!fttmr010->count_down) +- val |= TIMER_1_CR_UPDOWN | TIMER_2_CR_UPDOWN; ++ val = TIMER_2_CR_ENABLE | TIMER_1_CR_UPDOWN | ++ TIMER_2_CR_UPDOWN; + } + writel(val, fttmr010->base + TIMER_CR); + +@@ -321,7 +332,7 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed) + writel(0, fttmr010->base + TIMER2_MATCH1); + writel(0, fttmr010->base + TIMER2_MATCH2); + +- if (fttmr010->count_down) { ++ if (fttmr010->is_aspeed) { + writel(~0, fttmr010->base + TIMER2_LOAD); + clocksource_mmio_init(fttmr010->base + TIMER2_COUNT, + "FTTMR010-TIMER2", +@@ -371,7 +382,7 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed) + + #ifdef CONFIG_ARM + /* Also use this timer for delays */ +- if (fttmr010->count_down) ++ if (fttmr010->is_aspeed) + fttmr010->delay_timer.read_current_timer = + fttmr010_read_current_timer_down; + else +diff --git a/drivers/clocksource/timer-mediatek.c b/drivers/clocksource/timer-mediatek.c +index eb10321f8517..8e7894a026ac 100644 +--- a/drivers/clocksource/timer-mediatek.c ++++ b/drivers/clocksource/timer-mediatek.c +@@ -277,15 +277,12 @@ static int __init mtk_syst_init(struct device_node *node) + + ret = timer_of_init(node, &to); + if (ret) +- goto err; ++ return ret; + + clockevents_config_and_register(&to.clkevt, timer_of_rate(&to), + TIMER_SYNC_TICKS, 0xffffffff); + + return 0; +-err: +- timer_of_cleanup(&to); +- return ret; + } + + static int __init mtk_gpt_init(struct device_node *node) +@@ -302,7 +299,7 @@ static int __init mtk_gpt_init(struct device_node *node) + + ret = timer_of_init(node, &to); + if (ret) +- goto err; ++ return ret; + + /* Configure clock source */ + mtk_gpt_setup(&to, TIMER_CLK_SRC, GPT_CTRL_OP_FREERUN); +@@ -320,9 +317,6 @@ static int __init mtk_gpt_init(struct device_node *node) + mtk_gpt_enable_irq(&to, TIMER_CLK_EVT); + + return 0; +-err: +- timer_of_cleanup(&to); +- return ret; + } + TIMER_OF_DECLARE(mtk_mt6577, "mediatek,mt6577-timer", mtk_gpt_init); + TIMER_OF_DECLARE(mtk_mt6765, "mediatek,mt6765-timer", mtk_syst_init); +diff --git a/drivers/crypto/chelsio/chtls/chtls.h b/drivers/crypto/chelsio/chtls/chtls.h +index 7725b6ee14ef..fcb6747ed29e 100644 +--- a/drivers/crypto/chelsio/chtls/chtls.h ++++ b/drivers/crypto/chelsio/chtls/chtls.h +@@ -153,6 +153,11 @@ struct chtls_dev { + unsigned int cdev_state; + }; + ++struct chtls_listen { ++ struct chtls_dev *cdev; ++ struct sock *sk; ++}; ++ + struct chtls_hws { + struct sk_buff_head sk_recv_queue; + u8 txqid; +diff --git a/drivers/crypto/chelsio/chtls/chtls_main.c b/drivers/crypto/chelsio/chtls/chtls_main.c +index f59b044ebd25..2bf084afe9b5 100644 +--- a/drivers/crypto/chelsio/chtls/chtls_main.c ++++ b/drivers/crypto/chelsio/chtls/chtls_main.c +@@ -55,24 +55,19 @@ static void unregister_listen_notifier(struct notifier_block *nb) + static int listen_notify_handler(struct notifier_block *this, + unsigned long event, void *data) + { +- struct chtls_dev *cdev; +- struct sock *sk; +- int ret; ++ struct chtls_listen *clisten; ++ int ret = NOTIFY_DONE; + +- sk = data; +- ret = NOTIFY_DONE; ++ clisten = (struct chtls_listen *)data; + + switch (event) { + case CHTLS_LISTEN_START: ++ ret = chtls_listen_start(clisten->cdev, clisten->sk); ++ kfree(clisten); ++ break; + case CHTLS_LISTEN_STOP: +- mutex_lock(&cdev_list_lock); +- list_for_each_entry(cdev, &cdev_list, list) { +- if (event == CHTLS_LISTEN_START) +- ret = chtls_listen_start(cdev, sk); +- else +- chtls_listen_stop(cdev, sk); +- } +- mutex_unlock(&cdev_list_lock); ++ chtls_listen_stop(clisten->cdev, clisten->sk); ++ kfree(clisten); + break; + } + return ret; +@@ -90,8 +85,9 @@ static int listen_backlog_rcv(struct sock *sk, struct sk_buff *skb) + return 0; + } + +-static int chtls_start_listen(struct sock *sk) ++static int chtls_start_listen(struct chtls_dev *cdev, struct sock *sk) + { ++ struct chtls_listen *clisten; + int err; + + if (sk->sk_protocol != IPPROTO_TCP) +@@ -102,21 +98,33 @@ static int chtls_start_listen(struct sock *sk) + return -EADDRNOTAVAIL; + + sk->sk_backlog_rcv = listen_backlog_rcv; ++ clisten = kmalloc(sizeof(*clisten), GFP_KERNEL); ++ if (!clisten) ++ return -ENOMEM; ++ clisten->cdev = cdev; ++ clisten->sk = sk; + mutex_lock(¬ify_mutex); + err = raw_notifier_call_chain(&listen_notify_list, +- CHTLS_LISTEN_START, sk); ++ CHTLS_LISTEN_START, clisten); + mutex_unlock(¬ify_mutex); + return err; + } + +-static void chtls_stop_listen(struct sock *sk) ++static void chtls_stop_listen(struct chtls_dev *cdev, struct sock *sk) + { ++ struct chtls_listen *clisten; ++ + if (sk->sk_protocol != IPPROTO_TCP) + return; + ++ clisten = kmalloc(sizeof(*clisten), GFP_KERNEL); ++ if (!clisten) ++ return; ++ clisten->cdev = cdev; ++ clisten->sk = sk; + mutex_lock(¬ify_mutex); + raw_notifier_call_chain(&listen_notify_list, +- CHTLS_LISTEN_STOP, sk); ++ CHTLS_LISTEN_STOP, clisten); + mutex_unlock(¬ify_mutex); + } + +@@ -138,15 +146,19 @@ static int chtls_inline_feature(struct tls_device *dev) + + static int chtls_create_hash(struct tls_device *dev, struct sock *sk) + { ++ struct chtls_dev *cdev = to_chtls_dev(dev); ++ + if (sk->sk_state == TCP_LISTEN) +- return chtls_start_listen(sk); ++ return chtls_start_listen(cdev, sk); + return 0; + } + + static void chtls_destroy_hash(struct tls_device *dev, struct sock *sk) + { ++ struct chtls_dev *cdev = to_chtls_dev(dev); ++ + if (sk->sk_state == TCP_LISTEN) +- chtls_stop_listen(sk); ++ chtls_stop_listen(cdev, sk); + } + + static void chtls_register_dev(struct chtls_dev *cdev) +diff --git a/drivers/crypto/mxc-scc.c b/drivers/crypto/mxc-scc.c +index e01c46387df8..519086730791 100644 +--- a/drivers/crypto/mxc-scc.c ++++ b/drivers/crypto/mxc-scc.c +@@ -178,12 +178,12 @@ static int mxc_scc_get_data(struct mxc_scc_ctx *ctx, + else + from = scc->black_memory; + +- dev_dbg(scc->dev, "pcopy: from 0x%p %d bytes\n", from, ++ dev_dbg(scc->dev, "pcopy: from 0x%p %zu bytes\n", from, + ctx->dst_nents * 8); + len = sg_pcopy_from_buffer(ablkreq->dst, ctx->dst_nents, + from, ctx->size, ctx->offset); + if (!len) { +- dev_err(scc->dev, "pcopy err from 0x%p (len=%d)\n", from, len); ++ dev_err(scc->dev, "pcopy err from 0x%p (len=%zu)\n", from, len); + return -EINVAL; + } + +@@ -274,7 +274,7 @@ static int mxc_scc_put_data(struct mxc_scc_ctx *ctx, + len = sg_pcopy_to_buffer(req->src, ctx->src_nents, + to, len, ctx->offset); + if (!len) { +- dev_err(scc->dev, "pcopy err to 0x%p (len=%d)\n", to, len); ++ dev_err(scc->dev, "pcopy err to 0x%p (len=%zu)\n", to, len); + return -EINVAL; + } + +@@ -335,9 +335,9 @@ static void mxc_scc_ablkcipher_next(struct mxc_scc_ctx *ctx, + return; + } + +- dev_dbg(scc->dev, "Start encryption (0x%p/0x%p)\n", +- (void *)readl(scc->base + SCC_SCM_RED_START), +- (void *)readl(scc->base + SCC_SCM_BLACK_START)); ++ dev_dbg(scc->dev, "Start encryption (0x%x/0x%x)\n", ++ readl(scc->base + SCC_SCM_RED_START), ++ readl(scc->base + SCC_SCM_BLACK_START)); + + /* clear interrupt control registers */ + writel(SCC_SCM_INTR_CTRL_CLR_INTR, +diff --git a/drivers/crypto/stm32/stm32-hash.c b/drivers/crypto/stm32/stm32-hash.c +index 590d7352837e..641b11077f47 100644 +--- a/drivers/crypto/stm32/stm32-hash.c ++++ b/drivers/crypto/stm32/stm32-hash.c +@@ -365,7 +365,7 @@ static int stm32_hash_xmit_cpu(struct stm32_hash_dev *hdev, + return -ETIMEDOUT; + + if ((hdev->flags & HASH_FLAGS_HMAC) && +- (hdev->flags & ~HASH_FLAGS_HMAC_KEY)) { ++ (!(hdev->flags & HASH_FLAGS_HMAC_KEY))) { + hdev->flags |= HASH_FLAGS_HMAC_KEY; + stm32_hash_write_key(hdev); + if (stm32_hash_wait_busy(hdev)) +diff --git a/drivers/dma/stm32-dma.c b/drivers/dma/stm32-dma.c +index 379e8d534e61..4903a408fc14 100644 +--- a/drivers/dma/stm32-dma.c ++++ b/drivers/dma/stm32-dma.c +@@ -308,20 +308,12 @@ static bool stm32_dma_fifo_threshold_is_allowed(u32 burst, u32 threshold, + + static bool stm32_dma_is_burst_possible(u32 buf_len, u32 threshold) + { +- switch (threshold) { +- case STM32_DMA_FIFO_THRESHOLD_FULL: +- if (buf_len >= STM32_DMA_MAX_BURST) +- return true; +- else +- return false; +- case STM32_DMA_FIFO_THRESHOLD_HALFFULL: +- if (buf_len >= STM32_DMA_MAX_BURST / 2) +- return true; +- else +- return false; +- default: +- return false; +- } ++ /* ++ * Buffer or period length has to be aligned on FIFO depth. ++ * Otherwise bytes may be stuck within FIFO at buffer or period ++ * length. ++ */ ++ return ((buf_len % ((threshold + 1) * 4)) == 0); + } + + static u32 stm32_dma_get_best_burst(u32 buf_len, u32 max_burst, u32 threshold, +diff --git a/drivers/firmware/arm_sdei.c b/drivers/firmware/arm_sdei.c +index 1ea71640fdc2..c64c7da73829 100644 +--- a/drivers/firmware/arm_sdei.c ++++ b/drivers/firmware/arm_sdei.c +@@ -1009,7 +1009,6 @@ static struct platform_driver sdei_driver = { + + static bool __init sdei_present_dt(void) + { +- struct platform_device *pdev; + struct device_node *np, *fw_np; + + fw_np = of_find_node_by_name(NULL, "firmware"); +@@ -1017,14 +1016,9 @@ static bool __init sdei_present_dt(void) + return false; + + np = of_find_matching_node(fw_np, sdei_of_match); +- of_node_put(fw_np); + if (!np) + return false; +- +- pdev = of_platform_device_create(np, sdei_driver.driver.name, NULL); + of_node_put(np); +- if (!pdev) +- return false; + + return true; + } +diff --git a/drivers/gpio/gpio-pca953x.c b/drivers/gpio/gpio-pca953x.c +index e0657fc72d31..0232c25a1586 100644 +--- a/drivers/gpio/gpio-pca953x.c ++++ b/drivers/gpio/gpio-pca953x.c +@@ -58,7 +58,7 @@ + #define PCA_GPIO_MASK 0x00FF + + #define PCAL_GPIO_MASK 0x1f +-#define PCAL_PINCTRL_MASK 0xe0 ++#define PCAL_PINCTRL_MASK 0x60 + + #define PCA_INT 0x0100 + #define PCA_PCAL 0x0200 +diff --git a/drivers/gpio/gpio-raspberrypi-exp.c b/drivers/gpio/gpio-raspberrypi-exp.c +index d6d36d537e37..b77ea16ffa03 100644 +--- a/drivers/gpio/gpio-raspberrypi-exp.c ++++ b/drivers/gpio/gpio-raspberrypi-exp.c +@@ -206,6 +206,7 @@ static int rpi_exp_gpio_probe(struct platform_device *pdev) + } + + fw = rpi_firmware_get(fw_node); ++ of_node_put(fw_node); + if (!fw) + return -EPROBE_DEFER; + +diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c +index 04440064b9b7..e5b3ba73e661 100644 +--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c ++++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c +@@ -382,7 +382,7 @@ atmel_hlcdc_plane_update_general_settings(struct atmel_hlcdc_plane *plane, + cfg |= ATMEL_HLCDC_LAYER_LAEN; + else + cfg |= ATMEL_HLCDC_LAYER_GAEN | +- ATMEL_HLCDC_LAYER_GA(state->base.alpha >> 8); ++ ATMEL_HLCDC_LAYER_GA(state->base.alpha); + } + + if (state->disc_h && state->disc_w) +diff --git a/drivers/gpu/ipu-v3/ipu-pre.c b/drivers/gpu/ipu-v3/ipu-pre.c +index 2f8db9d62551..4a28f3fbb0a2 100644 +--- a/drivers/gpu/ipu-v3/ipu-pre.c ++++ b/drivers/gpu/ipu-v3/ipu-pre.c +@@ -106,6 +106,7 @@ struct ipu_pre { + void *buffer_virt; + bool in_use; + unsigned int safe_window_end; ++ unsigned int last_bufaddr; + }; + + static DEFINE_MUTEX(ipu_pre_list_mutex); +@@ -185,6 +186,7 @@ void ipu_pre_configure(struct ipu_pre *pre, unsigned int width, + + writel(bufaddr, pre->regs + IPU_PRE_CUR_BUF); + writel(bufaddr, pre->regs + IPU_PRE_NEXT_BUF); ++ pre->last_bufaddr = bufaddr; + + val = IPU_PRE_PREF_ENG_CTRL_INPUT_PIXEL_FORMAT(0) | + IPU_PRE_PREF_ENG_CTRL_INPUT_ACTIVE_BPP(active_bpp) | +@@ -242,7 +244,11 @@ void ipu_pre_update(struct ipu_pre *pre, unsigned int bufaddr) + unsigned short current_yblock; + u32 val; + ++ if (bufaddr == pre->last_bufaddr) ++ return; ++ + writel(bufaddr, pre->regs + IPU_PRE_NEXT_BUF); ++ pre->last_bufaddr = bufaddr; + + do { + if (time_after(jiffies, timeout)) { +diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c +index 63a1628f7cf7..b0c8fae7f903 100644 +--- a/drivers/hid/hid-core.c ++++ b/drivers/hid/hid-core.c +@@ -211,6 +211,18 @@ static unsigned hid_lookup_collection(struct hid_parser *parser, unsigned type) + return 0; /* we know nothing about this usage type */ + } + ++/* ++ * Concatenate usage which defines 16 bits or less with the ++ * currently defined usage page to form a 32 bit usage ++ */ ++ ++static void complete_usage(struct hid_parser *parser, unsigned int index) ++{ ++ parser->local.usage[index] &= 0xFFFF; ++ parser->local.usage[index] |= ++ (parser->global.usage_page & 0xFFFF) << 16; ++} ++ + /* + * Add a usage to the temporary parser table. + */ +@@ -222,6 +234,14 @@ static int hid_add_usage(struct hid_parser *parser, unsigned usage, u8 size) + return -1; + } + parser->local.usage[parser->local.usage_index] = usage; ++ ++ /* ++ * If Usage item only includes usage id, concatenate it with ++ * currently defined usage page ++ */ ++ if (size <= 2) ++ complete_usage(parser, parser->local.usage_index); ++ + parser->local.usage_size[parser->local.usage_index] = size; + parser->local.collection_index[parser->local.usage_index] = + parser->collection_stack_ptr ? +@@ -542,13 +562,32 @@ static int hid_parser_local(struct hid_parser *parser, struct hid_item *item) + * usage value." + */ + +-static void hid_concatenate_usage_page(struct hid_parser *parser) ++static void hid_concatenate_last_usage_page(struct hid_parser *parser) + { + int i; ++ unsigned int usage_page; ++ unsigned int current_page; + +- for (i = 0; i < parser->local.usage_index; i++) +- if (parser->local.usage_size[i] <= 2) +- parser->local.usage[i] += parser->global.usage_page << 16; ++ if (!parser->local.usage_index) ++ return; ++ ++ usage_page = parser->global.usage_page; ++ ++ /* ++ * Concatenate usage page again only if last declared Usage Page ++ * has not been already used in previous usages concatenation ++ */ ++ for (i = parser->local.usage_index - 1; i >= 0; i--) { ++ if (parser->local.usage_size[i] > 2) ++ /* Ignore extended usages */ ++ continue; ++ ++ current_page = parser->local.usage[i] >> 16; ++ if (current_page == usage_page) ++ break; ++ ++ complete_usage(parser, i); ++ } + } + + /* +@@ -560,7 +599,7 @@ static int hid_parser_main(struct hid_parser *parser, struct hid_item *item) + __u32 data; + int ret; + +- hid_concatenate_usage_page(parser); ++ hid_concatenate_last_usage_page(parser); + + data = item_udata(item); + +@@ -771,7 +810,7 @@ static int hid_scan_main(struct hid_parser *parser, struct hid_item *item) + __u32 data; + int i; + +- hid_concatenate_usage_page(parser); ++ hid_concatenate_last_usage_page(parser); + + data = item_udata(item); + +diff --git a/drivers/hid/intel-ish-hid/ishtp-hid.c b/drivers/hid/intel-ish-hid/ishtp-hid.c +index cd23903ddcf1..e918d78e541c 100644 +--- a/drivers/hid/intel-ish-hid/ishtp-hid.c ++++ b/drivers/hid/intel-ish-hid/ishtp-hid.c +@@ -222,7 +222,7 @@ int ishtp_hid_probe(unsigned int cur_hid_dev, + err_hid_device: + kfree(hid_data); + err_hid_data: +- kfree(hid); ++ hid_destroy_device(hid); + return rv; + } + +diff --git a/drivers/infiniband/hw/bnxt_re/qplib_sp.c b/drivers/infiniband/hw/bnxt_re/qplib_sp.c +index 4097f3fa25c5..09e7d3dd3055 100644 +--- a/drivers/infiniband/hw/bnxt_re/qplib_sp.c ++++ b/drivers/infiniband/hw/bnxt_re/qplib_sp.c +@@ -775,9 +775,8 @@ int bnxt_qplib_map_tc2cos(struct bnxt_qplib_res *res, u16 *cids) + req.cos0 = cpu_to_le16(cids[0]); + req.cos1 = cpu_to_le16(cids[1]); + +- bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, NULL, +- 0); +- return 0; ++ return bnxt_qplib_rcfw_send_message(rcfw, (void *)&req, (void *)&resp, ++ NULL, 0); + } + + int bnxt_qplib_get_roce_stats(struct bnxt_qplib_rcfw *rcfw, +diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +index 9e7923cf8577..7021444f18b4 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c ++++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c +@@ -1776,6 +1776,9 @@ static int hns_roce_v2_rereg_write_mtpt(struct hns_roce_dev *hr_dev, + struct hns_roce_v2_mpt_entry *mpt_entry = mb_buf; + int ret = 0; + ++ roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_MPT_ST_M, ++ V2_MPT_BYTE_4_MPT_ST_S, V2_MPT_ST_VALID); ++ + if (flags & IB_MR_REREG_PD) { + roce_set_field(mpt_entry->byte_4_pd_hop_st, V2_MPT_BYTE_4_PD_M, + V2_MPT_BYTE_4_PD_S, pdn); +@@ -3443,7 +3446,7 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp, + struct device *dev = hr_dev->dev; + int ret = -EINVAL; + +- context = kcalloc(2, sizeof(*context), GFP_KERNEL); ++ context = kcalloc(2, sizeof(*context), GFP_ATOMIC); + if (!context) + return -ENOMEM; + +@@ -3503,13 +3506,16 @@ static int hns_roce_v2_modify_qp(struct ib_qp *ibqp, + roce_set_field(qpc_mask->byte_160_sq_ci_pi, + V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M, + V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S, 0); +- roce_set_field(context->byte_84_rq_ci_pi, ++ ++ if (!ibqp->srq) { ++ roce_set_field(context->byte_84_rq_ci_pi, + V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M, + V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, + hr_qp->rq.head); +- roce_set_field(qpc_mask->byte_84_rq_ci_pi, ++ roce_set_field(qpc_mask->byte_84_rq_ci_pi, + V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M, + V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, 0); ++ } + } + + if (attr_mask & IB_QP_AV) { +@@ -3971,7 +3977,8 @@ static void hns_roce_set_qps_to_err(struct hns_roce_dev *hr_dev, u32 qpn) + if (hr_qp->ibqp.uobject) { + if (hr_qp->sdb_en == 1) { + hr_qp->sq.head = *(int *)(hr_qp->sdb.virt_addr); +- hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr); ++ if (hr_qp->rdb_en == 1) ++ hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr); + } else { + dev_warn(hr_dev->dev, "flush cqe is unsupported in userspace!\n"); + return; +diff --git a/drivers/infiniband/hw/hns/hns_roce_mr.c b/drivers/infiniband/hw/hns/hns_roce_mr.c +index 41a538d23b80..c68596d4e803 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_mr.c ++++ b/drivers/infiniband/hw/hns/hns_roce_mr.c +@@ -1017,14 +1017,14 @@ struct ib_mr *hns_roce_reg_user_mr(struct ib_pd *pd, u64 start, u64 length, + goto err_umem; + } + } else { +- int pbl_size = 1; ++ u64 pbl_size = 1; + + bt_size = (1 << (hr_dev->caps.pbl_ba_pg_sz + PAGE_SHIFT)) / 8; + for (i = 0; i < hr_dev->caps.pbl_hop_num; i++) + pbl_size *= bt_size; + if (n > pbl_size) { + dev_err(dev, +- " MR len %lld err. MR page num is limited to %d!\n", ++ " MR len %lld err. MR page num is limited to %lld!\n", + length, pbl_size); + ret = -EINVAL; + goto err_umem; +diff --git a/drivers/infiniband/hw/hns/hns_roce_qp.c b/drivers/infiniband/hw/hns/hns_roce_qp.c +index 54d22868ffba..af24698ff226 100644 +--- a/drivers/infiniband/hw/hns/hns_roce_qp.c ++++ b/drivers/infiniband/hw/hns/hns_roce_qp.c +@@ -522,7 +522,8 @@ static int hns_roce_qp_has_sq(struct ib_qp_init_attr *attr) + static int hns_roce_qp_has_rq(struct ib_qp_init_attr *attr) + { + if (attr->qp_type == IB_QPT_XRC_INI || +- attr->qp_type == IB_QPT_XRC_TGT || attr->srq) ++ attr->qp_type == IB_QPT_XRC_TGT || attr->srq || ++ !attr->cap.max_recv_wr) + return 0; + + return 1; +diff --git a/drivers/infiniband/hw/qedr/qedr_iw_cm.c b/drivers/infiniband/hw/qedr/qedr_iw_cm.c +index 505fa3648762..93b16237b767 100644 +--- a/drivers/infiniband/hw/qedr/qedr_iw_cm.c ++++ b/drivers/infiniband/hw/qedr/qedr_iw_cm.c +@@ -492,6 +492,8 @@ int qedr_iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) + int i; + + qp = idr_find(&dev->qpidr.idr, conn_param->qpn); ++ if (unlikely(!qp)) ++ return -EINVAL; + + laddr = (struct sockaddr_in *)&cm_id->m_local_addr; + raddr = (struct sockaddr_in *)&cm_id->m_remote_addr; +diff --git a/drivers/infiniband/hw/qib/qib_sdma.c b/drivers/infiniband/hw/qib/qib_sdma.c +index d0723d4aef5c..7424e88b0d91 100644 +--- a/drivers/infiniband/hw/qib/qib_sdma.c ++++ b/drivers/infiniband/hw/qib/qib_sdma.c +@@ -576,8 +576,10 @@ retry: + dw = (len + 3) >> 2; + addr = dma_map_single(&ppd->dd->pcidev->dev, sge->vaddr, + dw << 2, DMA_TO_DEVICE); +- if (dma_mapping_error(&ppd->dd->pcidev->dev, addr)) ++ if (dma_mapping_error(&ppd->dd->pcidev->dev, addr)) { ++ ret = -ENOMEM; + goto unmap; ++ } + sdmadesc[0] = 0; + make_sdma_desc(ppd, sdmadesc, (u64) addr, dw, dwoffset); + /* SDmaUseLargeBuf has to be set in every descriptor */ +diff --git a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c +index b65d10b0a875..f4cb5cf26006 100644 +--- a/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c ++++ b/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c +@@ -555,7 +555,7 @@ struct ib_ah *pvrdma_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr, + if (!atomic_add_unless(&dev->num_ahs, 1, dev->dsr->caps.max_ah)) + return ERR_PTR(-ENOMEM); + +- ah = kzalloc(sizeof(*ah), GFP_KERNEL); ++ ah = kzalloc(sizeof(*ah), GFP_ATOMIC); + if (!ah) { + atomic_dec(&dev->num_ahs); + return ERR_PTR(-ENOMEM); +diff --git a/drivers/infiniband/sw/rxe/rxe_hw_counters.c b/drivers/infiniband/sw/rxe/rxe_hw_counters.c +index 6aeb7a165e46..ea4542a9d69e 100644 +--- a/drivers/infiniband/sw/rxe/rxe_hw_counters.c ++++ b/drivers/infiniband/sw/rxe/rxe_hw_counters.c +@@ -59,7 +59,7 @@ int rxe_ib_get_hw_stats(struct ib_device *ibdev, + return -EINVAL; + + for (cnt = 0; cnt < ARRAY_SIZE(rxe_counter_name); cnt++) +- stats->value[cnt] = dev->stats_counters[cnt]; ++ stats->value[cnt] = atomic64_read(&dev->stats_counters[cnt]); + + return ARRAY_SIZE(rxe_counter_name); + } +diff --git a/drivers/infiniband/sw/rxe/rxe_verbs.h b/drivers/infiniband/sw/rxe/rxe_verbs.h +index a0ec28d2b71a..6a75f96b9096 100644 +--- a/drivers/infiniband/sw/rxe/rxe_verbs.h ++++ b/drivers/infiniband/sw/rxe/rxe_verbs.h +@@ -409,16 +409,16 @@ struct rxe_dev { + spinlock_t mmap_offset_lock; /* guard mmap_offset */ + int mmap_offset; + +- u64 stats_counters[RXE_NUM_OF_COUNTERS]; ++ atomic64_t stats_counters[RXE_NUM_OF_COUNTERS]; + + struct rxe_port port; + struct list_head list; + struct crypto_shash *tfm; + }; + +-static inline void rxe_counter_inc(struct rxe_dev *rxe, enum rxe_counters cnt) ++static inline void rxe_counter_inc(struct rxe_dev *rxe, enum rxe_counters index) + { +- rxe->stats_counters[cnt]++; ++ atomic64_inc(&rxe->stats_counters[index]); + } + + static inline struct rxe_dev *to_rdev(struct ib_device *dev) +diff --git a/drivers/infiniband/ulp/srp/ib_srp.c b/drivers/infiniband/ulp/srp/ib_srp.c +index bc6a44a16445..03ee53adaacd 100644 +--- a/drivers/infiniband/ulp/srp/ib_srp.c ++++ b/drivers/infiniband/ulp/srp/ib_srp.c +@@ -2357,6 +2357,7 @@ static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd) + + if (srp_post_send(ch, iu, len)) { + shost_printk(KERN_ERR, target->scsi_host, PFX "Send failed\n"); ++ scmnd->result = DID_ERROR << 16; + goto err_unmap; + } + +diff --git a/drivers/input/serio/gscps2.c b/drivers/input/serio/gscps2.c +index 49d8d53e50b7..96f9b5397367 100644 +--- a/drivers/input/serio/gscps2.c ++++ b/drivers/input/serio/gscps2.c +@@ -381,9 +381,9 @@ static int __init gscps2_probe(struct parisc_device *dev) + goto fail; + #endif + +- printk(KERN_INFO "serio: %s port at 0x%p irq %d @ %s\n", ++ pr_info("serio: %s port at 0x%08lx irq %d @ %s\n", + ps2port->port->name, +- ps2port->addr, ++ hpa, + ps2port->padev->irq, + ps2port->port->phys); + +diff --git a/drivers/input/serio/hp_sdc.c b/drivers/input/serio/hp_sdc.c +index 0b8a25c58d02..654252361653 100644 +--- a/drivers/input/serio/hp_sdc.c ++++ b/drivers/input/serio/hp_sdc.c +@@ -884,8 +884,8 @@ static int __init hp_sdc_init(void) + "HP SDC NMI", &hp_sdc)) + goto err2; + +- printk(KERN_INFO PREFIX "HP SDC at 0x%p, IRQ %d (NMI IRQ %d)\n", +- (void *)hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi); ++ pr_info(PREFIX "HP SDC at 0x%08lx, IRQ %d (NMI IRQ %d)\n", ++ hp_sdc.base_io, hp_sdc.irq, hp_sdc.nmi); + + hp_sdc_status_in8(); + hp_sdc_data_in8(); +diff --git a/drivers/iommu/amd_iommu.c b/drivers/iommu/amd_iommu.c +index 1f2ed44de243..fe18804a5008 100644 +--- a/drivers/iommu/amd_iommu.c ++++ b/drivers/iommu/amd_iommu.c +@@ -139,10 +139,14 @@ static struct lock_class_key reserved_rbtree_key; + static inline int match_hid_uid(struct device *dev, + struct acpihid_map_entry *entry) + { ++ struct acpi_device *adev = ACPI_COMPANION(dev); + const char *hid, *uid; + +- hid = acpi_device_hid(ACPI_COMPANION(dev)); +- uid = acpi_device_uid(ACPI_COMPANION(dev)); ++ if (!adev) ++ return -ENODEV; ++ ++ hid = acpi_device_hid(adev); ++ uid = acpi_device_uid(adev); + + if (!hid || !(*hid)) + return -ENODEV; +diff --git a/drivers/mailbox/mailbox-test.c b/drivers/mailbox/mailbox-test.c +index 58bfafc34bc4..129b3656c453 100644 +--- a/drivers/mailbox/mailbox-test.c ++++ b/drivers/mailbox/mailbox-test.c +@@ -363,22 +363,24 @@ static int mbox_test_probe(struct platform_device *pdev) + + /* It's okay for MMIO to be NULL */ + res = platform_get_resource(pdev, IORESOURCE_MEM, 0); +- size = resource_size(res); + tdev->tx_mmio = devm_ioremap_resource(&pdev->dev, res); +- if (PTR_ERR(tdev->tx_mmio) == -EBUSY) ++ if (PTR_ERR(tdev->tx_mmio) == -EBUSY) { + /* if reserved area in SRAM, try just ioremap */ ++ size = resource_size(res); + tdev->tx_mmio = devm_ioremap(&pdev->dev, res->start, size); +- else if (IS_ERR(tdev->tx_mmio)) ++ } else if (IS_ERR(tdev->tx_mmio)) { + tdev->tx_mmio = NULL; ++ } + + /* If specified, second reg entry is Rx MMIO */ + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); +- size = resource_size(res); + tdev->rx_mmio = devm_ioremap_resource(&pdev->dev, res); +- if (PTR_ERR(tdev->rx_mmio) == -EBUSY) ++ if (PTR_ERR(tdev->rx_mmio) == -EBUSY) { ++ size = resource_size(res); + tdev->rx_mmio = devm_ioremap(&pdev->dev, res->start, size); +- else if (IS_ERR(tdev->rx_mmio)) ++ } else if (IS_ERR(tdev->rx_mmio)) { + tdev->rx_mmio = tdev->tx_mmio; ++ } + + tdev->tx_channel = mbox_test_request_channel(pdev, "tx"); + tdev->rx_channel = mbox_test_request_channel(pdev, "rx"); +diff --git a/drivers/mailbox/stm32-ipcc.c b/drivers/mailbox/stm32-ipcc.c +index ca1f993c0de3..e31322225e93 100644 +--- a/drivers/mailbox/stm32-ipcc.c ++++ b/drivers/mailbox/stm32-ipcc.c +@@ -50,6 +50,7 @@ struct stm32_ipcc { + void __iomem *reg_base; + void __iomem *reg_proc; + struct clk *clk; ++ spinlock_t lock; /* protect access to IPCC registers */ + int irqs[IPCC_IRQ_NUM]; + int wkp; + u32 proc_id; +@@ -58,14 +59,24 @@ struct stm32_ipcc { + u32 xmr; + }; + +-static inline void stm32_ipcc_set_bits(void __iomem *reg, u32 mask) ++static inline void stm32_ipcc_set_bits(spinlock_t *lock, void __iomem *reg, ++ u32 mask) + { ++ unsigned long flags; ++ ++ spin_lock_irqsave(lock, flags); + writel_relaxed(readl_relaxed(reg) | mask, reg); ++ spin_unlock_irqrestore(lock, flags); + } + +-static inline void stm32_ipcc_clr_bits(void __iomem *reg, u32 mask) ++static inline void stm32_ipcc_clr_bits(spinlock_t *lock, void __iomem *reg, ++ u32 mask) + { ++ unsigned long flags; ++ ++ spin_lock_irqsave(lock, flags); + writel_relaxed(readl_relaxed(reg) & ~mask, reg); ++ spin_unlock_irqrestore(lock, flags); + } + + static irqreturn_t stm32_ipcc_rx_irq(int irq, void *data) +@@ -92,7 +103,7 @@ static irqreturn_t stm32_ipcc_rx_irq(int irq, void *data) + + mbox_chan_received_data(&ipcc->controller.chans[chan], NULL); + +- stm32_ipcc_set_bits(ipcc->reg_proc + IPCC_XSCR, ++ stm32_ipcc_set_bits(&ipcc->lock, ipcc->reg_proc + IPCC_XSCR, + RX_BIT_CHAN(chan)); + + ret = IRQ_HANDLED; +@@ -121,7 +132,7 @@ static irqreturn_t stm32_ipcc_tx_irq(int irq, void *data) + dev_dbg(dev, "%s: chan:%d tx\n", __func__, chan); + + /* mask 'tx channel free' interrupt */ +- stm32_ipcc_set_bits(ipcc->reg_proc + IPCC_XMR, ++ stm32_ipcc_set_bits(&ipcc->lock, ipcc->reg_proc + IPCC_XMR, + TX_BIT_CHAN(chan)); + + mbox_chan_txdone(&ipcc->controller.chans[chan], 0); +@@ -141,10 +152,12 @@ static int stm32_ipcc_send_data(struct mbox_chan *link, void *data) + dev_dbg(ipcc->controller.dev, "%s: chan:%d\n", __func__, chan); + + /* set channel n occupied */ +- stm32_ipcc_set_bits(ipcc->reg_proc + IPCC_XSCR, TX_BIT_CHAN(chan)); ++ stm32_ipcc_set_bits(&ipcc->lock, ipcc->reg_proc + IPCC_XSCR, ++ TX_BIT_CHAN(chan)); + + /* unmask 'tx channel free' interrupt */ +- stm32_ipcc_clr_bits(ipcc->reg_proc + IPCC_XMR, TX_BIT_CHAN(chan)); ++ stm32_ipcc_clr_bits(&ipcc->lock, ipcc->reg_proc + IPCC_XMR, ++ TX_BIT_CHAN(chan)); + + return 0; + } +@@ -163,7 +176,8 @@ static int stm32_ipcc_startup(struct mbox_chan *link) + } + + /* unmask 'rx channel occupied' interrupt */ +- stm32_ipcc_clr_bits(ipcc->reg_proc + IPCC_XMR, RX_BIT_CHAN(chan)); ++ stm32_ipcc_clr_bits(&ipcc->lock, ipcc->reg_proc + IPCC_XMR, ++ RX_BIT_CHAN(chan)); + + return 0; + } +@@ -175,7 +189,7 @@ static void stm32_ipcc_shutdown(struct mbox_chan *link) + controller); + + /* mask rx/tx interrupt */ +- stm32_ipcc_set_bits(ipcc->reg_proc + IPCC_XMR, ++ stm32_ipcc_set_bits(&ipcc->lock, ipcc->reg_proc + IPCC_XMR, + RX_BIT_CHAN(chan) | TX_BIT_CHAN(chan)); + + clk_disable_unprepare(ipcc->clk); +@@ -208,6 +222,8 @@ static int stm32_ipcc_probe(struct platform_device *pdev) + if (!ipcc) + return -ENOMEM; + ++ spin_lock_init(&ipcc->lock); ++ + /* proc_id */ + if (of_property_read_u32(np, "st,proc-id", &ipcc->proc_id)) { + dev_err(dev, "Missing st,proc-id\n"); +@@ -259,9 +275,10 @@ static int stm32_ipcc_probe(struct platform_device *pdev) + } + + /* mask and enable rx/tx irq */ +- stm32_ipcc_set_bits(ipcc->reg_proc + IPCC_XMR, ++ stm32_ipcc_set_bits(&ipcc->lock, ipcc->reg_proc + IPCC_XMR, + RX_BIT_MASK | TX_BIT_MASK); +- stm32_ipcc_set_bits(ipcc->reg_proc + IPCC_XCR, XCR_RXOIE | XCR_TXOIE); ++ stm32_ipcc_set_bits(&ipcc->lock, ipcc->reg_proc + IPCC_XCR, ++ XCR_RXOIE | XCR_TXOIE); + + /* wakeup */ + if (of_property_read_bool(np, "wakeup-source")) { +diff --git a/drivers/md/bcache/debug.c b/drivers/md/bcache/debug.c +index 06da66b2488a..8c53d874ada4 100644 +--- a/drivers/md/bcache/debug.c ++++ b/drivers/md/bcache/debug.c +@@ -249,8 +249,7 @@ void bch_debug_init_cache_set(struct cache_set *c) + + void bch_debug_exit(void) + { +- if (!IS_ERR_OR_NULL(bcache_debug)) +- debugfs_remove_recursive(bcache_debug); ++ debugfs_remove_recursive(bcache_debug); + } + + void __init bch_debug_init(struct kobject *kobj) +diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c +index 4998b4cae9c1..14d381cc6d74 100644 +--- a/drivers/md/bcache/super.c ++++ b/drivers/md/bcache/super.c +@@ -1491,8 +1491,7 @@ static void cache_set_free(struct closure *cl) + struct cache *ca; + unsigned int i; + +- if (!IS_ERR_OR_NULL(c->debug)) +- debugfs_remove(c->debug); ++ debugfs_remove(c->debug); + + bch_open_buckets_free(c); + bch_btree_cache_free(c); +diff --git a/drivers/md/bcache/writeback.c b/drivers/md/bcache/writeback.c +index ba5395fd386d..b5fc3c6c7178 100644 +--- a/drivers/md/bcache/writeback.c ++++ b/drivers/md/bcache/writeback.c +@@ -781,7 +781,7 @@ void bch_cached_dev_writeback_init(struct cached_dev *dc) + bch_keybuf_init(&dc->writeback_keys); + + dc->writeback_metadata = true; +- dc->writeback_running = true; ++ dc->writeback_running = false; + dc->writeback_percent = 10; + dc->writeback_delay = 30; + atomic_long_set(&dc->writeback_rate.rate, 1024); +@@ -810,6 +810,7 @@ int bch_cached_dev_writeback_start(struct cached_dev *dc) + destroy_workqueue(dc->writeback_write_wq); + return PTR_ERR(dc->writeback_thread); + } ++ dc->writeback_running = true; + + WARN_ON(test_and_set_bit(BCACHE_DEV_WB_RUNNING, &dc->disk.flags)); + schedule_delayed_work(&dc->writeback_rate_update, +diff --git a/drivers/md/dm-flakey.c b/drivers/md/dm-flakey.c +index b86d2439ffc7..2fcf62fb2844 100644 +--- a/drivers/md/dm-flakey.c ++++ b/drivers/md/dm-flakey.c +@@ -287,20 +287,31 @@ static void flakey_map_bio(struct dm_target *ti, struct bio *bio) + + static void corrupt_bio_data(struct bio *bio, struct flakey_c *fc) + { +- unsigned bio_bytes = bio_cur_bytes(bio); +- char *data = bio_data(bio); ++ unsigned int corrupt_bio_byte = fc->corrupt_bio_byte - 1; ++ ++ struct bvec_iter iter; ++ struct bio_vec bvec; ++ ++ if (!bio_has_data(bio)) ++ return; + + /* +- * Overwrite the Nth byte of the data returned. ++ * Overwrite the Nth byte of the bio's data, on whichever page ++ * it falls. + */ +- if (data && bio_bytes >= fc->corrupt_bio_byte) { +- data[fc->corrupt_bio_byte - 1] = fc->corrupt_bio_value; +- +- DMDEBUG("Corrupting data bio=%p by writing %u to byte %u " +- "(rw=%c bi_opf=%u bi_sector=%llu cur_bytes=%u)\n", +- bio, fc->corrupt_bio_value, fc->corrupt_bio_byte, +- (bio_data_dir(bio) == WRITE) ? 'w' : 'r', bio->bi_opf, +- (unsigned long long)bio->bi_iter.bi_sector, bio_bytes); ++ bio_for_each_segment(bvec, bio, iter) { ++ if (bio_iter_len(bio, iter) > corrupt_bio_byte) { ++ char *segment = (page_address(bio_iter_page(bio, iter)) ++ + bio_iter_offset(bio, iter)); ++ segment[corrupt_bio_byte] = fc->corrupt_bio_value; ++ DMDEBUG("Corrupting data bio=%p by writing %u to byte %u " ++ "(rw=%c bi_opf=%u bi_sector=%llu size=%u)\n", ++ bio, fc->corrupt_bio_value, fc->corrupt_bio_byte, ++ (bio_data_dir(bio) == WRITE) ? 'w' : 'r', bio->bi_opf, ++ (unsigned long long)bio->bi_iter.bi_sector, bio->bi_iter.bi_size); ++ break; ++ } ++ corrupt_bio_byte -= bio_iter_len(bio, iter); + } + } + +diff --git a/drivers/md/dm-raid.c b/drivers/md/dm-raid.c +index 6c9b54288261..23de59a692c5 100644 +--- a/drivers/md/dm-raid.c ++++ b/drivers/md/dm-raid.c +@@ -3690,8 +3690,7 @@ static int raid_message(struct dm_target *ti, unsigned int argc, char **argv, + set_bit(MD_RECOVERY_INTR, &mddev->recovery); + md_reap_sync_thread(mddev); + } +- } else if (test_bit(MD_RECOVERY_RUNNING, &mddev->recovery) || +- test_bit(MD_RECOVERY_NEEDED, &mddev->recovery)) ++ } else if (decipher_sync_action(mddev, mddev->recovery) != st_idle) + return -EBUSY; + else if (!strcasecmp(argv[0], "resync")) + ; /* MD_RECOVERY_NEEDED set below */ +diff --git a/drivers/media/platform/atmel/atmel-isc.c b/drivers/media/platform/atmel/atmel-isc.c +index d89e14524d42..1fd078257670 100644 +--- a/drivers/media/platform/atmel/atmel-isc.c ++++ b/drivers/media/platform/atmel/atmel-isc.c +@@ -1895,6 +1895,8 @@ static int isc_async_complete(struct v4l2_async_notifier *notifier) + struct vb2_queue *q = &isc->vb2_vidq; + int ret; + ++ INIT_WORK(&isc->awb_work, isc_awb_work); ++ + ret = v4l2_device_register_subdev_nodes(&isc->v4l2_dev); + if (ret < 0) { + v4l2_err(&isc->v4l2_dev, "Failed to register subdev nodes\n"); +@@ -1948,8 +1950,6 @@ static int isc_async_complete(struct v4l2_async_notifier *notifier) + return ret; + } + +- INIT_WORK(&isc->awb_work, isc_awb_work); +- + /* Register video device */ + strlcpy(vdev->name, ATMEL_ISC_NAME, sizeof(vdev->name)); + vdev->release = video_device_release_empty; +@@ -2062,8 +2062,11 @@ static int isc_parse_dt(struct device *dev, struct isc_device *isc) + break; + } + +- subdev_entity->asd = devm_kzalloc(dev, +- sizeof(*subdev_entity->asd), GFP_KERNEL); ++ /* asd will be freed by the subsystem once it's added to the ++ * notifier list ++ */ ++ subdev_entity->asd = kzalloc(sizeof(*subdev_entity->asd), ++ GFP_KERNEL); + if (!subdev_entity->asd) { + of_node_put(rem); + ret = -ENOMEM; +@@ -2209,6 +2212,7 @@ static int atmel_isc_probe(struct platform_device *pdev) + &subdev_entity->notifier); + if (ret) { + dev_err(dev, "fail to register async notifier\n"); ++ kfree(subdev_entity->asd); + goto cleanup_subdev; + } + +diff --git a/drivers/media/platform/stm32/stm32-dcmi.c b/drivers/media/platform/stm32/stm32-dcmi.c +index 1d9c028e52cb..18d0b5641789 100644 +--- a/drivers/media/platform/stm32/stm32-dcmi.c ++++ b/drivers/media/platform/stm32/stm32-dcmi.c +@@ -164,6 +164,9 @@ struct stm32_dcmi { + int errors_count; + int overrun_count; + int buffers_count; ++ ++ /* Ensure DMA operations atomicity */ ++ struct mutex dma_lock; + }; + + static inline struct stm32_dcmi *notifier_to_dcmi(struct v4l2_async_notifier *n) +@@ -314,6 +317,13 @@ static int dcmi_start_dma(struct stm32_dcmi *dcmi, + return ret; + } + ++ /* ++ * Avoid call of dmaengine_terminate_all() between ++ * dmaengine_prep_slave_single() and dmaengine_submit() ++ * by locking the whole DMA submission sequence ++ */ ++ mutex_lock(&dcmi->dma_lock); ++ + /* Prepare a DMA transaction */ + desc = dmaengine_prep_slave_single(dcmi->dma_chan, buf->paddr, + buf->size, +@@ -322,6 +332,7 @@ static int dcmi_start_dma(struct stm32_dcmi *dcmi, + if (!desc) { + dev_err(dcmi->dev, "%s: DMA dmaengine_prep_slave_single failed for buffer phy=%pad size=%zu\n", + __func__, &buf->paddr, buf->size); ++ mutex_unlock(&dcmi->dma_lock); + return -EINVAL; + } + +@@ -333,9 +344,12 @@ static int dcmi_start_dma(struct stm32_dcmi *dcmi, + dcmi->dma_cookie = dmaengine_submit(desc); + if (dma_submit_error(dcmi->dma_cookie)) { + dev_err(dcmi->dev, "%s: DMA submission failed\n", __func__); ++ mutex_unlock(&dcmi->dma_lock); + return -ENXIO; + } + ++ mutex_unlock(&dcmi->dma_lock); ++ + dma_async_issue_pending(dcmi->dma_chan); + + return 0; +@@ -570,9 +584,9 @@ static int dcmi_start_streaming(struct vb2_queue *vq, unsigned int count) + int ret; + + ret = pm_runtime_get_sync(dcmi->dev); +- if (ret) { +- dev_err(dcmi->dev, "%s: Failed to start streaming, cannot get sync\n", +- __func__); ++ if (ret < 0) { ++ dev_err(dcmi->dev, "%s: Failed to start streaming, cannot get sync (%d)\n", ++ __func__, ret); + goto err_release_buffers; + } + +@@ -717,7 +731,9 @@ static void dcmi_stop_streaming(struct vb2_queue *vq) + spin_unlock_irq(&dcmi->irqlock); + + /* Stop all pending DMA operations */ ++ mutex_lock(&dcmi->dma_lock); + dmaengine_terminate_all(dcmi->dma_chan); ++ mutex_unlock(&dcmi->dma_lock); + + pm_runtime_put(dcmi->dev); + +@@ -1719,6 +1735,7 @@ static int dcmi_probe(struct platform_device *pdev) + + spin_lock_init(&dcmi->irqlock); + mutex_init(&dcmi->lock); ++ mutex_init(&dcmi->dma_lock); + init_completion(&dcmi->complete); + INIT_LIST_HEAD(&dcmi->buffers); + +diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c +index 0986572bbe88..f4ebff347d7a 100644 +--- a/drivers/media/v4l2-core/v4l2-ctrls.c ++++ b/drivers/media/v4l2-core/v4l2-ctrls.c +@@ -1145,6 +1145,7 @@ void v4l2_ctrl_fill(u32 id, const char **name, enum v4l2_ctrl_type *type, + case V4L2_CID_FLASH_STROBE_STOP: + case V4L2_CID_AUTO_FOCUS_START: + case V4L2_CID_AUTO_FOCUS_STOP: ++ case V4L2_CID_DO_WHITE_BALANCE: + *type = V4L2_CTRL_TYPE_BUTTON; + *flags |= V4L2_CTRL_FLAG_WRITE_ONLY | + V4L2_CTRL_FLAG_EXECUTE_ON_WRITE; +diff --git a/drivers/memory/omap-gpmc.c b/drivers/memory/omap-gpmc.c +index c215287e80cf..1c6a7c16e0c1 100644 +--- a/drivers/memory/omap-gpmc.c ++++ b/drivers/memory/omap-gpmc.c +@@ -21,6 +21,7 @@ + #include <linux/spinlock.h> + #include <linux/io.h> + #include <linux/gpio/driver.h> ++#include <linux/gpio/consumer.h> /* GPIO descriptor enum */ + #include <linux/interrupt.h> + #include <linux/irqdomain.h> + #include <linux/platform_device.h> +diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c +index c383322ec2ba..bb2e1387b119 100644 +--- a/drivers/misc/mei/bus.c ++++ b/drivers/misc/mei/bus.c +@@ -883,15 +883,16 @@ static const struct device_type mei_cl_device_type = { + + /** + * mei_cl_bus_set_name - set device name for me client device ++ * <controller>-<client device> ++ * Example: 0000:00:16.0-55213584-9a29-4916-badf-0fb7ed682aeb + * + * @cldev: me client device + */ + static inline void mei_cl_bus_set_name(struct mei_cl_device *cldev) + { +- dev_set_name(&cldev->dev, "mei:%s:%pUl:%02X", +- cldev->name, +- mei_me_cl_uuid(cldev->me_cl), +- mei_me_cl_ver(cldev->me_cl)); ++ dev_set_name(&cldev->dev, "%s-%pUl", ++ dev_name(cldev->bus->dev), ++ mei_me_cl_uuid(cldev->me_cl)); + } + + /** +diff --git a/drivers/misc/mei/hw-me-regs.h b/drivers/misc/mei/hw-me-regs.h +index f85aa3f4042d..9c4042420022 100644 +--- a/drivers/misc/mei/hw-me-regs.h ++++ b/drivers/misc/mei/hw-me-regs.h +@@ -141,6 +141,7 @@ + + #define MEI_DEV_ID_CMP_LP 0x02e0 /* Comet Point LP */ + #define MEI_DEV_ID_CMP_LP_3 0x02e4 /* Comet Point LP 3 (iTouch) */ ++#define MEI_DEV_ID_CMP_V 0xA3BA /* Comet Point Lake V */ + + #define MEI_DEV_ID_ICP_LP 0x34E0 /* Ice Lake Point LP */ + +diff --git a/drivers/misc/mei/pci-me.c b/drivers/misc/mei/pci-me.c +index 28cdd87851cb..41a10e392839 100644 +--- a/drivers/misc/mei/pci-me.c ++++ b/drivers/misc/mei/pci-me.c +@@ -107,6 +107,7 @@ static const struct pci_device_id mei_me_pci_tbl[] = { + + {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_LP, MEI_ME_PCH12_CFG)}, + {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_LP_3, MEI_ME_PCH8_CFG)}, ++ {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_V, MEI_ME_PCH12_CFG)}, + + {MEI_PCI_DEVICE(MEI_DEV_ID_ICP_LP, MEI_ME_PCH12_CFG)}, + +diff --git a/drivers/mmc/core/block.c b/drivers/mmc/core/block.c +index eee004fb3c3e..527ab15c421f 100644 +--- a/drivers/mmc/core/block.c ++++ b/drivers/mmc/core/block.c +@@ -2384,12 +2384,6 @@ static struct mmc_blk_data *mmc_blk_alloc_req(struct mmc_card *card, + snprintf(md->disk->disk_name, sizeof(md->disk->disk_name), + "mmcblk%u%s", card->host->index, subname ? subname : ""); + +- if (mmc_card_mmc(card)) +- blk_queue_logical_block_size(md->queue.queue, +- card->ext_csd.data_sector_size); +- else +- blk_queue_logical_block_size(md->queue.queue, 512); +- + set_capacity(md->disk, size); + + if (mmc_host_cmd23(card->host)) { +diff --git a/drivers/mmc/core/queue.c b/drivers/mmc/core/queue.c +index 18aae28845ec..becc6594a8a4 100644 +--- a/drivers/mmc/core/queue.c ++++ b/drivers/mmc/core/queue.c +@@ -355,6 +355,7 @@ static void mmc_setup_queue(struct mmc_queue *mq, struct mmc_card *card) + { + struct mmc_host *host = card->host; + u64 limit = BLK_BOUNCE_HIGH; ++ unsigned block_size = 512; + + if (mmc_dev(host)->dma_mask && *mmc_dev(host)->dma_mask) + limit = (u64)dma_max_pfn(mmc_dev(host)) << PAGE_SHIFT; +@@ -368,7 +369,13 @@ static void mmc_setup_queue(struct mmc_queue *mq, struct mmc_card *card) + blk_queue_max_hw_sectors(mq->queue, + min(host->max_blk_count, host->max_req_size / 512)); + blk_queue_max_segments(mq->queue, host->max_segs); +- blk_queue_max_segment_size(mq->queue, host->max_seg_size); ++ ++ if (mmc_card_mmc(card)) ++ block_size = card->ext_csd.data_sector_size; ++ ++ blk_queue_logical_block_size(mq->queue, block_size); ++ blk_queue_max_segment_size(mq->queue, ++ round_down(host->max_seg_size, block_size)); + + INIT_WORK(&mq->recovery_work, mmc_mq_recovery_handler); + INIT_WORK(&mq->complete_work, mmc_blk_mq_complete_work); +diff --git a/drivers/mmc/host/meson-gx-mmc.c b/drivers/mmc/host/meson-gx-mmc.c +index ddd98cdd33bc..72f34a58928c 100644 +--- a/drivers/mmc/host/meson-gx-mmc.c ++++ b/drivers/mmc/host/meson-gx-mmc.c +@@ -21,6 +21,7 @@ + #include <linux/kernel.h> + #include <linux/module.h> + #include <linux/init.h> ++#include <linux/delay.h> + #include <linux/device.h> + #include <linux/of_device.h> + #include <linux/platform_device.h> +@@ -90,9 +91,11 @@ + #define CFG_CLK_ALWAYS_ON BIT(18) + #define CFG_CHK_DS BIT(20) + #define CFG_AUTO_CLK BIT(23) ++#define CFG_ERR_ABORT BIT(27) + + #define SD_EMMC_STATUS 0x48 + #define STATUS_BUSY BIT(31) ++#define STATUS_DESC_BUSY BIT(30) + #define STATUS_DATI GENMASK(23, 16) + + #define SD_EMMC_IRQ_EN 0x4c +@@ -930,6 +933,7 @@ static void meson_mmc_start_cmd(struct mmc_host *mmc, struct mmc_command *cmd) + + cmd_cfg |= FIELD_PREP(CMD_CFG_CMD_INDEX_MASK, cmd->opcode); + cmd_cfg |= CMD_CFG_OWNER; /* owned by CPU */ ++ cmd_cfg |= CMD_CFG_ERROR; /* stop in case of error */ + + meson_mmc_set_response_bits(cmd, &cmd_cfg); + +@@ -1024,6 +1028,17 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) + u32 irq_en, status, raw_status; + irqreturn_t ret = IRQ_NONE; + ++ irq_en = readl(host->regs + SD_EMMC_IRQ_EN); ++ raw_status = readl(host->regs + SD_EMMC_STATUS); ++ status = raw_status & irq_en; ++ ++ if (!status) { ++ dev_dbg(host->dev, ++ "Unexpected IRQ! irq_en 0x%08x - status 0x%08x\n", ++ irq_en, raw_status); ++ return IRQ_NONE; ++ } ++ + if (WARN_ON(!host) || WARN_ON(!host->cmd)) + return IRQ_NONE; + +@@ -1031,22 +1046,18 @@ static irqreturn_t meson_mmc_irq(int irq, void *dev_id) + + cmd = host->cmd; + data = cmd->data; +- irq_en = readl(host->regs + SD_EMMC_IRQ_EN); +- raw_status = readl(host->regs + SD_EMMC_STATUS); +- status = raw_status & irq_en; +- + cmd->error = 0; + if (status & IRQ_CRC_ERR) { + dev_dbg(host->dev, "CRC Error - status 0x%08x\n", status); + cmd->error = -EILSEQ; +- ret = IRQ_HANDLED; ++ ret = IRQ_WAKE_THREAD; + goto out; + } + + if (status & IRQ_TIMEOUTS) { + dev_dbg(host->dev, "Timeout - status 0x%08x\n", status); + cmd->error = -ETIMEDOUT; +- ret = IRQ_HANDLED; ++ ret = IRQ_WAKE_THREAD; + goto out; + } + +@@ -1071,17 +1082,49 @@ out: + /* ack all enabled interrupts */ + writel(irq_en, host->regs + SD_EMMC_STATUS); + ++ if (cmd->error) { ++ /* Stop desc in case of errors */ ++ u32 start = readl(host->regs + SD_EMMC_START); ++ ++ start &= ~START_DESC_BUSY; ++ writel(start, host->regs + SD_EMMC_START); ++ } ++ + if (ret == IRQ_HANDLED) + meson_mmc_request_done(host->mmc, cmd->mrq); +- else if (ret == IRQ_NONE) +- dev_warn(host->dev, +- "Unexpected IRQ! status=0x%08x, irq_en=0x%08x\n", +- raw_status, irq_en); + + spin_unlock(&host->lock); + return ret; + } + ++static int meson_mmc_wait_desc_stop(struct meson_host *host) ++{ ++ int loop; ++ u32 status; ++ ++ /* ++ * It may sometimes take a while for it to actually halt. Here, we ++ * are giving it 5ms to comply ++ * ++ * If we don't confirm the descriptor is stopped, it might raise new ++ * IRQs after we have called mmc_request_done() which is bad. ++ */ ++ for (loop = 50; loop; loop--) { ++ status = readl(host->regs + SD_EMMC_STATUS); ++ if (status & (STATUS_BUSY | STATUS_DESC_BUSY)) ++ udelay(100); ++ else ++ break; ++ } ++ ++ if (status & (STATUS_BUSY | STATUS_DESC_BUSY)) { ++ dev_err(host->dev, "Timed out waiting for host to stop\n"); ++ return -ETIMEDOUT; ++ } ++ ++ return 0; ++} ++ + static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id) + { + struct meson_host *host = dev_id; +@@ -1092,6 +1135,13 @@ static irqreturn_t meson_mmc_irq_thread(int irq, void *dev_id) + if (WARN_ON(!cmd)) + return IRQ_NONE; + ++ if (cmd->error) { ++ meson_mmc_wait_desc_stop(host); ++ meson_mmc_request_done(host->mmc, cmd->mrq); ++ ++ return IRQ_HANDLED; ++ } ++ + data = cmd->data; + if (meson_mmc_bounce_buf_read(data)) { + xfer_bytes = data->blksz * data->blocks; +@@ -1132,6 +1182,9 @@ static void meson_mmc_cfg_init(struct meson_host *host) + cfg |= FIELD_PREP(CFG_RC_CC_MASK, ilog2(SD_EMMC_CFG_CMD_GAP)); + cfg |= FIELD_PREP(CFG_BLK_LEN_MASK, ilog2(SD_EMMC_CFG_BLK_SIZE)); + ++ /* abort chain on R/W errors */ ++ cfg |= CFG_ERR_ABORT; ++ + writel(cfg, host->regs + SD_EMMC_CFG); + } + +diff --git a/drivers/mtd/mtdcore.h b/drivers/mtd/mtdcore.h +index 9887bda317cd..b31c868019ad 100644 +--- a/drivers/mtd/mtdcore.h ++++ b/drivers/mtd/mtdcore.h +@@ -7,7 +7,7 @@ + extern struct mutex mtd_table_mutex; + + struct mtd_info *__mtd_next_device(int i); +-int add_mtd_device(struct mtd_info *mtd); ++int __must_check add_mtd_device(struct mtd_info *mtd); + int del_mtd_device(struct mtd_info *mtd); + int add_mtd_partitions(struct mtd_info *, const struct mtd_partition *, int); + int del_mtd_partitions(struct mtd_info *); +diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c +index 0bbb23b014f1..10c53364aa70 100644 +--- a/drivers/mtd/mtdpart.c ++++ b/drivers/mtd/mtdpart.c +@@ -612,10 +612,21 @@ int mtd_add_partition(struct mtd_info *parent, const char *name, + list_add(&new->list, &mtd_partitions); + mutex_unlock(&mtd_partitions_mutex); + +- add_mtd_device(&new->mtd); ++ ret = add_mtd_device(&new->mtd); ++ if (ret) ++ goto err_remove_part; + + mtd_add_partition_attrs(new); + ++ return 0; ++ ++err_remove_part: ++ mutex_lock(&mtd_partitions_mutex); ++ list_del(&new->list); ++ mutex_unlock(&mtd_partitions_mutex); ++ ++ free_partition(new); ++ + return ret; + } + EXPORT_SYMBOL_GPL(mtd_add_partition); +@@ -706,22 +717,31 @@ int add_mtd_partitions(struct mtd_info *master, + { + struct mtd_part *slave; + uint64_t cur_offset = 0; +- int i; ++ int i, ret; + + printk(KERN_NOTICE "Creating %d MTD partitions on \"%s\":\n", nbparts, master->name); + + for (i = 0; i < nbparts; i++) { + slave = allocate_partition(master, parts + i, i, cur_offset); + if (IS_ERR(slave)) { +- del_mtd_partitions(master); +- return PTR_ERR(slave); ++ ret = PTR_ERR(slave); ++ goto err_del_partitions; + } + + mutex_lock(&mtd_partitions_mutex); + list_add(&slave->list, &mtd_partitions); + mutex_unlock(&mtd_partitions_mutex); + +- add_mtd_device(&slave->mtd); ++ ret = add_mtd_device(&slave->mtd); ++ if (ret) { ++ mutex_lock(&mtd_partitions_mutex); ++ list_del(&slave->list); ++ mutex_unlock(&mtd_partitions_mutex); ++ ++ free_partition(slave); ++ goto err_del_partitions; ++ } ++ + mtd_add_partition_attrs(slave); + /* Look for subpartitions */ + parse_mtd_partitions(&slave->mtd, parts[i].types, NULL); +@@ -730,6 +750,11 @@ int add_mtd_partitions(struct mtd_info *master, + } + + return 0; ++ ++err_del_partitions: ++ del_mtd_partitions(master); ++ ++ return ret; + } + + static DEFINE_SPINLOCK(part_parser_lock); +diff --git a/drivers/mtd/nand/raw/atmel/nand-controller.c b/drivers/mtd/nand/raw/atmel/nand-controller.c +index 32e95af486a2..ea022712edee 100644 +--- a/drivers/mtd/nand/raw/atmel/nand-controller.c ++++ b/drivers/mtd/nand/raw/atmel/nand-controller.c +@@ -1826,7 +1826,7 @@ static int atmel_nand_controller_add_nands(struct atmel_nand_controller *nc) + + ret = of_property_read_u32(np, "#size-cells", &val); + if (ret) { +- dev_err(dev, "missing #address-cells property\n"); ++ dev_err(dev, "missing #size-cells property\n"); + return ret; + } + +diff --git a/drivers/mtd/nand/raw/atmel/pmecc.c b/drivers/mtd/nand/raw/atmel/pmecc.c +index 555a74e15269..9d3997840889 100644 +--- a/drivers/mtd/nand/raw/atmel/pmecc.c ++++ b/drivers/mtd/nand/raw/atmel/pmecc.c +@@ -876,23 +876,32 @@ static struct atmel_pmecc *atmel_pmecc_get_by_node(struct device *userdev, + { + struct platform_device *pdev; + struct atmel_pmecc *pmecc, **ptr; ++ int ret; + + pdev = of_find_device_by_node(np); +- if (!pdev || !platform_get_drvdata(pdev)) ++ if (!pdev) + return ERR_PTR(-EPROBE_DEFER); ++ pmecc = platform_get_drvdata(pdev); ++ if (!pmecc) { ++ ret = -EPROBE_DEFER; ++ goto err_put_device; ++ } + + ptr = devres_alloc(devm_atmel_pmecc_put, sizeof(*ptr), GFP_KERNEL); +- if (!ptr) +- return ERR_PTR(-ENOMEM); +- +- get_device(&pdev->dev); +- pmecc = platform_get_drvdata(pdev); ++ if (!ptr) { ++ ret = -ENOMEM; ++ goto err_put_device; ++ } + + *ptr = pmecc; + + devres_add(userdev, ptr); + + return pmecc; ++ ++err_put_device: ++ put_device(&pdev->dev); ++ return ERR_PTR(ret); + } + + static const int atmel_pmecc_strengths[] = { 2, 4, 8, 12, 24, 32 }; +diff --git a/drivers/mtd/nand/raw/sunxi_nand.c b/drivers/mtd/nand/raw/sunxi_nand.c +index 1f0b7ee38df5..5b5f4d25a3e1 100644 +--- a/drivers/mtd/nand/raw/sunxi_nand.c ++++ b/drivers/mtd/nand/raw/sunxi_nand.c +@@ -1397,7 +1397,7 @@ static int sunxi_nfc_hw_ecc_write_page_dma(struct mtd_info *mtd, + sunxi_nfc_randomizer_enable(mtd); + + writel((NAND_CMD_RNDIN << 8) | NAND_CMD_PAGEPROG, +- nfc->regs + NFC_REG_RCMD_SET); ++ nfc->regs + NFC_REG_WCMD_SET); + + dma_async_issue_pending(nfc->dmac); + +diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c +index f028277fb1ce..2e183425facd 100644 +--- a/drivers/mtd/spi-nor/spi-nor.c ++++ b/drivers/mtd/spi-nor/spi-nor.c +@@ -2459,7 +2459,7 @@ static int spi_nor_init_params(struct spi_nor *nor, + memset(params, 0, sizeof(*params)); + + /* Set SPI NOR sizes. */ +- params->size = info->sector_size * info->n_sectors; ++ params->size = (u64)info->sector_size * info->n_sectors; + params->page_size = info->page_size; + + /* (Fast) Read settings. */ +diff --git a/drivers/mtd/ubi/build.c b/drivers/mtd/ubi/build.c +index d2a726654ff1..c120c8761fcd 100644 +--- a/drivers/mtd/ubi/build.c ++++ b/drivers/mtd/ubi/build.c +@@ -1101,10 +1101,10 @@ int ubi_detach_mtd_dev(int ubi_num, int anyway) + ubi_wl_close(ubi); + ubi_free_internal_volumes(ubi); + vfree(ubi->vtbl); +- put_mtd_device(ubi->mtd); + vfree(ubi->peb_buf); + vfree(ubi->fm_buf); + ubi_msg(ubi, "mtd%d is detached", ubi->mtd->index); ++ put_mtd_device(ubi->mtd); + put_device(&ubi->dev); + return 0; + } +diff --git a/drivers/mtd/ubi/kapi.c b/drivers/mtd/ubi/kapi.c +index e9e9ecbcedcc..0b8f0c46268d 100644 +--- a/drivers/mtd/ubi/kapi.c ++++ b/drivers/mtd/ubi/kapi.c +@@ -227,9 +227,9 @@ out_unlock: + out_free: + kfree(desc); + out_put_ubi: +- ubi_put_device(ubi); + ubi_err(ubi, "cannot open device %d, volume %d, error %d", + ubi_num, vol_id, err); ++ ubi_put_device(ubi); + return ERR_PTR(err); + } + EXPORT_SYMBOL_GPL(ubi_open_volume); +diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig +index 619bf1498a66..0652caad57ec 100644 +--- a/drivers/net/Kconfig ++++ b/drivers/net/Kconfig +@@ -197,9 +197,9 @@ config VXLAN + + config GENEVE + tristate "Generic Network Virtualization Encapsulation" +- depends on INET && NET_UDP_TUNNEL ++ depends on INET + depends on IPV6 || !IPV6 +- select NET_IP_TUNNEL ++ select NET_UDP_TUNNEL + select GRO_CELLS + ---help--- + This allows one to create geneve virtual interfaces that provide +diff --git a/drivers/net/can/c_can/c_can.c b/drivers/net/can/c_can/c_can.c +index 9b61bfbea6cd..24c6015f6c92 100644 +--- a/drivers/net/can/c_can/c_can.c ++++ b/drivers/net/can/c_can/c_can.c +@@ -52,6 +52,7 @@ + #define CONTROL_EX_PDR BIT(8) + + /* control register */ ++#define CONTROL_SWR BIT(15) + #define CONTROL_TEST BIT(7) + #define CONTROL_CCE BIT(6) + #define CONTROL_DISABLE_AR BIT(5) +@@ -572,6 +573,26 @@ static void c_can_configure_msg_objects(struct net_device *dev) + IF_MCONT_RCV_EOB); + } + ++static int c_can_software_reset(struct net_device *dev) ++{ ++ struct c_can_priv *priv = netdev_priv(dev); ++ int retry = 0; ++ ++ if (priv->type != BOSCH_D_CAN) ++ return 0; ++ ++ priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_SWR | CONTROL_INIT); ++ while (priv->read_reg(priv, C_CAN_CTRL_REG) & CONTROL_SWR) { ++ msleep(20); ++ if (retry++ > 100) { ++ netdev_err(dev, "CCTRL: software reset failed\n"); ++ return -EIO; ++ } ++ } ++ ++ return 0; ++} ++ + /* + * Configure C_CAN chip: + * - enable/disable auto-retransmission +@@ -581,6 +602,11 @@ static void c_can_configure_msg_objects(struct net_device *dev) + static int c_can_chip_config(struct net_device *dev) + { + struct c_can_priv *priv = netdev_priv(dev); ++ int err; ++ ++ err = c_can_software_reset(dev); ++ if (err) ++ return err; + + /* enable automatic retransmission */ + priv->write_reg(priv, C_CAN_CTRL_REG, CONTROL_ENABLE_AR); +diff --git a/drivers/net/can/flexcan.c b/drivers/net/can/flexcan.c +index 581e84d8e2c8..bfe13c6627be 100644 +--- a/drivers/net/can/flexcan.c ++++ b/drivers/net/can/flexcan.c +@@ -566,6 +566,7 @@ static void flexcan_irq_bus_err(struct net_device *dev, u32 reg_esr) + struct can_frame *cf; + bool rx_errors = false, tx_errors = false; + u32 timestamp; ++ int err; + + timestamp = priv->read(®s->timer) << 16; + +@@ -614,7 +615,9 @@ static void flexcan_irq_bus_err(struct net_device *dev, u32 reg_esr) + if (tx_errors) + dev->stats.tx_errors++; + +- can_rx_offload_queue_sorted(&priv->offload, skb, timestamp); ++ err = can_rx_offload_queue_sorted(&priv->offload, skb, timestamp); ++ if (err) ++ dev->stats.rx_fifo_errors++; + } + + static void flexcan_irq_state(struct net_device *dev, u32 reg_esr) +@@ -627,6 +630,7 @@ static void flexcan_irq_state(struct net_device *dev, u32 reg_esr) + int flt; + struct can_berr_counter bec; + u32 timestamp; ++ int err; + + timestamp = priv->read(®s->timer) << 16; + +@@ -658,7 +662,9 @@ static void flexcan_irq_state(struct net_device *dev, u32 reg_esr) + if (unlikely(new_state == CAN_STATE_BUS_OFF)) + can_bus_off(dev); + +- can_rx_offload_queue_sorted(&priv->offload, skb, timestamp); ++ err = can_rx_offload_queue_sorted(&priv->offload, skb, timestamp); ++ if (err) ++ dev->stats.rx_fifo_errors++; + } + + static inline struct flexcan_priv *rx_offload_to_priv(struct can_rx_offload *offload) +diff --git a/drivers/net/can/rx-offload.c b/drivers/net/can/rx-offload.c +index 6cf0d0bc1e8d..5f7e97d54733 100644 +--- a/drivers/net/can/rx-offload.c ++++ b/drivers/net/can/rx-offload.c +@@ -116,37 +116,95 @@ static int can_rx_offload_compare(struct sk_buff *a, struct sk_buff *b) + return cb_b->timestamp - cb_a->timestamp; + } + +-static struct sk_buff *can_rx_offload_offload_one(struct can_rx_offload *offload, unsigned int n) ++/** ++ * can_rx_offload_offload_one() - Read one CAN frame from HW ++ * @offload: pointer to rx_offload context ++ * @n: number of mailbox to read ++ * ++ * The task of this function is to read a CAN frame from mailbox @n ++ * from the device and return the mailbox's content as a struct ++ * sk_buff. ++ * ++ * If the struct can_rx_offload::skb_queue exceeds the maximal queue ++ * length (struct can_rx_offload::skb_queue_len_max) or no skb can be ++ * allocated, the mailbox contents is discarded by reading it into an ++ * overflow buffer. This way the mailbox is marked as free by the ++ * driver. ++ * ++ * Return: A pointer to skb containing the CAN frame on success. ++ * ++ * NULL if the mailbox @n is empty. ++ * ++ * ERR_PTR() in case of an error ++ */ ++static struct sk_buff * ++can_rx_offload_offload_one(struct can_rx_offload *offload, unsigned int n) + { +- struct sk_buff *skb = NULL; ++ struct sk_buff *skb = NULL, *skb_error = NULL; + struct can_rx_offload_cb *cb; + struct can_frame *cf; + int ret; + +- /* If queue is full or skb not available, read to discard mailbox */ +- if (likely(skb_queue_len(&offload->skb_queue) <= +- offload->skb_queue_len_max)) ++ if (likely(skb_queue_len(&offload->skb_queue) < ++ offload->skb_queue_len_max)) { + skb = alloc_can_skb(offload->dev, &cf); ++ if (unlikely(!skb)) ++ skb_error = ERR_PTR(-ENOMEM); /* skb alloc failed */ ++ } else { ++ skb_error = ERR_PTR(-ENOBUFS); /* skb_queue is full */ ++ } + +- if (!skb) { ++ /* If queue is full or skb not available, drop by reading into ++ * overflow buffer. ++ */ ++ if (unlikely(skb_error)) { + struct can_frame cf_overflow; + u32 timestamp; + + ret = offload->mailbox_read(offload, &cf_overflow, + ×tamp, n); +- if (ret) +- offload->dev->stats.rx_dropped++; + +- return NULL; ++ /* Mailbox was empty. */ ++ if (unlikely(!ret)) ++ return NULL; ++ ++ /* Mailbox has been read and we're dropping it or ++ * there was a problem reading the mailbox. ++ * ++ * Increment error counters in any case. ++ */ ++ offload->dev->stats.rx_dropped++; ++ offload->dev->stats.rx_fifo_errors++; ++ ++ /* There was a problem reading the mailbox, propagate ++ * error value. ++ */ ++ if (unlikely(ret < 0)) ++ return ERR_PTR(ret); ++ ++ return skb_error; + } + + cb = can_rx_offload_get_cb(skb); + ret = offload->mailbox_read(offload, cf, &cb->timestamp, n); +- if (!ret) { ++ ++ /* Mailbox was empty. */ ++ if (unlikely(!ret)) { + kfree_skb(skb); + return NULL; + } + ++ /* There was a problem reading the mailbox, propagate error value. */ ++ if (unlikely(ret < 0)) { ++ kfree_skb(skb); ++ ++ offload->dev->stats.rx_dropped++; ++ offload->dev->stats.rx_fifo_errors++; ++ ++ return ERR_PTR(ret); ++ } ++ ++ /* Mailbox was read. */ + return skb; + } + +@@ -166,8 +224,8 @@ int can_rx_offload_irq_offload_timestamp(struct can_rx_offload *offload, u64 pen + continue; + + skb = can_rx_offload_offload_one(offload, i); +- if (!skb) +- break; ++ if (IS_ERR_OR_NULL(skb)) ++ continue; + + __skb_queue_add_sort(&skb_queue, skb, can_rx_offload_compare); + } +@@ -197,7 +255,13 @@ int can_rx_offload_irq_offload_fifo(struct can_rx_offload *offload) + struct sk_buff *skb; + int received = 0; + +- while ((skb = can_rx_offload_offload_one(offload, 0))) { ++ while (1) { ++ skb = can_rx_offload_offload_one(offload, 0); ++ if (IS_ERR(skb)) ++ continue; ++ if (!skb) ++ break; ++ + skb_queue_tail(&offload->skb_queue, skb); + received++; + } +@@ -261,8 +325,10 @@ int can_rx_offload_queue_tail(struct can_rx_offload *offload, + struct sk_buff *skb) + { + if (skb_queue_len(&offload->skb_queue) > +- offload->skb_queue_len_max) +- return -ENOMEM; ++ offload->skb_queue_len_max) { ++ kfree_skb(skb); ++ return -ENOBUFS; ++ } + + skb_queue_tail(&offload->skb_queue, skb); + can_rx_offload_schedule(offload); +diff --git a/drivers/net/can/spi/mcp251x.c b/drivers/net/can/spi/mcp251x.c +index de8d9dceb123..0b0dd3f096dc 100644 +--- a/drivers/net/can/spi/mcp251x.c ++++ b/drivers/net/can/spi/mcp251x.c +@@ -773,6 +773,7 @@ static void mcp251x_restart_work_handler(struct work_struct *ws) + if (priv->after_suspend) { + mcp251x_hw_reset(spi); + mcp251x_setup(net, spi); ++ priv->force_quit = 0; + if (priv->after_suspend & AFTER_SUSPEND_RESTART) { + mcp251x_set_normal_mode(spi); + } else if (priv->after_suspend & AFTER_SUSPEND_UP) { +@@ -784,7 +785,6 @@ static void mcp251x_restart_work_handler(struct work_struct *ws) + mcp251x_hw_sleep(spi); + } + priv->after_suspend = 0; +- priv->force_quit = 0; + } + + if (priv->restart_tx) { +diff --git a/drivers/net/can/usb/peak_usb/pcan_usb.c b/drivers/net/can/usb/peak_usb/pcan_usb.c +index 61f33c2fb1cd..215cd74800df 100644 +--- a/drivers/net/can/usb/peak_usb/pcan_usb.c ++++ b/drivers/net/can/usb/peak_usb/pcan_usb.c +@@ -444,8 +444,8 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, + } + if ((n & PCAN_USB_ERROR_BUS_LIGHT) == 0) { + /* no error (back to active state) */ +- mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE; +- return 0; ++ new_state = CAN_STATE_ERROR_ACTIVE; ++ break; + } + break; + +@@ -468,9 +468,9 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, + } + + if ((n & PCAN_USB_ERROR_BUS_HEAVY) == 0) { +- /* no error (back to active state) */ +- mc->pdev->dev.can.state = CAN_STATE_ERROR_ACTIVE; +- return 0; ++ /* no error (back to warning state) */ ++ new_state = CAN_STATE_ERROR_WARNING; ++ break; + } + break; + +@@ -509,6 +509,11 @@ static int pcan_usb_decode_error(struct pcan_usb_msg_context *mc, u8 n, + mc->pdev->dev.can.can_stats.error_warning++; + break; + ++ case CAN_STATE_ERROR_ACTIVE: ++ cf->can_id |= CAN_ERR_CRTL; ++ cf->data[1] = CAN_ERR_CRTL_ACTIVE; ++ break; ++ + default: + /* CAN_STATE_MAX (trick to handle other errors) */ + cf->can_id |= CAN_ERR_CRTL; +diff --git a/drivers/net/dsa/bcm_sf2.c b/drivers/net/dsa/bcm_sf2.c +index 17cec68e56b4..02a4187d81bd 100644 +--- a/drivers/net/dsa/bcm_sf2.c ++++ b/drivers/net/dsa/bcm_sf2.c +@@ -309,11 +309,10 @@ static int bcm_sf2_sw_mdio_write(struct mii_bus *bus, int addr, int regnum, + * send them to our master MDIO bus controller + */ + if (addr == BRCM_PSEUDO_PHY_ADDR && priv->indir_phy_mask & BIT(addr)) +- bcm_sf2_sw_indir_rw(priv, 0, addr, regnum, val); ++ return bcm_sf2_sw_indir_rw(priv, 0, addr, regnum, val); + else +- mdiobus_write_nested(priv->master_mii_bus, addr, regnum, val); +- +- return 0; ++ return mdiobus_write_nested(priv->master_mii_bus, addr, ++ regnum, val); + } + + static irqreturn_t bcm_sf2_switch_0_isr(int irq, void *dev_id) +diff --git a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c +index 9dc6da039a6d..3164aad29bcf 100644 +--- a/drivers/net/ethernet/atheros/atl1e/atl1e_main.c ++++ b/drivers/net/ethernet/atheros/atl1e/atl1e_main.c +@@ -473,7 +473,9 @@ static void atl1e_mdio_write(struct net_device *netdev, int phy_id, + { + struct atl1e_adapter *adapter = netdev_priv(netdev); + +- atl1e_write_phy_reg(&adapter->hw, reg_num & MDIO_REG_ADDR_MASK, val); ++ if (atl1e_write_phy_reg(&adapter->hw, ++ reg_num & MDIO_REG_ADDR_MASK, val)) ++ netdev_err(netdev, "write phy register failed\n"); + } + + static int atl1e_mii_ioctl(struct net_device *netdev, +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +index c54a74de7b08..2f61175f5655 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c +@@ -7148,6 +7148,9 @@ static bool bnxt_drv_busy(struct bnxt *bp) + test_bit(BNXT_STATE_READ_STATS, &bp->state)); + } + ++static void bnxt_get_ring_stats(struct bnxt *bp, ++ struct rtnl_link_stats64 *stats); ++ + static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init, + bool link_re_init) + { +@@ -7173,6 +7176,9 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init, + del_timer_sync(&bp->timer); + bnxt_free_skbs(bp); + ++ /* Save ring stats before shutdown */ ++ if (bp->bnapi) ++ bnxt_get_ring_stats(bp, &bp->net_stats_prev); + if (irq_re_init) { + bnxt_free_irq(bp); + bnxt_del_napi(bp); +@@ -7234,23 +7240,12 @@ static int bnxt_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) + return -EOPNOTSUPP; + } + +-static void +-bnxt_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) ++static void bnxt_get_ring_stats(struct bnxt *bp, ++ struct rtnl_link_stats64 *stats) + { +- u32 i; +- struct bnxt *bp = netdev_priv(dev); ++ int i; + +- set_bit(BNXT_STATE_READ_STATS, &bp->state); +- /* Make sure bnxt_close_nic() sees that we are reading stats before +- * we check the BNXT_STATE_OPEN flag. +- */ +- smp_mb__after_atomic(); +- if (!test_bit(BNXT_STATE_OPEN, &bp->state)) { +- clear_bit(BNXT_STATE_READ_STATS, &bp->state); +- return; +- } + +- /* TODO check if we need to synchronize with bnxt_close path */ + for (i = 0; i < bp->cp_nr_rings; i++) { + struct bnxt_napi *bnapi = bp->bnapi[i]; + struct bnxt_cp_ring_info *cpr = &bnapi->cp_ring; +@@ -7279,6 +7274,40 @@ bnxt_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) + + stats->tx_dropped += le64_to_cpu(hw_stats->tx_drop_pkts); + } ++} ++ ++static void bnxt_add_prev_stats(struct bnxt *bp, ++ struct rtnl_link_stats64 *stats) ++{ ++ struct rtnl_link_stats64 *prev_stats = &bp->net_stats_prev; ++ ++ stats->rx_packets += prev_stats->rx_packets; ++ stats->tx_packets += prev_stats->tx_packets; ++ stats->rx_bytes += prev_stats->rx_bytes; ++ stats->tx_bytes += prev_stats->tx_bytes; ++ stats->rx_missed_errors += prev_stats->rx_missed_errors; ++ stats->multicast += prev_stats->multicast; ++ stats->tx_dropped += prev_stats->tx_dropped; ++} ++ ++static void ++bnxt_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) ++{ ++ struct bnxt *bp = netdev_priv(dev); ++ ++ set_bit(BNXT_STATE_READ_STATS, &bp->state); ++ /* Make sure bnxt_close_nic() sees that we are reading stats before ++ * we check the BNXT_STATE_OPEN flag. ++ */ ++ smp_mb__after_atomic(); ++ if (!test_bit(BNXT_STATE_OPEN, &bp->state)) { ++ clear_bit(BNXT_STATE_READ_STATS, &bp->state); ++ *stats = bp->net_stats_prev; ++ return; ++ } ++ ++ bnxt_get_ring_stats(bp, stats); ++ bnxt_add_prev_stats(bp, stats); + + if (bp->flags & BNXT_FLAG_PORT_STATS) { + struct rx_port_stats *rx = bp->hw_rx_port_stats; +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h +index cf2d4a6583d5..f9e253b705ec 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h +@@ -1302,6 +1302,7 @@ struct bnxt { + void *hwrm_cmd_resp_addr; + dma_addr_t hwrm_cmd_resp_dma_addr; + ++ struct rtnl_link_stats64 net_stats_prev; + struct rx_port_stats *hw_rx_port_stats; + struct tx_port_stats *hw_tx_port_stats; + struct rx_port_stats_ext *hw_rx_port_stats_ext; +diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +index da9b87689996..2240c23b0a4c 100644 +--- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c ++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c +@@ -1444,14 +1444,22 @@ static int bnxt_flash_nvram(struct net_device *dev, + rc = hwrm_send_message(bp, &req, sizeof(req), FLASH_NVRAM_TIMEOUT); + dma_free_coherent(&bp->pdev->dev, data_len, kmem, dma_handle); + ++ if (rc == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) { ++ netdev_info(dev, ++ "PF does not have admin privileges to flash the device\n"); ++ rc = -EACCES; ++ } else if (rc) { ++ rc = -EIO; ++ } + return rc; + } + + static int bnxt_firmware_reset(struct net_device *dev, + u16 dir_type) + { +- struct bnxt *bp = netdev_priv(dev); + struct hwrm_fw_reset_input req = {0}; ++ struct bnxt *bp = netdev_priv(dev); ++ int rc; + + bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_FW_RESET, -1, -1); + +@@ -1491,7 +1499,15 @@ static int bnxt_firmware_reset(struct net_device *dev, + return -EINVAL; + } + +- return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ rc = hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ if (rc == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) { ++ netdev_info(dev, ++ "PF does not have admin privileges to reset the device\n"); ++ rc = -EACCES; ++ } else if (rc) { ++ rc = -EIO; ++ } ++ return rc; + } + + static int bnxt_flash_firmware(struct net_device *dev, +@@ -1698,9 +1714,9 @@ static int bnxt_flash_package_from_file(struct net_device *dev, + struct hwrm_nvm_install_update_output *resp = bp->hwrm_cmd_resp_addr; + struct hwrm_nvm_install_update_input install = {0}; + const struct firmware *fw; ++ int rc, hwrm_err = 0; + u32 item_len; + u16 index; +- int rc; + + bnxt_hwrm_fw_set_time(bp); + +@@ -1743,15 +1759,16 @@ static int bnxt_flash_package_from_file(struct net_device *dev, + memcpy(kmem, fw->data, fw->size); + modify.host_src_addr = cpu_to_le64(dma_handle); + +- rc = hwrm_send_message(bp, &modify, sizeof(modify), +- FLASH_PACKAGE_TIMEOUT); ++ hwrm_err = hwrm_send_message(bp, &modify, ++ sizeof(modify), ++ FLASH_PACKAGE_TIMEOUT); + dma_free_coherent(&bp->pdev->dev, fw->size, kmem, + dma_handle); + } + } + release_firmware(fw); +- if (rc) +- return rc; ++ if (rc || hwrm_err) ++ goto err_exit; + + if ((install_type & 0xffff) == 0) + install_type >>= 16; +@@ -1759,12 +1776,10 @@ static int bnxt_flash_package_from_file(struct net_device *dev, + install.install_type = cpu_to_le32(install_type); + + mutex_lock(&bp->hwrm_cmd_lock); +- rc = _hwrm_send_message(bp, &install, sizeof(install), +- INSTALL_PACKAGE_TIMEOUT); +- if (rc) { +- rc = -EOPNOTSUPP; ++ hwrm_err = _hwrm_send_message(bp, &install, sizeof(install), ++ INSTALL_PACKAGE_TIMEOUT); ++ if (hwrm_err) + goto flash_pkg_exit; +- } + + if (resp->error_code) { + u8 error_code = ((struct hwrm_err_output *)resp)->cmd_err; +@@ -1772,12 +1787,11 @@ static int bnxt_flash_package_from_file(struct net_device *dev, + if (error_code == NVM_INSTALL_UPDATE_CMD_ERR_CODE_FRAG_ERR) { + install.flags |= cpu_to_le16( + NVM_INSTALL_UPDATE_REQ_FLAGS_ALLOWED_TO_DEFRAG); +- rc = _hwrm_send_message(bp, &install, sizeof(install), +- INSTALL_PACKAGE_TIMEOUT); +- if (rc) { +- rc = -EOPNOTSUPP; ++ hwrm_err = _hwrm_send_message(bp, &install, ++ sizeof(install), ++ INSTALL_PACKAGE_TIMEOUT); ++ if (hwrm_err) + goto flash_pkg_exit; +- } + } + } + +@@ -1788,6 +1802,14 @@ static int bnxt_flash_package_from_file(struct net_device *dev, + } + flash_pkg_exit: + mutex_unlock(&bp->hwrm_cmd_lock); ++err_exit: ++ if (hwrm_err == HWRM_ERR_CODE_RESOURCE_ACCESS_DENIED) { ++ netdev_info(dev, ++ "PF does not have admin privileges to flash the device\n"); ++ rc = -EACCES; ++ } else if (hwrm_err) { ++ rc = -EOPNOTSUPP; ++ } + return rc; + } + +@@ -2368,17 +2390,37 @@ static int bnxt_hwrm_mac_loopback(struct bnxt *bp, bool enable) + return hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); + } + ++static int bnxt_query_force_speeds(struct bnxt *bp, u16 *force_speeds) ++{ ++ struct hwrm_port_phy_qcaps_output *resp = bp->hwrm_cmd_resp_addr; ++ struct hwrm_port_phy_qcaps_input req = {0}; ++ int rc; ++ ++ bnxt_hwrm_cmd_hdr_init(bp, &req, HWRM_PORT_PHY_QCAPS, -1, -1); ++ mutex_lock(&bp->hwrm_cmd_lock); ++ rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT); ++ if (!rc) ++ *force_speeds = le16_to_cpu(resp->supported_speeds_force_mode); ++ ++ mutex_unlock(&bp->hwrm_cmd_lock); ++ return rc; ++} ++ + static int bnxt_disable_an_for_lpbk(struct bnxt *bp, + struct hwrm_port_phy_cfg_input *req) + { + struct bnxt_link_info *link_info = &bp->link_info; +- u16 fw_advertising = link_info->advertising; ++ u16 fw_advertising; + u16 fw_speed; + int rc; + + if (!link_info->autoneg) + return 0; + ++ rc = bnxt_query_force_speeds(bp, &fw_advertising); ++ if (rc) ++ return rc; ++ + fw_speed = PORT_PHY_CFG_REQ_FORCE_LINK_SPEED_1GB; + if (netif_carrier_ok(bp->dev)) + fw_speed = bp->link_info.link_speed; +diff --git a/drivers/net/ethernet/broadcom/genet/bcmgenet.c b/drivers/net/ethernet/broadcom/genet/bcmgenet.c +index 338d22380434..b7d75011cede 100644 +--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c ++++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c +@@ -1998,8 +1998,6 @@ static void reset_umac(struct bcmgenet_priv *priv) + + /* issue soft reset with (rg)mii loopback to ensure a stable rxclk */ + bcmgenet_umac_writel(priv, CMD_SW_RESET | CMD_LCL_LOOP_EN, UMAC_CMD); +- udelay(2); +- bcmgenet_umac_writel(priv, 0, UMAC_CMD); + } + + static void bcmgenet_intr_disable(struct bcmgenet_priv *priv) +@@ -2621,8 +2619,10 @@ static void bcmgenet_irq_task(struct work_struct *work) + spin_unlock_irq(&priv->lock); + + if (status & UMAC_IRQ_PHY_DET_R && +- priv->dev->phydev->autoneg != AUTONEG_ENABLE) ++ priv->dev->phydev->autoneg != AUTONEG_ENABLE) { + phy_init_hw(priv->dev->phydev); ++ genphy_config_aneg(priv->dev->phydev); ++ } + + /* Link UP/DOWN event */ + if (status & UMAC_IRQ_LINK_EVENT) +@@ -3675,6 +3675,7 @@ static int bcmgenet_resume(struct device *d) + phy_init_hw(dev->phydev); + + /* Speed settings must be restored */ ++ genphy_config_aneg(dev->phydev); + bcmgenet_mii_config(priv->dev, false); + + bcmgenet_set_hw_addr(priv, dev->dev_addr); +diff --git a/drivers/net/ethernet/broadcom/genet/bcmmii.c b/drivers/net/ethernet/broadcom/genet/bcmmii.c +index b0592fd4135b..a5049d637791 100644 +--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c ++++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c +@@ -184,8 +184,38 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) + const char *phy_name = NULL; + u32 id_mode_dis = 0; + u32 port_ctrl; ++ int bmcr = -1; ++ int ret; + u32 reg; + ++ /* MAC clocking workaround during reset of umac state machines */ ++ reg = bcmgenet_umac_readl(priv, UMAC_CMD); ++ if (reg & CMD_SW_RESET) { ++ /* An MII PHY must be isolated to prevent TXC contention */ ++ if (priv->phy_interface == PHY_INTERFACE_MODE_MII) { ++ ret = phy_read(phydev, MII_BMCR); ++ if (ret >= 0) { ++ bmcr = ret; ++ ret = phy_write(phydev, MII_BMCR, ++ bmcr | BMCR_ISOLATE); ++ } ++ if (ret) { ++ netdev_err(dev, "failed to isolate PHY\n"); ++ return ret; ++ } ++ } ++ /* Switch MAC clocking to RGMII generated clock */ ++ bcmgenet_sys_writel(priv, PORT_MODE_EXT_GPHY, SYS_PORT_CTRL); ++ /* Ensure 5 clks with Rx disabled ++ * followed by 5 clks with Reset asserted ++ */ ++ udelay(4); ++ reg &= ~(CMD_SW_RESET | CMD_LCL_LOOP_EN); ++ bcmgenet_umac_writel(priv, reg, UMAC_CMD); ++ /* Ensure 5 more clocks before Rx is enabled */ ++ udelay(2); ++ } ++ + priv->ext_phy = !priv->internal_phy && + (priv->phy_interface != PHY_INTERFACE_MODE_MOCA); + +@@ -217,6 +247,9 @@ int bcmgenet_mii_config(struct net_device *dev, bool init) + phydev->supported &= PHY_BASIC_FEATURES; + bcmgenet_sys_writel(priv, + PORT_MODE_EXT_EPHY, SYS_PORT_CTRL); ++ /* Restore the MII PHY after isolation */ ++ if (bmcr >= 0) ++ phy_write(phydev, MII_BMCR, bmcr); + break; + + case PHY_INTERFACE_MODE_REVMII: +diff --git a/drivers/net/ethernet/cadence/macb.h b/drivers/net/ethernet/cadence/macb.h +index 9bbaad9f3d63..efb44d5ab021 100644 +--- a/drivers/net/ethernet/cadence/macb.h ++++ b/drivers/net/ethernet/cadence/macb.h +@@ -499,7 +499,11 @@ + + /* Bitfields in TISUBN */ + #define GEM_SUBNSINCR_OFFSET 0 +-#define GEM_SUBNSINCR_SIZE 16 ++#define GEM_SUBNSINCRL_OFFSET 24 ++#define GEM_SUBNSINCRL_SIZE 8 ++#define GEM_SUBNSINCRH_OFFSET 0 ++#define GEM_SUBNSINCRH_SIZE 16 ++#define GEM_SUBNSINCR_SIZE 24 + + /* Bitfields in TI */ + #define GEM_NSINCR_OFFSET 0 +diff --git a/drivers/net/ethernet/cadence/macb_main.c b/drivers/net/ethernet/cadence/macb_main.c +index f175b20ac510..c2eb18854794 100644 +--- a/drivers/net/ethernet/cadence/macb_main.c ++++ b/drivers/net/ethernet/cadence/macb_main.c +@@ -860,7 +860,9 @@ static void macb_tx_interrupt(struct macb_queue *queue) + + /* First, update TX stats if needed */ + if (skb) { +- if (gem_ptp_do_txstamp(queue, skb, desc) == 0) { ++ if (unlikely(skb_shinfo(skb)->tx_flags & ++ SKBTX_HW_TSTAMP) && ++ gem_ptp_do_txstamp(queue, skb, desc) == 0) { + /* skb now belongs to timestamp buffer + * and will be removed later + */ +@@ -3328,7 +3330,7 @@ static int macb_clk_init(struct platform_device *pdev, struct clk **pclk, + if (!err) + err = -ENODEV; + +- dev_err(&pdev->dev, "failed to get macb_clk (%u)\n", err); ++ dev_err(&pdev->dev, "failed to get macb_clk (%d)\n", err); + return err; + } + +@@ -3337,7 +3339,7 @@ static int macb_clk_init(struct platform_device *pdev, struct clk **pclk, + if (!err) + err = -ENODEV; + +- dev_err(&pdev->dev, "failed to get hclk (%u)\n", err); ++ dev_err(&pdev->dev, "failed to get hclk (%d)\n", err); + return err; + } + +@@ -3351,25 +3353,25 @@ static int macb_clk_init(struct platform_device *pdev, struct clk **pclk, + + err = clk_prepare_enable(*pclk); + if (err) { +- dev_err(&pdev->dev, "failed to enable pclk (%u)\n", err); ++ dev_err(&pdev->dev, "failed to enable pclk (%d)\n", err); + return err; + } + + err = clk_prepare_enable(*hclk); + if (err) { +- dev_err(&pdev->dev, "failed to enable hclk (%u)\n", err); ++ dev_err(&pdev->dev, "failed to enable hclk (%d)\n", err); + goto err_disable_pclk; + } + + err = clk_prepare_enable(*tx_clk); + if (err) { +- dev_err(&pdev->dev, "failed to enable tx_clk (%u)\n", err); ++ dev_err(&pdev->dev, "failed to enable tx_clk (%d)\n", err); + goto err_disable_hclk; + } + + err = clk_prepare_enable(*rx_clk); + if (err) { +- dev_err(&pdev->dev, "failed to enable rx_clk (%u)\n", err); ++ dev_err(&pdev->dev, "failed to enable rx_clk (%d)\n", err); + goto err_disable_txclk; + } + +@@ -3839,7 +3841,7 @@ static int at91ether_clk_init(struct platform_device *pdev, struct clk **pclk, + + err = clk_prepare_enable(*pclk); + if (err) { +- dev_err(&pdev->dev, "failed to enable pclk (%u)\n", err); ++ dev_err(&pdev->dev, "failed to enable pclk (%d)\n", err); + return err; + } + +@@ -4192,6 +4194,7 @@ static int macb_remove(struct platform_device *pdev) + mdiobus_free(bp->mii_bus); + + unregister_netdev(dev); ++ tasklet_kill(&bp->hresp_err_tasklet); + clk_disable_unprepare(bp->tx_clk); + clk_disable_unprepare(bp->hclk); + clk_disable_unprepare(bp->pclk); +diff --git a/drivers/net/ethernet/cadence/macb_ptp.c b/drivers/net/ethernet/cadence/macb_ptp.c +index a6dc47edc4cf..8f912de44def 100644 +--- a/drivers/net/ethernet/cadence/macb_ptp.c ++++ b/drivers/net/ethernet/cadence/macb_ptp.c +@@ -115,7 +115,10 @@ static int gem_tsu_incr_set(struct macb *bp, struct tsu_incr *incr_spec) + * to take effect. + */ + spin_lock_irqsave(&bp->tsu_clk_lock, flags); +- gem_writel(bp, TISUBN, GEM_BF(SUBNSINCR, incr_spec->sub_ns)); ++ /* RegBit[15:0] = Subns[23:8]; RegBit[31:24] = Subns[7:0] */ ++ gem_writel(bp, TISUBN, GEM_BF(SUBNSINCRL, incr_spec->sub_ns) | ++ GEM_BF(SUBNSINCRH, (incr_spec->sub_ns >> ++ GEM_SUBNSINCRL_SIZE))); + gem_writel(bp, TI, GEM_BF(NSINCR, incr_spec->ns)); + spin_unlock_irqrestore(&bp->tsu_clk_lock, flags); + +diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c +index 4cf80de4c471..296ae1e4c322 100644 +--- a/drivers/net/ethernet/freescale/fec_main.c ++++ b/drivers/net/ethernet/freescale/fec_main.c +@@ -3597,6 +3597,11 @@ fec_drv_remove(struct platform_device *pdev) + struct net_device *ndev = platform_get_drvdata(pdev); + struct fec_enet_private *fep = netdev_priv(ndev); + struct device_node *np = pdev->dev.of_node; ++ int ret; ++ ++ ret = pm_runtime_get_sync(&pdev->dev); ++ if (ret < 0) ++ return ret; + + cancel_work_sync(&fep->tx_timeout_work); + fec_ptp_stop(pdev); +@@ -3604,13 +3609,17 @@ fec_drv_remove(struct platform_device *pdev) + fec_enet_mii_remove(fep); + if (fep->reg_phy) + regulator_disable(fep->reg_phy); +- pm_runtime_put(&pdev->dev); +- pm_runtime_disable(&pdev->dev); ++ + if (of_phy_is_fixed_link(np)) + of_phy_deregister_fixed_link(np); + of_node_put(fep->phy_node); + free_netdev(ndev); + ++ clk_disable_unprepare(fep->clk_ahb); ++ clk_disable_unprepare(fep->clk_ipg); ++ pm_runtime_put_noidle(&pdev->dev); ++ pm_runtime_disable(&pdev->dev); ++ + return 0; + } + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +index 3708f149d0a6..b2860087a7dc 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +@@ -2366,7 +2366,7 @@ static bool hns3_get_new_int_gl(struct hns3_enet_ring_group *ring_group) + u32 time_passed_ms; + u16 new_int_gl; + +- if (!ring_group->coal.int_gl || !tqp_vector->last_jiffies) ++ if (!tqp_vector->last_jiffies) + return false; + + if (ring_group->total_packets == 0) { +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c +index 690f62ed87dc..09a4d87429ce 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c +@@ -260,6 +260,8 @@ int hclge_cmd_send(struct hclge_hw *hw, struct hclge_desc *desc, int num) + + if (desc_ret == HCLGE_CMD_EXEC_SUCCESS) + retval = 0; ++ else if (desc_ret == HCLGE_CMD_NOT_SUPPORTED) ++ retval = -EOPNOTSUPP; + else + retval = -EIO; + hw->cmq.last_status = desc_ret; +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h +index 821d4c2f84bd..d7520686509f 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h +@@ -39,7 +39,7 @@ struct hclge_cmq_ring { + enum hclge_cmd_return_status { + HCLGE_CMD_EXEC_SUCCESS = 0, + HCLGE_CMD_NO_AUTH = 1, +- HCLGE_CMD_NOT_EXEC = 2, ++ HCLGE_CMD_NOT_SUPPORTED = 2, + HCLGE_CMD_QUEUE_FULL = 3, + }; + +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c +index 92f19384e258..a75d7c826fc2 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c +@@ -245,6 +245,9 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc) + hdev->flag & HCLGE_FLAG_MQPRIO_ENABLE) + return -EINVAL; + ++ if (pfc->pfc_en == hdev->tm_info.pfc_en) ++ return 0; ++ + prio_tc = hdev->tm_info.prio_tc; + pfc_map = 0; + +@@ -257,10 +260,8 @@ static int hclge_ieee_setpfc(struct hnae3_handle *h, struct ieee_pfc *pfc) + } + } + +- if (pfc_map == hdev->tm_info.hw_pfc_map) +- return 0; +- + hdev->tm_info.hw_pfc_map = pfc_map; ++ hdev->tm_info.pfc_en = pfc->pfc_en; + + return hclge_pause_setup_hw(hdev); + } +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +index 1528fb3fa6be..260b1e779690 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h +@@ -249,6 +249,7 @@ struct hclge_tm_info { + struct hclge_tc_info tc_info[HNAE3_MAX_TC]; + enum hclge_fc_mode fc_mode; + u8 hw_pfc_map; /* Allow for packet drop or not on this TC */ ++ u8 pfc_en; /* PFC enabled or not for user priority */ + }; + + struct hclge_comm_stats_str { +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c +index 0d45d045706c..3180ae452889 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c +@@ -1162,7 +1162,7 @@ static int hclge_pfc_setup_hw(struct hclge_dev *hdev) + HCLGE_RX_MAC_PAUSE_EN_MSK; + + return hclge_pfc_pause_en_cfg(hdev, enable_bitmap, +- hdev->tm_info.hw_pfc_map); ++ hdev->tm_info.pfc_en); + } + + /* Each Tc has a 1024 queue sets to backpress, it divides to +diff --git a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +index beae1e2cd59b..67db19709dea 100644 +--- a/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c ++++ b/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c +@@ -26,7 +26,12 @@ MODULE_DEVICE_TABLE(pci, ae_algovf_pci_tbl); + static inline struct hclgevf_dev *hclgevf_ae_get_hdev( + struct hnae3_handle *handle) + { +- return container_of(handle, struct hclgevf_dev, nic); ++ if (!handle->client) ++ return container_of(handle, struct hclgevf_dev, nic); ++ else if (handle->client->type == HNAE3_CLIENT_ROCE) ++ return container_of(handle, struct hclgevf_dev, roce); ++ else ++ return container_of(handle, struct hclgevf_dev, nic); + } + + static int hclgevf_tqps_update_stats(struct hnae3_handle *handle) +diff --git a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +index 1cc0e8fda4d5..a50977ce4076 100644 +--- a/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c ++++ b/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +@@ -5132,6 +5132,8 @@ static int mvpp2_probe(struct platform_device *pdev) + if (has_acpi_companion(&pdev->dev)) { + acpi_id = acpi_match_device(pdev->dev.driver->acpi_match_table, + &pdev->dev); ++ if (!acpi_id) ++ return -EINVAL; + priv->hw_version = (unsigned long)acpi_id->driver_data; + } else { + priv->hw_version = +diff --git a/drivers/net/ethernet/mellanox/mlx5/core/main.c b/drivers/net/ethernet/mellanox/mlx5/core/main.c +index 231ed508c240..5fac00ea6245 100644 +--- a/drivers/net/ethernet/mellanox/mlx5/core/main.c ++++ b/drivers/net/ethernet/mellanox/mlx5/core/main.c +@@ -859,11 +859,9 @@ static int mlx5_pci_init(struct mlx5_core_dev *dev, struct mlx5_priv *priv) + + priv->numa_node = dev_to_node(&dev->pdev->dev); + +- priv->dbg_root = debugfs_create_dir(dev_name(&pdev->dev), mlx5_debugfs_root); +- if (!priv->dbg_root) { +- dev_err(&pdev->dev, "Cannot create debugfs dir, aborting\n"); +- return -ENOMEM; +- } ++ if (mlx5_debugfs_root) ++ priv->dbg_root = ++ debugfs_create_dir(pci_name(pdev), mlx5_debugfs_root); + + err = mlx5_pci_enable_device(dev); + if (err) { +diff --git a/drivers/net/ethernet/mscc/ocelot.h b/drivers/net/ethernet/mscc/ocelot.h +index 616bec30dfa3..3d8c6f38e76b 100644 +--- a/drivers/net/ethernet/mscc/ocelot.h ++++ b/drivers/net/ethernet/mscc/ocelot.h +@@ -541,7 +541,7 @@ void __ocelot_write_ix(struct ocelot *ocelot, u32 val, u32 reg, u32 offset); + #define ocelot_write_rix(ocelot, val, reg, ri) __ocelot_write_ix(ocelot, val, reg, reg##_RSZ * (ri)) + #define ocelot_write(ocelot, val, reg) __ocelot_write_ix(ocelot, val, reg, 0) + +-void __ocelot_rmw_ix(struct ocelot *ocelot, u32 val, u32 reg, u32 mask, ++void __ocelot_rmw_ix(struct ocelot *ocelot, u32 val, u32 mask, u32 reg, + u32 offset); + #define ocelot_rmw_ix(ocelot, val, m, reg, gi, ri) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi) + reg##_RSZ * (ri)) + #define ocelot_rmw_gix(ocelot, val, m, reg, gi) __ocelot_rmw_ix(ocelot, val, m, reg, reg##_GSZ * (gi)) +diff --git a/drivers/net/ethernet/sfc/ef10.c b/drivers/net/ethernet/sfc/ef10.c +index 7eeac3d6cfe8..1f971d31ec30 100644 +--- a/drivers/net/ethernet/sfc/ef10.c ++++ b/drivers/net/ethernet/sfc/ef10.c +@@ -6042,22 +6042,25 @@ static const struct efx_ef10_nvram_type_info efx_ef10_nvram_types[] = { + { NVRAM_PARTITION_TYPE_LICENSE, 0, 0, "sfc_license" }, + { NVRAM_PARTITION_TYPE_PHY_MIN, 0xff, 0, "sfc_phy_fw" }, + }; ++#define EF10_NVRAM_PARTITION_COUNT ARRAY_SIZE(efx_ef10_nvram_types) + + static int efx_ef10_mtd_probe_partition(struct efx_nic *efx, + struct efx_mcdi_mtd_partition *part, +- unsigned int type) ++ unsigned int type, ++ unsigned long *found) + { + MCDI_DECLARE_BUF(inbuf, MC_CMD_NVRAM_METADATA_IN_LEN); + MCDI_DECLARE_BUF(outbuf, MC_CMD_NVRAM_METADATA_OUT_LENMAX); + const struct efx_ef10_nvram_type_info *info; + size_t size, erase_size, outlen; ++ int type_idx = 0; + bool protected; + int rc; + +- for (info = efx_ef10_nvram_types; ; info++) { +- if (info == +- efx_ef10_nvram_types + ARRAY_SIZE(efx_ef10_nvram_types)) ++ for (type_idx = 0; ; type_idx++) { ++ if (type_idx == EF10_NVRAM_PARTITION_COUNT) + return -ENODEV; ++ info = efx_ef10_nvram_types + type_idx; + if ((type & ~info->type_mask) == info->type) + break; + } +@@ -6070,6 +6073,13 @@ static int efx_ef10_mtd_probe_partition(struct efx_nic *efx, + if (protected) + return -ENODEV; /* hide it */ + ++ /* If we've already exposed a partition of this type, hide this ++ * duplicate. All operations on MTDs are keyed by the type anyway, ++ * so we can't act on the duplicate. ++ */ ++ if (__test_and_set_bit(type_idx, found)) ++ return -EEXIST; ++ + part->nvram_type = type; + + MCDI_SET_DWORD(inbuf, NVRAM_METADATA_IN_TYPE, type); +@@ -6098,6 +6108,7 @@ static int efx_ef10_mtd_probe_partition(struct efx_nic *efx, + static int efx_ef10_mtd_probe(struct efx_nic *efx) + { + MCDI_DECLARE_BUF(outbuf, MC_CMD_NVRAM_PARTITIONS_OUT_LENMAX); ++ DECLARE_BITMAP(found, EF10_NVRAM_PARTITION_COUNT) = { 0 }; + struct efx_mcdi_mtd_partition *parts; + size_t outlen, n_parts_total, i, n_parts; + unsigned int type; +@@ -6126,11 +6137,13 @@ static int efx_ef10_mtd_probe(struct efx_nic *efx) + for (i = 0; i < n_parts_total; i++) { + type = MCDI_ARRAY_DWORD(outbuf, NVRAM_PARTITIONS_OUT_TYPE_ID, + i); +- rc = efx_ef10_mtd_probe_partition(efx, &parts[n_parts], type); +- if (rc == 0) +- n_parts++; +- else if (rc != -ENODEV) ++ rc = efx_ef10_mtd_probe_partition(efx, &parts[n_parts], type, ++ found); ++ if (rc == -EEXIST || rc == -ENODEV) ++ continue; ++ if (rc) + goto fail; ++ n_parts++; + } + + rc = efx_mtd_add(efx, &parts[0].common, n_parts, sizeof(*parts)); +diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c +index d07520fb969e..62ccbd47c1db 100644 +--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c ++++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c +@@ -59,7 +59,9 @@ static int sun7i_gmac_init(struct platform_device *pdev, void *priv) + gmac->clk_enabled = 1; + } else { + clk_set_rate(gmac->tx_clk, SUN7I_GMAC_MII_RATE); +- clk_prepare(gmac->tx_clk); ++ ret = clk_prepare(gmac->tx_clk); ++ if (ret) ++ return ret; + } + + return 0; +diff --git a/drivers/net/ethernet/ti/cpts.c b/drivers/net/ethernet/ti/cpts.c +index b96b93c686bf..4f644ac314fe 100644 +--- a/drivers/net/ethernet/ti/cpts.c ++++ b/drivers/net/ethernet/ti/cpts.c +@@ -572,7 +572,9 @@ struct cpts *cpts_create(struct device *dev, void __iomem *regs, + return ERR_CAST(cpts->refclk); + } + +- clk_prepare(cpts->refclk); ++ ret = clk_prepare(cpts->refclk); ++ if (ret) ++ return ERR_PTR(ret); + + cpts->cc.read = cpts_systim_read; + cpts->cc.mask = CLOCKSOURCE_MASK(32); +diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c +index 6372cdc4a510..78789dfbe29e 100644 +--- a/drivers/net/macvlan.c ++++ b/drivers/net/macvlan.c +@@ -363,10 +363,11 @@ static void macvlan_broadcast_enqueue(struct macvlan_port *port, + } + spin_unlock(&port->bc_queue.lock); + ++ schedule_work(&port->bc_work); ++ + if (err) + goto free_nskb; + +- schedule_work(&port->bc_work); + return; + + free_nskb: +diff --git a/drivers/net/slip/slip.c b/drivers/net/slip/slip.c +index a5874059da9d..77207f936871 100644 +--- a/drivers/net/slip/slip.c ++++ b/drivers/net/slip/slip.c +@@ -855,6 +855,7 @@ err_free_chan: + sl->tty = NULL; + tty->disc_data = NULL; + clear_bit(SLF_INUSE, &sl->flags); ++ sl_free_netdev(sl->dev); + free_netdev(sl->dev); + + err_exit: +diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c +index 2a536f84d5f6..d8a56df3933f 100644 +--- a/drivers/net/vxlan.c ++++ b/drivers/net/vxlan.c +@@ -3213,6 +3213,7 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev, + struct vxlan_net *vn = net_generic(net, vxlan_net_id); + struct vxlan_dev *vxlan = netdev_priv(dev); + struct vxlan_fdb *f = NULL; ++ bool unregister = false; + int err; + + err = vxlan_dev_configure(net, dev, conf, false, extack); +@@ -3238,12 +3239,11 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev, + err = register_netdevice(dev); + if (err) + goto errout; ++ unregister = true; + + err = rtnl_configure_link(dev, NULL); +- if (err) { +- unregister_netdevice(dev); ++ if (err) + goto errout; +- } + + /* notify default fdb entry */ + if (f) +@@ -3251,9 +3251,16 @@ static int __vxlan_dev_create(struct net *net, struct net_device *dev, + + list_add(&vxlan->next, &vn->vxlan_list); + return 0; ++ + errout: ++ /* unregister_netdevice() destroys the default FDB entry with deletion ++ * notification. But the addition notification was not sent yet, so ++ * destroy the entry by hand here. ++ */ + if (f) + vxlan_fdb_destroy(vxlan, f, false); ++ if (unregister) ++ unregister_netdevice(dev); + return err; + } + +diff --git a/drivers/net/wan/fsl_ucc_hdlc.c b/drivers/net/wan/fsl_ucc_hdlc.c +index 5f0366a125e2..0212f576a838 100644 +--- a/drivers/net/wan/fsl_ucc_hdlc.c ++++ b/drivers/net/wan/fsl_ucc_hdlc.c +@@ -1113,7 +1113,6 @@ static int ucc_hdlc_probe(struct platform_device *pdev) + if (register_hdlc_device(dev)) { + ret = -ENOBUFS; + pr_err("ucc_hdlc: unable to register hdlc device\n"); +- free_netdev(dev); + goto free_dev; + } + +diff --git a/drivers/net/wireless/ath/ath6kl/cfg80211.c b/drivers/net/wireless/ath/ath6kl/cfg80211.c +index e121187f371f..d7c626d9594e 100644 +--- a/drivers/net/wireless/ath/ath6kl/cfg80211.c ++++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c +@@ -939,7 +939,7 @@ static int ath6kl_set_probed_ssids(struct ath6kl *ar, + else + ssid_list[i].flag = ANY_SSID_FLAG; + +- if (n_match_ssid == 0) ++ if (ar->wiphy->max_match_sets != 0 && n_match_ssid == 0) + ssid_list[i].flag |= MATCH_SSID_FLAG; + } + +@@ -1093,7 +1093,7 @@ void ath6kl_cfg80211_scan_complete_event(struct ath6kl_vif *vif, bool aborted) + if (vif->scan_req->n_ssids && vif->scan_req->ssids[0].ssid_len) { + for (i = 0; i < vif->scan_req->n_ssids; i++) { + ath6kl_wmi_probedssid_cmd(ar->wmi, vif->fw_vif_idx, +- i + 1, DISABLE_SSID_FLAG, ++ i, DISABLE_SSID_FLAG, + 0, NULL); + } + } +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +index c7c520f327f2..bbdc6000afb9 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +@@ -6314,6 +6314,16 @@ brcmf_txrx_stypes[NUM_NL80211_IFTYPES] = { + .tx = 0xffff, + .rx = BIT(IEEE80211_STYPE_ACTION >> 4) | + BIT(IEEE80211_STYPE_PROBE_REQ >> 4) ++ }, ++ [NL80211_IFTYPE_AP] = { ++ .tx = 0xffff, ++ .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) | ++ BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) | ++ BIT(IEEE80211_STYPE_PROBE_REQ >> 4) | ++ BIT(IEEE80211_STYPE_DISASSOC >> 4) | ++ BIT(IEEE80211_STYPE_AUTH >> 4) | ++ BIT(IEEE80211_STYPE_DEAUTH >> 4) | ++ BIT(IEEE80211_STYPE_ACTION >> 4) + } + }; + +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +index 53e4962ceb8a..abaed2fa2def 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +@@ -49,6 +49,10 @@ + #define DCMD_RESP_TIMEOUT msecs_to_jiffies(2500) + #define CTL_DONE_TIMEOUT msecs_to_jiffies(2500) + ++/* watermark expressed in number of words */ ++#define DEFAULT_F2_WATERMARK 0x8 ++#define CY_4373_F2_WATERMARK 0x40 ++ + #ifdef DEBUG + + #define BRCMF_TRAP_INFO_SIZE 80 +@@ -138,6 +142,8 @@ struct rte_console { + /* 1: isolate internal sdio signals, put external pads in tri-state; requires + * sdio bus power cycle to clear (rev 9) */ + #define SBSDIO_DEVCTL_PADS_ISO 0x08 ++/* 1: enable F2 Watermark */ ++#define SBSDIO_DEVCTL_F2WM_ENAB 0x10 + /* Force SD->SB reset mapping (rev 11) */ + #define SBSDIO_DEVCTL_SB_RST_CTL 0x30 + /* Determined by CoreControl bit */ +@@ -4060,6 +4066,7 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err, + void *nvram; + u32 nvram_len; + u8 saveclk; ++ u8 devctl; + + brcmf_dbg(TRACE, "Enter: dev=%s, err=%d\n", dev_name(dev), err); + +@@ -4115,8 +4122,26 @@ static void brcmf_sdio_firmware_callback(struct device *dev, int err, + brcmf_sdiod_writel(sdiod, core->base + SD_REG(hostintmask), + bus->hostintmask, NULL); + +- +- brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK, 8, &err); ++ switch (sdiod->func1->device) { ++ case SDIO_DEVICE_ID_CYPRESS_4373: ++ brcmf_dbg(INFO, "set F2 watermark to 0x%x*4 bytes\n", ++ CY_4373_F2_WATERMARK); ++ brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK, ++ CY_4373_F2_WATERMARK, &err); ++ devctl = brcmf_sdiod_readb(sdiod, SBSDIO_DEVICE_CTL, ++ &err); ++ devctl |= SBSDIO_DEVCTL_F2WM_ENAB; ++ brcmf_sdiod_writeb(sdiod, SBSDIO_DEVICE_CTL, devctl, ++ &err); ++ brcmf_sdiod_writeb(sdiod, SBSDIO_FUNC1_MESBUSYCTRL, ++ CY_4373_F2_WATERMARK | ++ SBSDIO_MESBUSYCTRL_ENAB, &err); ++ break; ++ default: ++ brcmf_sdiod_writeb(sdiod, SBSDIO_WATERMARK, ++ DEFAULT_F2_WATERMARK, &err); ++ break; ++ } + } else { + /* Disable F2 again */ + sdio_disable_func(sdiod->func2); +diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h +index 7faed831f07d..34b031154da9 100644 +--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h ++++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h +@@ -77,7 +77,7 @@ + #define SBSDIO_GPIO_OUT 0x10006 + /* gpio enable */ + #define SBSDIO_GPIO_EN 0x10007 +-/* rev < 7, watermark for sdio device */ ++/* rev < 7, watermark for sdio device TX path */ + #define SBSDIO_WATERMARK 0x10008 + /* control busy signal generation */ + #define SBSDIO_DEVICE_CTL 0x10009 +@@ -104,6 +104,13 @@ + #define SBSDIO_FUNC1_RFRAMEBCHI 0x1001C + /* MesBusyCtl (rev 11) */ + #define SBSDIO_FUNC1_MESBUSYCTRL 0x1001D ++/* Watermark for sdio device RX path */ ++#define SBSDIO_MESBUSY_RXFIFO_WM_MASK 0x7F ++#define SBSDIO_MESBUSY_RXFIFO_WM_SHIFT 0 ++/* Enable busy capability for MES access */ ++#define SBSDIO_MESBUSYCTRL_ENAB 0x80 ++#define SBSDIO_MESBUSYCTRL_ENAB_SHIFT 7 ++ + /* Sdio Core Rev 12 */ + #define SBSDIO_FUNC1_WAKEUPCTRL 0x1001E + #define SBSDIO_FUNC1_WCTRL_ALPWAIT_MASK 0x1 +diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/main.c b/drivers/net/wireless/intel/iwlwifi/dvm/main.c +index 030482b357a3..06dd4e81b737 100644 +--- a/drivers/net/wireless/intel/iwlwifi/dvm/main.c ++++ b/drivers/net/wireless/intel/iwlwifi/dvm/main.c +@@ -1227,6 +1227,23 @@ static int iwl_eeprom_init_hw_params(struct iwl_priv *priv) + return 0; + } + ++static int iwl_nvm_check_version(struct iwl_nvm_data *data, ++ struct iwl_trans *trans) ++{ ++ if (data->nvm_version >= trans->cfg->nvm_ver || ++ data->calib_version >= trans->cfg->nvm_calib_ver) { ++ IWL_DEBUG_INFO(trans, "device EEPROM VER=0x%x, CALIB=0x%x\n", ++ data->nvm_version, data->calib_version); ++ return 0; ++ } ++ ++ IWL_ERR(trans, ++ "Unsupported (too old) EEPROM VER=0x%x < 0x%x CALIB=0x%x < 0x%x\n", ++ data->nvm_version, trans->cfg->nvm_ver, ++ data->calib_version, trans->cfg->nvm_calib_ver); ++ return -EINVAL; ++} ++ + static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans, + const struct iwl_cfg *cfg, + const struct iwl_fw *fw, +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c +index a4c96215933b..a59bab8345f4 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c +@@ -928,22 +928,3 @@ iwl_parse_eeprom_data(struct device *dev, const struct iwl_cfg *cfg, + return NULL; + } + IWL_EXPORT_SYMBOL(iwl_parse_eeprom_data); +- +-/* helper functions */ +-int iwl_nvm_check_version(struct iwl_nvm_data *data, +- struct iwl_trans *trans) +-{ +- if (data->nvm_version >= trans->cfg->nvm_ver || +- data->calib_version >= trans->cfg->nvm_calib_ver) { +- IWL_DEBUG_INFO(trans, "device EEPROM VER=0x%x, CALIB=0x%x\n", +- data->nvm_version, data->calib_version); +- return 0; +- } +- +- IWL_ERR(trans, +- "Unsupported (too old) EEPROM VER=0x%x < 0x%x CALIB=0x%x < 0x%x\n", +- data->nvm_version, trans->cfg->nvm_ver, +- data->calib_version, trans->cfg->nvm_calib_ver); +- return -EINVAL; +-} +-IWL_EXPORT_SYMBOL(iwl_nvm_check_version); +diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h +index 8be50ed12300..c59dd47cf15d 100644 +--- a/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h ++++ b/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h +@@ -7,6 +7,7 @@ + * + * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved. + * Copyright(c) 2015 Intel Mobile Communications GmbH ++ * Copyright (C) 2018 Intel Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as +@@ -33,6 +34,7 @@ + * + * Copyright(c) 2005 - 2014 Intel Corporation. All rights reserved. + * Copyright(c) 2015 Intel Mobile Communications GmbH ++ * Copyright (C) 2018 Intel Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without +@@ -122,9 +124,6 @@ struct iwl_nvm_data * + iwl_parse_eeprom_data(struct device *dev, const struct iwl_cfg *cfg, + const u8 *eeprom, size_t eeprom_size); + +-int iwl_nvm_check_version(struct iwl_nvm_data *data, +- struct iwl_trans *trans); +- + int iwl_init_sband_channels(struct iwl_nvm_data *data, + struct ieee80211_supported_band *sband, + int n_channels, enum nl80211_band band); +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +index 2eba6d6f367f..9808d954dca2 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/fw.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/fw.c +@@ -547,7 +547,9 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm) + if (mvm->nvm_file_name) + iwl_mvm_load_nvm_to_nic(mvm); + +- WARN_ON(iwl_nvm_check_version(mvm->nvm_data, mvm->trans)); ++ WARN_ONCE(mvm->nvm_data->nvm_version < mvm->trans->cfg->nvm_ver, ++ "Too old NVM version (0x%0x, required = 0x%0x)", ++ mvm->nvm_data->nvm_version, mvm->trans->cfg->nvm_ver); + + /* + * abort after reading the nvm in case RF Kill is on, we will complete +diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c +index 6a5349401aa9..00712205c05f 100644 +--- a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c ++++ b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c +@@ -1804,6 +1804,7 @@ void iwl_mvm_pause_tcm(struct iwl_mvm *mvm, bool with_cancel) + void iwl_mvm_resume_tcm(struct iwl_mvm *mvm) + { + int mac; ++ bool low_latency = false; + + spin_lock_bh(&mvm->tcm.lock); + mvm->tcm.ts = jiffies; +@@ -1815,10 +1816,23 @@ void iwl_mvm_resume_tcm(struct iwl_mvm *mvm) + memset(&mdata->tx.pkts, 0, sizeof(mdata->tx.pkts)); + memset(&mdata->rx.airtime, 0, sizeof(mdata->rx.airtime)); + memset(&mdata->tx.airtime, 0, sizeof(mdata->tx.airtime)); ++ ++ if (mvm->tcm.result.low_latency[mac]) ++ low_latency = true; + } + /* The TCM data needs to be reset before "paused" flag changes */ + smp_mb(); + mvm->tcm.paused = false; ++ ++ /* ++ * if the current load is not low or low latency is active, force ++ * re-evaluation to cover the case of no traffic. ++ */ ++ if (mvm->tcm.result.global_load > IWL_MVM_TRAFFIC_LOW) ++ schedule_delayed_work(&mvm->tcm.work, MVM_TCM_PERIOD); ++ else if (low_latency) ++ schedule_delayed_work(&mvm->tcm.work, MVM_LL_PERIOD); ++ + spin_unlock_bh(&mvm->tcm.lock); + } + +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c +index 61ffa1d1a00d..316e2ba0c34d 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c +@@ -560,18 +560,6 @@ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, + + spin_lock(&txq->lock); + +- if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560) { +- struct iwl_tx_cmd_gen3 *tx_cmd_gen3 = +- (void *)dev_cmd->payload; +- +- cmd_len = le16_to_cpu(tx_cmd_gen3->len); +- } else { +- struct iwl_tx_cmd_gen2 *tx_cmd_gen2 = +- (void *)dev_cmd->payload; +- +- cmd_len = le16_to_cpu(tx_cmd_gen2->len); +- } +- + if (iwl_queue_space(trans, txq) < txq->high_mark) { + iwl_stop_queue(trans, txq); + +@@ -609,6 +597,18 @@ int iwl_trans_pcie_gen2_tx(struct iwl_trans *trans, struct sk_buff *skb, + return -1; + } + ++ if (trans->cfg->device_family >= IWL_DEVICE_FAMILY_22560) { ++ struct iwl_tx_cmd_gen3 *tx_cmd_gen3 = ++ (void *)dev_cmd->payload; ++ ++ cmd_len = le16_to_cpu(tx_cmd_gen3->len); ++ } else { ++ struct iwl_tx_cmd_gen2 *tx_cmd_gen2 = ++ (void *)dev_cmd->payload; ++ ++ cmd_len = le16_to_cpu(tx_cmd_gen2->len); ++ } ++ + /* Set up entry for this TFD in Tx byte-count array */ + iwl_pcie_gen2_update_byte_tbl(trans_pcie, txq, cmd_len, + iwl_pcie_gen2_get_num_tbs(trans, tfd)); +diff --git a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +index 2fec394a988c..b73582ec03a0 100644 +--- a/drivers/net/wireless/intel/iwlwifi/pcie/tx.c ++++ b/drivers/net/wireless/intel/iwlwifi/pcie/tx.c +@@ -1247,11 +1247,11 @@ static void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx) + + if (idx >= trans->cfg->base_params->max_tfd_queue_size || + (!iwl_queue_used(txq, idx))) { +- IWL_ERR(trans, +- "%s: Read index for DMA queue txq id (%d), index %d is out of range [0-%d] %d %d.\n", +- __func__, txq_id, idx, +- trans->cfg->base_params->max_tfd_queue_size, +- txq->write_ptr, txq->read_ptr); ++ WARN_ONCE(test_bit(txq_id, trans_pcie->queue_used), ++ "%s: Read index for DMA queue txq id (%d), index %d is out of range [0-%d] %d %d.\n", ++ __func__, txq_id, idx, ++ trans->cfg->base_params->max_tfd_queue_size, ++ txq->write_ptr, txq->read_ptr); + return; + } + +diff --git a/drivers/net/wireless/marvell/mwifiex/debugfs.c b/drivers/net/wireless/marvell/mwifiex/debugfs.c +index cce70252fd96..cbe4493b3266 100644 +--- a/drivers/net/wireless/marvell/mwifiex/debugfs.c ++++ b/drivers/net/wireless/marvell/mwifiex/debugfs.c +@@ -273,15 +273,13 @@ mwifiex_histogram_read(struct file *file, char __user *ubuf, + "total samples = %d\n", + atomic_read(&phist_data->num_samples)); + +- p += sprintf(p, "rx rates (in Mbps): 0=1M 1=2M"); +- p += sprintf(p, "2=5.5M 3=11M 4=6M 5=9M 6=12M\n"); +- p += sprintf(p, "7=18M 8=24M 9=36M 10=48M 11=54M"); +- p += sprintf(p, "12-27=MCS0-15(BW20) 28-43=MCS0-15(BW40)\n"); ++ p += sprintf(p, ++ "rx rates (in Mbps): 0=1M 1=2M 2=5.5M 3=11M 4=6M 5=9M 6=12M\n" ++ "7=18M 8=24M 9=36M 10=48M 11=54M 12-27=MCS0-15(BW20) 28-43=MCS0-15(BW40)\n"); + + if (ISSUPP_11ACENABLED(priv->adapter->fw_cap_info)) { +- p += sprintf(p, "44-53=MCS0-9(VHT:BW20)"); +- p += sprintf(p, "54-63=MCS0-9(VHT:BW40)"); +- p += sprintf(p, "64-73=MCS0-9(VHT:BW80)\n\n"); ++ p += sprintf(p, ++ "44-53=MCS0-9(VHT:BW20) 54-63=MCS0-9(VHT:BW40) 64-73=MCS0-9(VHT:BW80)\n\n"); + } else { + p += sprintf(p, "\n"); + } +@@ -310,7 +308,7 @@ mwifiex_histogram_read(struct file *file, char __user *ubuf, + for (i = 0; i < MWIFIEX_MAX_NOISE_FLR; i++) { + value = atomic_read(&phist_data->noise_flr[i]); + if (value) +- p += sprintf(p, "noise_flr[-%02ddBm] = %d\n", ++ p += sprintf(p, "noise_flr[%02ddBm] = %d\n", + (int)(i-128), value); + } + for (i = 0; i < MWIFIEX_MAX_SIG_STRENGTH; i++) { +diff --git a/drivers/net/wireless/marvell/mwifiex/scan.c b/drivers/net/wireless/marvell/mwifiex/scan.c +index ed27147efcb3..dd02bbd9544e 100644 +--- a/drivers/net/wireless/marvell/mwifiex/scan.c ++++ b/drivers/net/wireless/marvell/mwifiex/scan.c +@@ -1906,15 +1906,17 @@ mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info, + ETH_ALEN)) + mwifiex_update_curr_bss_params(priv, + bss); +- cfg80211_put_bss(priv->wdev.wiphy, bss); +- } + +- if ((chan->flags & IEEE80211_CHAN_RADAR) || +- (chan->flags & IEEE80211_CHAN_NO_IR)) { +- mwifiex_dbg(adapter, INFO, +- "radar or passive channel %d\n", +- channel); +- mwifiex_save_hidden_ssid_channels(priv, bss); ++ if ((chan->flags & IEEE80211_CHAN_RADAR) || ++ (chan->flags & IEEE80211_CHAN_NO_IR)) { ++ mwifiex_dbg(adapter, INFO, ++ "radar or passive channel %d\n", ++ channel); ++ mwifiex_save_hidden_ssid_channels(priv, ++ bss); ++ } ++ ++ cfg80211_put_bss(priv->wdev.wiphy, bss); + } + } + } else { +diff --git a/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c b/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c +index 9a1d15b3ce45..518caaaf8a98 100644 +--- a/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c ++++ b/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c +@@ -444,12 +444,13 @@ static int rtl8187_init_urbs(struct ieee80211_hw *dev) + skb_queue_tail(&priv->rx_queue, skb); + usb_anchor_urb(entry, &priv->anchored); + ret = usb_submit_urb(entry, GFP_KERNEL); +- usb_put_urb(entry); + if (ret) { + skb_unlink(skb, &priv->rx_queue); + usb_unanchor_urb(entry); ++ usb_put_urb(entry); + goto err; + } ++ usb_put_urb(entry); + } + return ret; + +diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c +index 44da9fe5b27b..c4ff4f079448 100644 +--- a/drivers/nvme/host/core.c ++++ b/drivers/nvme/host/core.c +@@ -551,9 +551,19 @@ static blk_status_t nvme_setup_discard(struct nvme_ns *ns, struct request *req, + struct nvme_dsm_range *range; + struct bio *bio; + +- range = kmalloc_array(segments, sizeof(*range), GFP_ATOMIC); +- if (!range) +- return BLK_STS_RESOURCE; ++ range = kmalloc_array(segments, sizeof(*range), ++ GFP_ATOMIC | __GFP_NOWARN); ++ if (!range) { ++ /* ++ * If we fail allocation our range, fallback to the controller ++ * discard page. If that's also busy, it's safe to return ++ * busy, as we know we can make progress once that's freed. ++ */ ++ if (test_and_set_bit_lock(0, &ns->ctrl->discard_page_busy)) ++ return BLK_STS_RESOURCE; ++ ++ range = page_address(ns->ctrl->discard_page); ++ } + + __rq_for_each_bio(bio, req) { + u64 slba = nvme_block_nr(ns, bio->bi_iter.bi_sector); +@@ -568,7 +578,10 @@ static blk_status_t nvme_setup_discard(struct nvme_ns *ns, struct request *req, + } + + if (WARN_ON_ONCE(n != segments)) { +- kfree(range); ++ if (virt_to_page(range) == ns->ctrl->discard_page) ++ clear_bit_unlock(0, &ns->ctrl->discard_page_busy); ++ else ++ kfree(range); + return BLK_STS_IOERR; + } + +@@ -653,8 +666,13 @@ void nvme_cleanup_cmd(struct request *req) + blk_rq_bytes(req) >> ns->lba_shift); + } + if (req->rq_flags & RQF_SPECIAL_PAYLOAD) { +- kfree(page_address(req->special_vec.bv_page) + +- req->special_vec.bv_offset); ++ struct nvme_ns *ns = req->rq_disk->private_data; ++ struct page *page = req->special_vec.bv_page; ++ ++ if (page == ns->ctrl->discard_page) ++ clear_bit_unlock(0, &ns->ctrl->discard_page_busy); ++ else ++ kfree(page_address(page) + req->special_vec.bv_offset); + } + } + EXPORT_SYMBOL_GPL(nvme_cleanup_cmd); +@@ -3551,6 +3569,7 @@ static void nvme_free_ctrl(struct device *dev) + ida_simple_remove(&nvme_instance_ida, ctrl->instance); + kfree(ctrl->effects); + nvme_mpath_uninit(ctrl); ++ __free_page(ctrl->discard_page); + + if (subsys) { + mutex_lock(&subsys->lock); +@@ -3592,6 +3611,14 @@ int nvme_init_ctrl(struct nvme_ctrl *ctrl, struct device *dev, + memset(&ctrl->ka_cmd, 0, sizeof(ctrl->ka_cmd)); + ctrl->ka_cmd.common.opcode = nvme_admin_keep_alive; + ++ BUILD_BUG_ON(NVME_DSM_MAX_RANGES * sizeof(struct nvme_dsm_range) > ++ PAGE_SIZE); ++ ctrl->discard_page = alloc_page(GFP_KERNEL); ++ if (!ctrl->discard_page) { ++ ret = -ENOMEM; ++ goto out; ++ } ++ + ret = ida_simple_get(&nvme_instance_ida, 0, 0, GFP_KERNEL); + if (ret < 0) + goto out; +@@ -3629,6 +3656,8 @@ out_free_name: + out_release_instance: + ida_simple_remove(&nvme_instance_ida, ctrl->instance); + out: ++ if (ctrl->discard_page) ++ __free_page(ctrl->discard_page); + return ret; + } + EXPORT_SYMBOL_GPL(nvme_init_ctrl); +diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h +index 2653e1f4196d..cc4273f11989 100644 +--- a/drivers/nvme/host/nvme.h ++++ b/drivers/nvme/host/nvme.h +@@ -238,6 +238,9 @@ struct nvme_ctrl { + u16 maxcmd; + int nr_reconnects; + struct nvmf_ctrl_options *opts; ++ ++ struct page *discard_page; ++ unsigned long discard_page_busy; + }; + + struct nvme_subsystem { +diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c +index af24ed50a245..971dddf62374 100644 +--- a/drivers/pci/msi.c ++++ b/drivers/pci/msi.c +@@ -1155,7 +1155,8 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, + const struct irq_affinity *affd) + { + static const struct irq_affinity msi_default_affd; +- int vecs = -ENOSPC; ++ int msix_vecs = -ENOSPC; ++ int msi_vecs = -ENOSPC; + + if (flags & PCI_IRQ_AFFINITY) { + if (!affd) +@@ -1166,16 +1167,17 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, + } + + if (flags & PCI_IRQ_MSIX) { +- vecs = __pci_enable_msix_range(dev, NULL, min_vecs, max_vecs, +- affd); +- if (vecs > 0) +- return vecs; ++ msix_vecs = __pci_enable_msix_range(dev, NULL, min_vecs, ++ max_vecs, affd); ++ if (msix_vecs > 0) ++ return msix_vecs; + } + + if (flags & PCI_IRQ_MSI) { +- vecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, affd); +- if (vecs > 0) +- return vecs; ++ msi_vecs = __pci_enable_msi_range(dev, min_vecs, max_vecs, ++ affd); ++ if (msi_vecs > 0) ++ return msi_vecs; + } + + /* use legacy irq if allowed */ +@@ -1186,7 +1188,9 @@ int pci_alloc_irq_vectors_affinity(struct pci_dev *dev, unsigned int min_vecs, + } + } + +- return vecs; ++ if (msix_vecs == -ENOSPC) ++ return -ENOSPC; ++ return msi_vecs; + } + EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity); + +diff --git a/drivers/pinctrl/intel/pinctrl-cherryview.c b/drivers/pinctrl/intel/pinctrl-cherryview.c +index 9eab50839581..f16baf9b8696 100644 +--- a/drivers/pinctrl/intel/pinctrl-cherryview.c ++++ b/drivers/pinctrl/intel/pinctrl-cherryview.c +@@ -157,6 +157,7 @@ struct chv_pin_context { + * @pctldesc: Pin controller description + * @pctldev: Pointer to the pin controller device + * @chip: GPIO chip in this pin controller ++ * @irqchip: IRQ chip in this pin controller + * @regs: MMIO registers + * @intr_lines: Stores mapping between 16 HW interrupt wires and GPIO + * offset (in GPIO number space) +@@ -170,6 +171,7 @@ struct chv_pinctrl { + struct pinctrl_desc pctldesc; + struct pinctrl_dev *pctldev; + struct gpio_chip chip; ++ struct irq_chip irqchip; + void __iomem *regs; + unsigned intr_lines[16]; + const struct chv_community *community; +@@ -1477,16 +1479,6 @@ static int chv_gpio_irq_type(struct irq_data *d, unsigned type) + return 0; + } + +-static struct irq_chip chv_gpio_irqchip = { +- .name = "chv-gpio", +- .irq_startup = chv_gpio_irq_startup, +- .irq_ack = chv_gpio_irq_ack, +- .irq_mask = chv_gpio_irq_mask, +- .irq_unmask = chv_gpio_irq_unmask, +- .irq_set_type = chv_gpio_irq_type, +- .flags = IRQCHIP_SKIP_SET_WAKE, +-}; +- + static void chv_gpio_irq_handler(struct irq_desc *desc) + { + struct gpio_chip *gc = irq_desc_get_handler_data(desc); +@@ -1626,7 +1618,15 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq) + } + } + +- ret = gpiochip_irqchip_add(chip, &chv_gpio_irqchip, 0, ++ pctrl->irqchip.name = "chv-gpio"; ++ pctrl->irqchip.irq_startup = chv_gpio_irq_startup; ++ pctrl->irqchip.irq_ack = chv_gpio_irq_ack; ++ pctrl->irqchip.irq_mask = chv_gpio_irq_mask; ++ pctrl->irqchip.irq_unmask = chv_gpio_irq_unmask; ++ pctrl->irqchip.irq_set_type = chv_gpio_irq_type; ++ pctrl->irqchip.flags = IRQCHIP_SKIP_SET_WAKE; ++ ++ ret = gpiochip_irqchip_add(chip, &pctrl->irqchip, 0, + handle_bad_irq, IRQ_TYPE_NONE); + if (ret) { + dev_err(pctrl->dev, "failed to add IRQ chip\n"); +@@ -1643,7 +1643,7 @@ static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq) + } + } + +- gpiochip_set_chained_irqchip(chip, &chv_gpio_irqchip, irq, ++ gpiochip_set_chained_irqchip(chip, &pctrl->irqchip, irq, + chv_gpio_irq_handler); + return 0; + } +diff --git a/drivers/pinctrl/pinctrl-xway.c b/drivers/pinctrl/pinctrl-xway.c +index 93f8bd04e7fe..ae74b260b014 100644 +--- a/drivers/pinctrl/pinctrl-xway.c ++++ b/drivers/pinctrl/pinctrl-xway.c +@@ -1746,14 +1746,6 @@ static int pinmux_xway_probe(struct platform_device *pdev) + } + xway_pctrl_desc.pins = xway_info.pads; + +- /* register the gpio chip */ +- xway_chip.parent = &pdev->dev; +- ret = devm_gpiochip_add_data(&pdev->dev, &xway_chip, NULL); +- if (ret) { +- dev_err(&pdev->dev, "Failed to register gpio chip\n"); +- return ret; +- } +- + /* setup the data needed by pinctrl */ + xway_pctrl_desc.name = dev_name(&pdev->dev); + xway_pctrl_desc.npins = xway_chip.ngpio; +@@ -1775,10 +1767,33 @@ static int pinmux_xway_probe(struct platform_device *pdev) + return ret; + } + +- /* finish with registering the gpio range in pinctrl */ +- xway_gpio_range.npins = xway_chip.ngpio; +- xway_gpio_range.base = xway_chip.base; +- pinctrl_add_gpio_range(xway_info.pctrl, &xway_gpio_range); ++ /* register the gpio chip */ ++ xway_chip.parent = &pdev->dev; ++ xway_chip.owner = THIS_MODULE; ++ xway_chip.of_node = pdev->dev.of_node; ++ ret = devm_gpiochip_add_data(&pdev->dev, &xway_chip, NULL); ++ if (ret) { ++ dev_err(&pdev->dev, "Failed to register gpio chip\n"); ++ return ret; ++ } ++ ++ /* ++ * For DeviceTree-supported systems, the gpio core checks the ++ * pinctrl's device node for the "gpio-ranges" property. ++ * If it is present, it takes care of adding the pin ranges ++ * for the driver. In this case the driver can skip ahead. ++ * ++ * In order to remain compatible with older, existing DeviceTree ++ * files which don't set the "gpio-ranges" property or systems that ++ * utilize ACPI the driver has to call gpiochip_add_pin_range(). ++ */ ++ if (!of_property_read_bool(pdev->dev.of_node, "gpio-ranges")) { ++ /* finish with registering the gpio range in pinctrl */ ++ xway_gpio_range.npins = xway_chip.ngpio; ++ xway_gpio_range.base = xway_chip.base; ++ pinctrl_add_gpio_range(xway_info.pctrl, &xway_gpio_range); ++ } ++ + dev_info(&pdev->dev, "Init done\n"); + return 0; + } +diff --git a/drivers/pinctrl/sh-pfc/pfc-r8a77990.c b/drivers/pinctrl/sh-pfc/pfc-r8a77990.c +index b81c807ac54d..d2fcf7f7b966 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-r8a77990.c ++++ b/drivers/pinctrl/sh-pfc/pfc-r8a77990.c +@@ -395,7 +395,7 @@ FM(IP12_31_28) IP12_31_28 FM(IP13_31_28) IP13_31_28 FM(IP14_31_28) IP14_31_28 FM + #define MOD_SEL0_24 FM(SEL_HSCIF0_0) FM(SEL_HSCIF0_1) + #define MOD_SEL0_23 FM(SEL_HSCIF1_0) FM(SEL_HSCIF1_1) + #define MOD_SEL0_22 FM(SEL_HSCIF2_0) FM(SEL_HSCIF2_1) +-#define MOD_SEL0_21_20 FM(SEL_I2C1_0) FM(SEL_I2C1_1) FM(SEL_I2C1_2) FM(SEL_I2C1_3) FM(SEL_I2C1_4) F_(0, 0) F_(0, 0) F_(0, 0) ++#define MOD_SEL0_21_20 FM(SEL_I2C1_0) FM(SEL_I2C1_1) FM(SEL_I2C1_2) FM(SEL_I2C1_3) + #define MOD_SEL0_19_18_17 FM(SEL_I2C2_0) FM(SEL_I2C2_1) FM(SEL_I2C2_2) FM(SEL_I2C2_3) FM(SEL_I2C2_4) F_(0, 0) F_(0, 0) F_(0, 0) + #define MOD_SEL0_16 FM(SEL_NDFC_0) FM(SEL_NDFC_1) + #define MOD_SEL0_15 FM(SEL_PWM0_0) FM(SEL_PWM0_1) +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7264.c b/drivers/pinctrl/sh-pfc/pfc-sh7264.c +index 8070765311db..e1c34e19222e 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh7264.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh7264.c +@@ -1716,6 +1716,9 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + }, + + { PINMUX_CFG_REG("PFCR3", 0xfffe38a8, 16, 4) { ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + PF12MD_000, PF12MD_001, 0, PF12MD_011, + PF12MD_100, PF12MD_101, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 } +@@ -1759,8 +1762,10 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + PF1MD_000, PF1MD_001, PF1MD_010, PF1MD_011, + PF1MD_100, PF1MD_101, 0, 0, +- 0, 0, 0, 0, 0, 0, 0, 0 +- } ++ 0, 0, 0, 0, 0, 0, 0, 0, ++ PF0MD_000, PF0MD_001, PF0MD_010, PF0MD_011, ++ PF0MD_100, PF0MD_101, 0, 0, ++ 0, 0, 0, 0, 0, 0, 0, 0 } + }, + + { PINMUX_CFG_REG("PFIOR0", 0xfffe38b2, 16, 1) { +diff --git a/drivers/pinctrl/sh-pfc/pfc-sh7734.c b/drivers/pinctrl/sh-pfc/pfc-sh7734.c +index 6502e676d368..33232041ee86 100644 +--- a/drivers/pinctrl/sh-pfc/pfc-sh7734.c ++++ b/drivers/pinctrl/sh-pfc/pfc-sh7734.c +@@ -2213,22 +2213,22 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = { + /* IP10_22 [1] */ + FN_CAN_CLK_A, FN_RX4_D, + /* IP10_21_19 [3] */ +- FN_AUDIO_CLKOUT, FN_TX1_E, FN_HRTS0_C, FN_FSE_B, +- FN_LCD_M_DISP_B, 0, 0, 0, ++ FN_AUDIO_CLKOUT, FN_TX1_E, 0, FN_HRTS0_C, FN_FSE_B, ++ FN_LCD_M_DISP_B, 0, 0, + /* IP10_18_16 [3] */ +- FN_AUDIO_CLKC, FN_SCK1_E, FN_HCTS0_C, FN_FRB_B, +- FN_LCD_VEPWC_B, 0, 0, 0, ++ FN_AUDIO_CLKC, FN_SCK1_E, 0, FN_HCTS0_C, FN_FRB_B, ++ FN_LCD_VEPWC_B, 0, 0, + /* IP10_15 [1] */ + FN_AUDIO_CLKB_A, FN_LCD_CLK_B, + /* IP10_14_12 [3] */ + FN_AUDIO_CLKA_A, FN_VI1_CLK_B, FN_SCK1_D, FN_IECLK_B, + FN_LCD_FLM_B, 0, 0, 0, + /* IP10_11_9 [3] */ +- FN_SSI_SDATA3, FN_VI1_7_B, FN_HTX0_C, FN_FWE_B, +- FN_LCD_CL2_B, 0, 0, 0, ++ FN_SSI_SDATA3, FN_VI1_7_B, 0, FN_HTX0_C, FN_FWE_B, ++ FN_LCD_CL2_B, 0, 0, + /* IP10_8_6 [3] */ +- FN_SSI_SDATA2, FN_VI1_6_B, FN_HRX0_C, FN_FRE_B, +- FN_LCD_CL1_B, 0, 0, 0, ++ FN_SSI_SDATA2, FN_VI1_6_B, 0, FN_HRX0_C, FN_FRE_B, ++ FN_LCD_CL1_B, 0, 0, + /* IP10_5_3 [3] */ + FN_SSI_WS23, FN_VI1_5_B, FN_TX1_D, FN_HSCK0_C, FN_FALE_B, + FN_LCD_DON_B, 0, 0, 0, +diff --git a/drivers/pinctrl/stm32/pinctrl-stm32.c b/drivers/pinctrl/stm32/pinctrl-stm32.c +index a9bec6e6fdd1..14dfbbd6c1c3 100644 +--- a/drivers/pinctrl/stm32/pinctrl-stm32.c ++++ b/drivers/pinctrl/stm32/pinctrl-stm32.c +@@ -410,7 +410,7 @@ static int stm32_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev, + unsigned int num_configs; + bool has_config = 0; + unsigned reserve = 0; +- int num_pins, num_funcs, maps_per_pin, i, err; ++ int num_pins, num_funcs, maps_per_pin, i, err = 0; + + pctl = pinctrl_dev_get_drvdata(pctldev); + +@@ -437,41 +437,45 @@ static int stm32_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev, + if (has_config && num_pins >= 1) + maps_per_pin++; + +- if (!num_pins || !maps_per_pin) +- return -EINVAL; ++ if (!num_pins || !maps_per_pin) { ++ err = -EINVAL; ++ goto exit; ++ } + + reserve = num_pins * maps_per_pin; + + err = pinctrl_utils_reserve_map(pctldev, map, + reserved_maps, num_maps, reserve); + if (err) +- return err; ++ goto exit; + + for (i = 0; i < num_pins; i++) { + err = of_property_read_u32_index(node, "pinmux", + i, &pinfunc); + if (err) +- return err; ++ goto exit; + + pin = STM32_GET_PIN_NO(pinfunc); + func = STM32_GET_PIN_FUNC(pinfunc); + + if (!stm32_pctrl_is_function_valid(pctl, pin, func)) { + dev_err(pctl->dev, "invalid function.\n"); +- return -EINVAL; ++ err = -EINVAL; ++ goto exit; + } + + grp = stm32_pctrl_find_group_by_pin(pctl, pin); + if (!grp) { + dev_err(pctl->dev, "unable to match pin %d to group\n", + pin); +- return -EINVAL; ++ err = -EINVAL; ++ goto exit; + } + + err = stm32_pctrl_dt_node_to_map_func(pctl, pin, func, grp, map, + reserved_maps, num_maps); + if (err) +- return err; ++ goto exit; + + if (has_config) { + err = pinctrl_utils_add_map_configs(pctldev, map, +@@ -479,11 +483,13 @@ static int stm32_pctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev, + configs, num_configs, + PIN_MAP_TYPE_CONFIGS_GROUP); + if (err) +- return err; ++ goto exit; + } + } + +- return 0; ++exit: ++ kfree(configs); ++ return err; + } + + static int stm32_pctrl_dt_node_to_map(struct pinctrl_dev *pctldev, +diff --git a/drivers/platform/x86/hp-wmi.c b/drivers/platform/x86/hp-wmi.c +index b4224389febe..d0ffdd5d9199 100644 +--- a/drivers/platform/x86/hp-wmi.c ++++ b/drivers/platform/x86/hp-wmi.c +@@ -78,7 +78,7 @@ struct bios_args { + u32 command; + u32 commandtype; + u32 datasize; +- u32 data; ++ u8 data[128]; + }; + + enum hp_wmi_commandtype { +@@ -229,7 +229,7 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, + .command = command, + .commandtype = query, + .datasize = insize, +- .data = 0, ++ .data = { 0 }, + }; + struct acpi_buffer input = { sizeof(struct bios_args), &args }; + struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER, NULL }; +@@ -241,7 +241,7 @@ static int hp_wmi_perform_query(int query, enum hp_wmi_command command, + + if (WARN_ON(insize > sizeof(args.data))) + return -EINVAL; +- memcpy(&args.data, buffer, insize); ++ memcpy(&args.data[0], buffer, insize); + + wmi_evaluate_method(HPWMI_BIOS_GUID, 0, mid, &input, &output); + +@@ -393,7 +393,7 @@ static int hp_wmi_rfkill2_refresh(void) + int err, i; + + err = hp_wmi_perform_query(HPWMI_WIRELESS2_QUERY, HPWMI_READ, &state, +- 0, sizeof(state)); ++ sizeof(state), sizeof(state)); + if (err) + return err; + +@@ -790,7 +790,7 @@ static int __init hp_wmi_rfkill2_setup(struct platform_device *device) + int err, i; + + err = hp_wmi_perform_query(HPWMI_WIRELESS2_QUERY, HPWMI_READ, &state, +- 0, sizeof(state)); ++ sizeof(state), sizeof(state)); + if (err) + return err < 0 ? err : -EINVAL; + +diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c +index d17db140cb1f..69e28c12d591 100644 +--- a/drivers/platform/x86/mlx-platform.c ++++ b/drivers/platform/x86/mlx-platform.c +@@ -1421,7 +1421,7 @@ static int __init mlxplat_dmi_msn201x_matched(const struct dmi_system_id *dmi) + mlxplat_hotplug = &mlxplat_mlxcpld_msn201x_data; + mlxplat_hotplug->deferred_nr = + mlxplat_default_channels[i - 1][MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; +- mlxplat_led = &mlxplat_default_ng_led_data; ++ mlxplat_led = &mlxplat_msn21xx_led_data; + mlxplat_regs_io = &mlxplat_msn21xx_regs_io_data; + + return 1; +@@ -1439,7 +1439,7 @@ static int __init mlxplat_dmi_qmb7xx_matched(const struct dmi_system_id *dmi) + mlxplat_hotplug = &mlxplat_mlxcpld_default_ng_data; + mlxplat_hotplug->deferred_nr = + mlxplat_msn21xx_channels[MLXPLAT_CPLD_GRP_CHNL_NUM - 1]; +- mlxplat_led = &mlxplat_msn21xx_led_data; ++ mlxplat_led = &mlxplat_default_ng_led_data; + mlxplat_fan = &mlxplat_default_fan_data; + + return 1; +diff --git a/drivers/power/avs/smartreflex.c b/drivers/power/avs/smartreflex.c +index 1360a7fa542c..8760477d0e8a 100644 +--- a/drivers/power/avs/smartreflex.c ++++ b/drivers/power/avs/smartreflex.c +@@ -1010,8 +1010,7 @@ static int omap_sr_remove(struct platform_device *pdev) + + if (sr_info->autocomp_active) + sr_stop_vddautocomp(sr_info); +- if (sr_info->dbg_dir) +- debugfs_remove_recursive(sr_info->dbg_dir); ++ debugfs_remove_recursive(sr_info->dbg_dir); + + pm_runtime_disable(&pdev->dev); + list_del(&sr_info->node); +diff --git a/drivers/pwm/core.c b/drivers/pwm/core.c +index c45e5719ba17..b1b74cfb1571 100644 +--- a/drivers/pwm/core.c ++++ b/drivers/pwm/core.c +@@ -874,6 +874,7 @@ void pwm_put(struct pwm_device *pwm) + if (pwm->chip->ops->free) + pwm->chip->ops->free(pwm->chip, pwm); + ++ pwm_set_chip_data(pwm, NULL); + pwm->label = NULL; + + module_put(pwm->chip->ops->owner); +diff --git a/drivers/pwm/pwm-bcm-iproc.c b/drivers/pwm/pwm-bcm-iproc.c +index d961a8207b1c..31b01035d0ab 100644 +--- a/drivers/pwm/pwm-bcm-iproc.c ++++ b/drivers/pwm/pwm-bcm-iproc.c +@@ -187,6 +187,7 @@ static int iproc_pwmc_apply(struct pwm_chip *chip, struct pwm_device *pwm, + static const struct pwm_ops iproc_pwm_ops = { + .apply = iproc_pwmc_apply, + .get_state = iproc_pwmc_get_state, ++ .owner = THIS_MODULE, + }; + + static int iproc_pwmc_probe(struct platform_device *pdev) +diff --git a/drivers/pwm/pwm-berlin.c b/drivers/pwm/pwm-berlin.c +index 7c8d6a168ceb..b91c477cc84b 100644 +--- a/drivers/pwm/pwm-berlin.c ++++ b/drivers/pwm/pwm-berlin.c +@@ -84,7 +84,6 @@ static void berlin_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm) + { + struct berlin_pwm_channel *channel = pwm_get_chip_data(pwm); + +- pwm_set_chip_data(pwm, NULL); + kfree(channel); + } + +diff --git a/drivers/pwm/pwm-clps711x.c b/drivers/pwm/pwm-clps711x.c +index 26ec24e457b1..7e16b7def0dc 100644 +--- a/drivers/pwm/pwm-clps711x.c ++++ b/drivers/pwm/pwm-clps711x.c +@@ -48,7 +48,7 @@ static void clps711x_pwm_update_val(struct clps711x_chip *priv, u32 n, u32 v) + static unsigned int clps711x_get_duty(struct pwm_device *pwm, unsigned int v) + { + /* Duty cycle 0..15 max */ +- return DIV_ROUND_CLOSEST(v * 0xf, pwm_get_period(pwm)); ++ return DIV_ROUND_CLOSEST(v * 0xf, pwm->args.period); + } + + static int clps711x_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm) +@@ -71,7 +71,7 @@ static int clps711x_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, + struct clps711x_chip *priv = to_clps711x_chip(chip); + unsigned int duty; + +- if (period_ns != pwm_get_period(pwm)) ++ if (period_ns != pwm->args.period) + return -EINVAL; + + duty = clps711x_get_duty(pwm, duty_ns); +diff --git a/drivers/pwm/pwm-pca9685.c b/drivers/pwm/pwm-pca9685.c +index a7eaf962a95b..567f5e2771c4 100644 +--- a/drivers/pwm/pwm-pca9685.c ++++ b/drivers/pwm/pwm-pca9685.c +@@ -176,7 +176,6 @@ static void pca9685_pwm_gpio_free(struct gpio_chip *gpio, unsigned int offset) + pm_runtime_put(pca->chip.dev); + mutex_lock(&pca->lock); + pwm = &pca->chip.pwms[offset]; +- pwm_set_chip_data(pwm, NULL); + mutex_unlock(&pca->lock); + } + +diff --git a/drivers/pwm/pwm-samsung.c b/drivers/pwm/pwm-samsung.c +index 062f2cfc45ec..3762432dd6a7 100644 +--- a/drivers/pwm/pwm-samsung.c ++++ b/drivers/pwm/pwm-samsung.c +@@ -238,7 +238,6 @@ static int pwm_samsung_request(struct pwm_chip *chip, struct pwm_device *pwm) + static void pwm_samsung_free(struct pwm_chip *chip, struct pwm_device *pwm) + { + devm_kfree(chip->dev, pwm_get_chip_data(pwm)); +- pwm_set_chip_data(pwm, NULL); + } + + static int pwm_samsung_enable(struct pwm_chip *chip, struct pwm_device *pwm) +diff --git a/drivers/regulator/palmas-regulator.c b/drivers/regulator/palmas-regulator.c +index bb5ab7d78895..c2cc392a27d4 100644 +--- a/drivers/regulator/palmas-regulator.c ++++ b/drivers/regulator/palmas-regulator.c +@@ -443,13 +443,16 @@ static int palmas_ldo_write(struct palmas *palmas, unsigned int reg, + static int palmas_set_mode_smps(struct regulator_dev *dev, unsigned int mode) + { + int id = rdev_get_id(dev); ++ int ret; + struct palmas_pmic *pmic = rdev_get_drvdata(dev); + struct palmas_pmic_driver_data *ddata = pmic->palmas->pmic_ddata; + struct palmas_regs_info *rinfo = &ddata->palmas_regs_info[id]; + unsigned int reg; + bool rail_enable = true; + +- palmas_smps_read(pmic->palmas, rinfo->ctrl_addr, ®); ++ ret = palmas_smps_read(pmic->palmas, rinfo->ctrl_addr, ®); ++ if (ret) ++ return ret; + + reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK; + +diff --git a/drivers/regulator/tps65910-regulator.c b/drivers/regulator/tps65910-regulator.c +index 02ccdaa226a7..5ebb6ee73f07 100644 +--- a/drivers/regulator/tps65910-regulator.c ++++ b/drivers/regulator/tps65910-regulator.c +@@ -1102,8 +1102,10 @@ static int tps65910_probe(struct platform_device *pdev) + platform_set_drvdata(pdev, pmic); + + /* Give control of all register to control port */ +- tps65910_reg_set_bits(pmic->mfd, TPS65910_DEVCTRL, ++ err = tps65910_reg_set_bits(pmic->mfd, TPS65910_DEVCTRL, + DEVCTRL_SR_CTL_I2C_SEL_MASK); ++ if (err < 0) ++ return err; + + switch (tps65910_chip_id(tps65910)) { + case TPS65910: +diff --git a/drivers/reset/core.c b/drivers/reset/core.c +index d1887c0ed5d3..f7bf20493f23 100644 +--- a/drivers/reset/core.c ++++ b/drivers/reset/core.c +@@ -607,6 +607,7 @@ static void reset_control_array_put(struct reset_control_array *resets) + for (i = 0; i < resets->num_rstcs; i++) + __reset_control_put_internal(resets->rstc[i]); + mutex_unlock(&reset_list_mutex); ++ kfree(resets); + } + + /** +diff --git a/drivers/s390/crypto/ap_queue.c b/drivers/s390/crypto/ap_queue.c +index 0aa4b3ccc948..576ac08777c5 100644 +--- a/drivers/s390/crypto/ap_queue.c ++++ b/drivers/s390/crypto/ap_queue.c +@@ -14,6 +14,9 @@ + #include <asm/facility.h> + + #include "ap_bus.h" ++#include "ap_debug.h" ++ ++static void __ap_flush_queue(struct ap_queue *aq); + + /** + * ap_queue_enable_interruption(): Enable interruption on an AP queue. +@@ -541,7 +544,25 @@ static ssize_t reset_show(struct device *dev, + return rc; + } + +-static DEVICE_ATTR_RO(reset); ++static ssize_t reset_store(struct device *dev, ++ struct device_attribute *attr, ++ const char *buf, size_t count) ++{ ++ struct ap_queue *aq = to_ap_queue(dev); ++ ++ spin_lock_bh(&aq->lock); ++ __ap_flush_queue(aq); ++ aq->state = AP_STATE_RESET_START; ++ ap_wait(ap_sm_event(aq, AP_EVENT_POLL)); ++ spin_unlock_bh(&aq->lock); ++ ++ AP_DBF(DBF_INFO, "reset queue=%02x.%04x triggered by user\n", ++ AP_QID_CARD(aq->qid), AP_QID_QUEUE(aq->qid)); ++ ++ return count; ++} ++ ++static DEVICE_ATTR_RW(reset); + + static ssize_t interrupt_show(struct device *dev, + struct device_attribute *attr, char *buf) +diff --git a/drivers/scsi/csiostor/csio_init.c b/drivers/scsi/csiostor/csio_init.c +index ed2dae657964..1793981337dd 100644 +--- a/drivers/scsi/csiostor/csio_init.c ++++ b/drivers/scsi/csiostor/csio_init.c +@@ -649,7 +649,7 @@ csio_shost_init(struct csio_hw *hw, struct device *dev, + if (csio_lnode_init(ln, hw, pln)) + goto err_shost_put; + +- if (scsi_add_host(shost, dev)) ++ if (scsi_add_host_with_dma(shost, dev, &hw->pdev->dev)) + goto err_lnode_exit; + + return ln; +diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +index fb2a5969181b..a7407d5376ba 100644 +--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c ++++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +@@ -1520,6 +1520,7 @@ static irqreturn_t fatal_axi_int_v3_hw(int irq_no, void *p) + u32 irq_value, irq_msk; + struct hisi_hba *hisi_hba = p; + struct device *dev = hisi_hba->dev; ++ struct pci_dev *pdev = hisi_hba->pci_dev; + int i; + + irq_msk = hisi_sas_read32(hisi_hba, ENT_INT_SRC_MSK3); +@@ -1551,6 +1552,17 @@ static irqreturn_t fatal_axi_int_v3_hw(int irq_no, void *p) + error->msg, irq_value); + queue_work(hisi_hba->wq, &hisi_hba->rst_work); + } ++ ++ if (pdev->revision < 0x21) { ++ u32 reg_val; ++ ++ reg_val = hisi_sas_read32(hisi_hba, ++ AXI_MASTER_CFG_BASE + ++ AM_CTRL_GLOBAL); ++ reg_val |= AM_CTRL_SHUTDOWN_REQ_MSK; ++ hisi_sas_write32(hisi_hba, AXI_MASTER_CFG_BASE + ++ AM_CTRL_GLOBAL, reg_val); ++ } + } + + if (irq_value & BIT(ENT_INT_SRC3_ITC_INT_OFF)) { +diff --git a/drivers/scsi/libsas/sas_expander.c b/drivers/scsi/libsas/sas_expander.c +index 2ee9c4ec7a54..3e74fe925761 100644 +--- a/drivers/scsi/libsas/sas_expander.c ++++ b/drivers/scsi/libsas/sas_expander.c +@@ -614,7 +614,14 @@ int sas_smp_phy_control(struct domain_device *dev, int phy_id, + } + + res = smp_execute_task(dev, pc_req, PC_REQ_SIZE, pc_resp,PC_RESP_SIZE); +- ++ if (res) { ++ pr_err("ex %016llx phy%02d PHY control failed: %d\n", ++ SAS_ADDR(dev->sas_addr), phy_id, res); ++ } else if (pc_resp[2] != SMP_RESP_FUNC_ACC) { ++ pr_err("ex %016llx phy%02d PHY control failed: function result 0x%x\n", ++ SAS_ADDR(dev->sas_addr), phy_id, pc_resp[2]); ++ res = pc_resp[2]; ++ } + kfree(pc_resp); + kfree(pc_req); + return res; +@@ -817,6 +824,26 @@ static struct domain_device *sas_ex_discover_end_dev( + + #ifdef CONFIG_SCSI_SAS_ATA + if ((phy->attached_tproto & SAS_PROTOCOL_STP) || phy->attached_sata_dev) { ++ if (child->linkrate > parent->min_linkrate) { ++ struct sas_phy_linkrates rates = { ++ .maximum_linkrate = parent->min_linkrate, ++ .minimum_linkrate = parent->min_linkrate, ++ }; ++ int ret; ++ ++ pr_notice("ex %016llx phy%02d SATA device linkrate > min pathway connection rate, attempting to lower device linkrate\n", ++ SAS_ADDR(child->sas_addr), phy_id); ++ ret = sas_smp_phy_control(parent, phy_id, ++ PHY_FUNC_LINK_RESET, &rates); ++ if (ret) { ++ pr_err("ex %016llx phy%02d SATA device could not set linkrate (%d)\n", ++ SAS_ADDR(child->sas_addr), phy_id, ret); ++ goto out_free; ++ } ++ pr_notice("ex %016llx phy%02d SATA device set linkrate successfully\n", ++ SAS_ADDR(child->sas_addr), phy_id); ++ child->linkrate = child->min_linkrate; ++ } + res = sas_get_ata_info(child, phy); + if (res) + goto out_free; +diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h +index ebcfcbb8b4cc..a62e85cb62eb 100644 +--- a/drivers/scsi/lpfc/lpfc.h ++++ b/drivers/scsi/lpfc/lpfc.h +@@ -1236,6 +1236,12 @@ lpfc_sli_read_hs(struct lpfc_hba *phba) + static inline struct lpfc_sli_ring * + lpfc_phba_elsring(struct lpfc_hba *phba) + { ++ /* Return NULL if sli_rev has become invalid due to bad fw */ ++ if (phba->sli_rev != LPFC_SLI_REV4 && ++ phba->sli_rev != LPFC_SLI_REV3 && ++ phba->sli_rev != LPFC_SLI_REV2) ++ return NULL; ++ + if (phba->sli_rev == LPFC_SLI_REV4) { + if (phba->sli4_hba.els_wq) + return phba->sli4_hba.els_wq->pring; +diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c +index 55cd96e2469c..3f69a5e4e470 100644 +--- a/drivers/scsi/lpfc/lpfc_attr.c ++++ b/drivers/scsi/lpfc/lpfc_attr.c +@@ -1332,7 +1332,7 @@ lpfc_sli4_pdev_reg_request(struct lpfc_hba *phba, uint32_t opcode) + return -EACCES; + + if ((phba->sli_rev < LPFC_SLI_REV4) || +- (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != ++ (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < + LPFC_SLI_INTF_IF_TYPE_2)) + return -EPERM; + +@@ -4264,7 +4264,7 @@ lpfc_link_speed_store(struct device *dev, struct device_attribute *attr, + uint32_t prev_val, if_type; + + if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); +- if (if_type == LPFC_SLI_INTF_IF_TYPE_2 && ++ if (if_type >= LPFC_SLI_INTF_IF_TYPE_2 && + phba->hba_flag & HBA_FORCED_LINK_SPEED) + return -EPERM; + +diff --git a/drivers/scsi/lpfc/lpfc_bsg.c b/drivers/scsi/lpfc/lpfc_bsg.c +index 90745feca808..99aea52e584b 100644 +--- a/drivers/scsi/lpfc/lpfc_bsg.c ++++ b/drivers/scsi/lpfc/lpfc_bsg.c +@@ -2221,7 +2221,7 @@ lpfc_bsg_diag_loopback_mode(struct bsg_job *job) + + if (phba->sli_rev < LPFC_SLI_REV4) + rc = lpfc_sli3_bsg_diag_loopback_mode(phba, job); +- else if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) == ++ else if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) >= + LPFC_SLI_INTF_IF_TYPE_2) + rc = lpfc_sli4_bsg_diag_loopback_mode(phba, job); + else +@@ -2261,7 +2261,7 @@ lpfc_sli4_bsg_diag_mode_end(struct bsg_job *job) + + if (phba->sli_rev < LPFC_SLI_REV4) + return -ENODEV; +- if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != ++ if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < + LPFC_SLI_INTF_IF_TYPE_2) + return -ENODEV; + +@@ -2353,7 +2353,7 @@ lpfc_sli4_bsg_link_diag_test(struct bsg_job *job) + rc = -ENODEV; + goto job_error; + } +- if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != ++ if (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < + LPFC_SLI_INTF_IF_TYPE_2) { + rc = -ENODEV; + goto job_error; +diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c +index 222fa9b7f478..4f4d1b3b3bbc 100644 +--- a/drivers/scsi/lpfc/lpfc_els.c ++++ b/drivers/scsi/lpfc/lpfc_els.c +@@ -1343,6 +1343,8 @@ lpfc_els_abort_flogi(struct lpfc_hba *phba) + Fabric_DID); + + pring = lpfc_phba_elsring(phba); ++ if (unlikely(!pring)) ++ return -EIO; + + /* + * Check the txcmplq for an iocb that matches the nport the driver is +@@ -5557,7 +5559,7 @@ lpfc_els_rcv_rdp(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb, + struct ls_rjt stat; + + if (phba->sli_rev < LPFC_SLI_REV4 || +- bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) != ++ bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) < + LPFC_SLI_INTF_IF_TYPE_2) { + rjt_err = LSRJT_UNABLE_TPC; + rjt_expl = LSEXP_REQ_UNSUPPORTED; +diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c +index 68f223882d96..b36b3da323a0 100644 +--- a/drivers/scsi/lpfc/lpfc_hbadisc.c ++++ b/drivers/scsi/lpfc/lpfc_hbadisc.c +@@ -4780,7 +4780,7 @@ lpfc_unreg_rpi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp) + if (phba->sli_rev == LPFC_SLI_REV4 && + (!(vport->load_flag & FC_UNLOADING)) && + (bf_get(lpfc_sli_intf_if_type, +- &phba->sli4_hba.sli_intf) == ++ &phba->sli4_hba.sli_intf) >= + LPFC_SLI_INTF_IF_TYPE_2) && + (kref_read(&ndlp->kref) > 0)) { + mbox->context1 = lpfc_nlp_get(ndlp); +diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c +index a7d3e532e0f5..da63c026ba46 100644 +--- a/drivers/scsi/lpfc/lpfc_init.c ++++ b/drivers/scsi/lpfc/lpfc_init.c +@@ -1801,7 +1801,12 @@ lpfc_sli4_port_sta_fn_reset(struct lpfc_hba *phba, int mbx_action, + lpfc_offline(phba); + /* release interrupt for possible resource change */ + lpfc_sli4_disable_intr(phba); +- lpfc_sli_brdrestart(phba); ++ rc = lpfc_sli_brdrestart(phba); ++ if (rc) { ++ lpfc_printf_log(phba, KERN_ERR, LOG_INIT, ++ "6309 Failed to restart board\n"); ++ return rc; ++ } + /* request and enable interrupt */ + intr_mode = lpfc_sli4_enable_intr(phba, phba->intr_mode); + if (intr_mode == LPFC_INTR_ERROR) { +diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c +index 666495f21c24..425b83618a2e 100644 +--- a/drivers/scsi/lpfc/lpfc_scsi.c ++++ b/drivers/scsi/lpfc/lpfc_scsi.c +@@ -2732,6 +2732,7 @@ lpfc_bg_scsi_prep_dma_buf_s3(struct lpfc_hba *phba, + int datasegcnt, protsegcnt, datadir = scsi_cmnd->sc_data_direction; + int prot_group_type = 0; + int fcpdl; ++ struct lpfc_vport *vport = phba->pport; + + /* + * Start the lpfc command prep by bumping the bpl beyond fcp_cmnd +@@ -2837,6 +2838,14 @@ lpfc_bg_scsi_prep_dma_buf_s3(struct lpfc_hba *phba, + */ + iocb_cmd->un.fcpi.fcpi_parm = fcpdl; + ++ /* ++ * For First burst, we may need to adjust the initial transfer ++ * length for DIF ++ */ ++ if (iocb_cmd->un.fcpi.fcpi_XRdy && ++ (fcpdl < vport->cfg_first_burst_size)) ++ iocb_cmd->un.fcpi.fcpi_XRdy = fcpdl; ++ + return 0; + err: + if (lpfc_cmd->seg_cnt) +@@ -3401,6 +3410,7 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, + int datasegcnt, protsegcnt, datadir = scsi_cmnd->sc_data_direction; + int prot_group_type = 0; + int fcpdl; ++ struct lpfc_vport *vport = phba->pport; + + /* + * Start the lpfc command prep by bumping the sgl beyond fcp_cmnd +@@ -3516,6 +3526,14 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, + */ + iocb_cmd->un.fcpi.fcpi_parm = fcpdl; + ++ /* ++ * For First burst, we may need to adjust the initial transfer ++ * length for DIF ++ */ ++ if (iocb_cmd->un.fcpi.fcpi_XRdy && ++ (fcpdl < vport->cfg_first_burst_size)) ++ iocb_cmd->un.fcpi.fcpi_XRdy = fcpdl; ++ + /* + * If the OAS driver feature is enabled and the lun is enabled for + * OAS, set the oas iocb related flags. +diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c +index 3361ae75578f..755803ff6cfe 100644 +--- a/drivers/scsi/lpfc/lpfc_sli.c ++++ b/drivers/scsi/lpfc/lpfc_sli.c +@@ -4640,6 +4640,8 @@ lpfc_sli_brdrestart_s4(struct lpfc_hba *phba) + hba_aer_enabled = phba->hba_flag & HBA_AER_ENABLED; + + rc = lpfc_sli4_brdreset(phba); ++ if (rc) ++ return rc; + + spin_lock_irq(&phba->hbalock); + phba->pport->stopped = 0; +diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c +index 15d493f30810..3e9c49b3184f 100644 +--- a/drivers/scsi/qla2xxx/qla_attr.c ++++ b/drivers/scsi/qla2xxx/qla_attr.c +@@ -2161,6 +2161,8 @@ qla24xx_vport_delete(struct fc_vport *fc_vport) + test_bit(FCPORT_UPDATE_NEEDED, &vha->dpc_flags)) + msleep(1000); + ++ qla_nvme_delete(vha); ++ + qla24xx_disable_vp(vha); + qla2x00_wait_for_sess_deletion(vha); + +diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c +index 653d535e3052..f7dd289779b1 100644 +--- a/drivers/scsi/qla2xxx/qla_init.c ++++ b/drivers/scsi/qla2xxx/qla_init.c +@@ -242,15 +242,13 @@ qla2x00_async_login(struct scsi_qla_host *vha, fc_port_t *fcport, + qla2x00_init_timer(sp, qla2x00_get_async_timeout(vha) + 2); + + sp->done = qla2x00_async_login_sp_done; +- if (N2N_TOPO(fcport->vha->hw) && fcport_is_bigger(fcport)) { ++ if (N2N_TOPO(fcport->vha->hw) && fcport_is_bigger(fcport)) + lio->u.logio.flags |= SRB_LOGIN_PRLI_ONLY; +- } else { ++ else + lio->u.logio.flags |= SRB_LOGIN_COND_PLOGI; + +- if (fcport->fc4f_nvme) +- lio->u.logio.flags |= SRB_LOGIN_SKIP_PRLI; +- +- } ++ if (fcport->fc4f_nvme) ++ lio->u.logio.flags |= SRB_LOGIN_SKIP_PRLI; + + ql_dbg(ql_dbg_disc, vha, 0x2072, + "Async-login - %8phC hdl=%x, loopid=%x portid=%02x%02x%02x " +diff --git a/drivers/scsi/qla2xxx/qla_nvme.c b/drivers/scsi/qla2xxx/qla_nvme.c +index e6545cb9a2c1..5590d6e8b576 100644 +--- a/drivers/scsi/qla2xxx/qla_nvme.c ++++ b/drivers/scsi/qla2xxx/qla_nvme.c +@@ -474,21 +474,10 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport, + int rval = -ENODEV; + srb_t *sp; + struct qla_qpair *qpair = hw_queue_handle; +- struct nvme_private *priv; ++ struct nvme_private *priv = fd->private; + struct qla_nvme_rport *qla_rport = rport->private; + +- if (!fd || !qpair) { +- ql_log(ql_log_warn, NULL, 0x2134, +- "NO NVMe request or Queue Handle\n"); +- return rval; +- } +- +- priv = fd->private; + fcport = qla_rport->fcport; +- if (!fcport) { +- ql_log(ql_log_warn, NULL, 0x210e, "No fcport ptr\n"); +- return rval; +- } + + vha = fcport->vha; + +@@ -517,6 +506,7 @@ static int qla_nvme_post_cmd(struct nvme_fc_local_port *lport, + sp->name = "nvme_cmd"; + sp->done = qla_nvme_sp_done; + sp->qpair = qpair; ++ sp->vha = vha; + nvme = &sp->u.iocb_cmd; + nvme->u.nvme.desc = fd; + +@@ -564,7 +554,7 @@ static void qla_nvme_remoteport_delete(struct nvme_fc_remote_port *rport) + schedule_work(&fcport->free_work); + } + +- fcport->nvme_flag &= ~(NVME_FLAG_REGISTERED | NVME_FLAG_DELETING); ++ fcport->nvme_flag &= ~NVME_FLAG_DELETING; + ql_log(ql_log_info, fcport->vha, 0x2110, + "remoteport_delete of %p completed.\n", fcport); + } +diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c +index 3e892e013658..183bfda8f5d1 100644 +--- a/drivers/scsi/qla2xxx/qla_os.c ++++ b/drivers/scsi/qla2xxx/qla_os.c +@@ -3538,6 +3538,8 @@ qla2x00_delete_all_vps(struct qla_hw_data *ha, scsi_qla_host_t *base_vha) + spin_unlock_irqrestore(&ha->vport_slock, flags); + mutex_unlock(&ha->vport_lock); + ++ qla_nvme_delete(vha); ++ + fc_vport_terminate(vha->fc_vport); + scsi_host_put(vha->host); + +diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.c b/drivers/scsi/qla2xxx/tcm_qla2xxx.c +index b8c1a739dfbd..654e1af7f542 100644 +--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.c ++++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.c +@@ -926,38 +926,14 @@ static ssize_t tcm_qla2xxx_tpg_enable_show(struct config_item *item, + atomic_read(&tpg->lport_tpg_enabled)); + } + +-static void tcm_qla2xxx_depend_tpg(struct work_struct *work) +-{ +- struct tcm_qla2xxx_tpg *base_tpg = container_of(work, +- struct tcm_qla2xxx_tpg, tpg_base_work); +- struct se_portal_group *se_tpg = &base_tpg->se_tpg; +- struct scsi_qla_host *base_vha = base_tpg->lport->qla_vha; +- +- if (!target_depend_item(&se_tpg->tpg_group.cg_item)) { +- atomic_set(&base_tpg->lport_tpg_enabled, 1); +- qlt_enable_vha(base_vha); +- } +- complete(&base_tpg->tpg_base_comp); +-} +- +-static void tcm_qla2xxx_undepend_tpg(struct work_struct *work) +-{ +- struct tcm_qla2xxx_tpg *base_tpg = container_of(work, +- struct tcm_qla2xxx_tpg, tpg_base_work); +- struct se_portal_group *se_tpg = &base_tpg->se_tpg; +- struct scsi_qla_host *base_vha = base_tpg->lport->qla_vha; +- +- if (!qlt_stop_phase1(base_vha->vha_tgt.qla_tgt)) { +- atomic_set(&base_tpg->lport_tpg_enabled, 0); +- target_undepend_item(&se_tpg->tpg_group.cg_item); +- } +- complete(&base_tpg->tpg_base_comp); +-} +- + static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item, + const char *page, size_t count) + { + struct se_portal_group *se_tpg = to_tpg(item); ++ struct se_wwn *se_wwn = se_tpg->se_tpg_wwn; ++ struct tcm_qla2xxx_lport *lport = container_of(se_wwn, ++ struct tcm_qla2xxx_lport, lport_wwn); ++ struct scsi_qla_host *vha = lport->qla_vha; + struct tcm_qla2xxx_tpg *tpg = container_of(se_tpg, + struct tcm_qla2xxx_tpg, se_tpg); + unsigned long op; +@@ -976,24 +952,16 @@ static ssize_t tcm_qla2xxx_tpg_enable_store(struct config_item *item, + if (atomic_read(&tpg->lport_tpg_enabled)) + return -EEXIST; + +- INIT_WORK(&tpg->tpg_base_work, tcm_qla2xxx_depend_tpg); ++ atomic_set(&tpg->lport_tpg_enabled, 1); ++ qlt_enable_vha(vha); + } else { + if (!atomic_read(&tpg->lport_tpg_enabled)) + return count; + +- INIT_WORK(&tpg->tpg_base_work, tcm_qla2xxx_undepend_tpg); ++ atomic_set(&tpg->lport_tpg_enabled, 0); ++ qlt_stop_phase1(vha->vha_tgt.qla_tgt); + } +- init_completion(&tpg->tpg_base_comp); +- schedule_work(&tpg->tpg_base_work); +- wait_for_completion(&tpg->tpg_base_comp); + +- if (op) { +- if (!atomic_read(&tpg->lport_tpg_enabled)) +- return -ENODEV; +- } else { +- if (atomic_read(&tpg->lport_tpg_enabled)) +- return -EPERM; +- } + return count; + } + +diff --git a/drivers/scsi/qla2xxx/tcm_qla2xxx.h b/drivers/scsi/qla2xxx/tcm_qla2xxx.h +index 7550ba2831c3..147cf6c90366 100644 +--- a/drivers/scsi/qla2xxx/tcm_qla2xxx.h ++++ b/drivers/scsi/qla2xxx/tcm_qla2xxx.h +@@ -48,9 +48,6 @@ struct tcm_qla2xxx_tpg { + struct tcm_qla2xxx_tpg_attrib tpg_attrib; + /* Returned by tcm_qla2xxx_make_tpg() */ + struct se_portal_group se_tpg; +- /* Items for dealing with configfs_depend_item */ +- struct completion tpg_base_comp; +- struct work_struct tpg_base_work; + }; + + struct tcm_qla2xxx_fc_loopid { +diff --git a/drivers/staging/rtl8192e/rtl8192e/rtl_core.c b/drivers/staging/rtl8192e/rtl8192e/rtl_core.c +index d2605158546b..7cdced0b0581 100644 +--- a/drivers/staging/rtl8192e/rtl8192e/rtl_core.c ++++ b/drivers/staging/rtl8192e/rtl8192e/rtl_core.c +@@ -1627,14 +1627,15 @@ static void _rtl92e_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, + memcpy((unsigned char *)(skb->cb), &dev, sizeof(dev)); + skb_push(skb, priv->rtllib->tx_headroom); + ret = _rtl92e_tx(dev, skb); +- if (ret != 0) +- kfree_skb(skb); + + if (queue_index != MGNT_QUEUE) { + priv->rtllib->stats.tx_bytes += (skb->len - + priv->rtllib->tx_headroom); + priv->rtllib->stats.tx_packets++; + } ++ ++ if (ret != 0) ++ kfree_skb(skb); + } + + static int _rtl92e_hard_start_xmit(struct sk_buff *skb, struct net_device *dev) +diff --git a/drivers/staging/rtl8723bs/os_dep/sdio_intf.c b/drivers/staging/rtl8723bs/os_dep/sdio_intf.c +index 6d02904de63f..49ea780f9f42 100644 +--- a/drivers/staging/rtl8723bs/os_dep/sdio_intf.c ++++ b/drivers/staging/rtl8723bs/os_dep/sdio_intf.c +@@ -17,18 +17,13 @@ + static const struct sdio_device_id sdio_ids[] = + { + { SDIO_DEVICE(0x024c, 0x0523), }, ++ { SDIO_DEVICE(0x024c, 0x0525), }, + { SDIO_DEVICE(0x024c, 0x0623), }, + { SDIO_DEVICE(0x024c, 0x0626), }, + { SDIO_DEVICE(0x024c, 0xb723), }, + { /* end: all zeroes */ }, + }; +-static const struct acpi_device_id acpi_ids[] = { +- {"OBDA8723", 0x0000}, +- {} +-}; +- + MODULE_DEVICE_TABLE(sdio, sdio_ids); +-MODULE_DEVICE_TABLE(acpi, acpi_ids); + + static int rtw_drv_init(struct sdio_func *func, const struct sdio_device_id *id); + static void rtw_dev_remove(struct sdio_func *func); +diff --git a/drivers/target/target_core_user.c b/drivers/target/target_core_user.c +index 7159e8363b83..7ee0a75ce452 100644 +--- a/drivers/target/target_core_user.c ++++ b/drivers/target/target_core_user.c +@@ -962,7 +962,7 @@ static int add_to_qfull_queue(struct tcmu_cmd *tcmu_cmd) + * 0 success + * 1 internally queued to wait for ring memory to free. + */ +-static sense_reason_t queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, int *scsi_err) ++static int queue_cmd_ring(struct tcmu_cmd *tcmu_cmd, sense_reason_t *scsi_err) + { + struct tcmu_dev *udev = tcmu_cmd->tcmu_dev; + struct se_cmd *se_cmd = tcmu_cmd->se_cmd; +diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c +index bc7efa6e515d..678bf3365947 100644 +--- a/drivers/thunderbolt/switch.c ++++ b/drivers/thunderbolt/switch.c +@@ -167,7 +167,7 @@ static int nvm_validate_and_write(struct tb_switch *sw) + + static int nvm_authenticate_host(struct tb_switch *sw) + { +- int ret; ++ int ret = 0; + + /* + * Root switch NVM upgrade requires that we disconnect the +@@ -175,6 +175,8 @@ static int nvm_authenticate_host(struct tb_switch *sw) + * already). + */ + if (!sw->safe_mode) { ++ u32 status; ++ + ret = tb_domain_disconnect_all_paths(sw->tb); + if (ret) + return ret; +@@ -183,7 +185,16 @@ static int nvm_authenticate_host(struct tb_switch *sw) + * everything goes well so getting timeout is expected. + */ + ret = dma_port_flash_update_auth(sw->dma_port); +- return ret == -ETIMEDOUT ? 0 : ret; ++ if (!ret || ret == -ETIMEDOUT) ++ return 0; ++ ++ /* ++ * Any error from update auth operation requires power ++ * cycling of the host router. ++ */ ++ tb_sw_warn(sw, "failed to authenticate NVM, power cycling\n"); ++ if (dma_port_flash_update_auth_status(sw->dma_port, &status) > 0) ++ nvm_set_auth_status(sw, status); + } + + /* +@@ -191,7 +202,7 @@ static int nvm_authenticate_host(struct tb_switch *sw) + * switch. + */ + dma_port_power_cycle(sw->dma_port); +- return 0; ++ return ret; + } + + static int nvm_authenticate_device(struct tb_switch *sw) +@@ -199,8 +210,16 @@ static int nvm_authenticate_device(struct tb_switch *sw) + int ret, retries = 10; + + ret = dma_port_flash_update_auth(sw->dma_port); +- if (ret && ret != -ETIMEDOUT) ++ switch (ret) { ++ case 0: ++ case -ETIMEDOUT: ++ case -EACCES: ++ case -EINVAL: ++ /* Power cycle is required */ ++ break; ++ default: + return ret; ++ } + + /* + * Poll here for the authentication status. It takes some time +@@ -937,8 +956,6 @@ static ssize_t nvm_authenticate_store(struct device *dev, + */ + nvm_authenticate_start(sw); + ret = nvm_authenticate_host(sw); +- if (ret) +- nvm_authenticate_complete(sw); + } else { + ret = nvm_authenticate_device(sw); + } +@@ -1332,13 +1349,16 @@ static int tb_switch_add_dma_port(struct tb_switch *sw) + int ret; + + switch (sw->generation) { +- case 3: +- break; +- + case 2: + /* Only root switch can be upgraded */ + if (tb_route(sw)) + return 0; ++ ++ /* fallthrough */ ++ case 3: ++ ret = tb_switch_set_uuid(sw); ++ if (ret) ++ return ret; + break; + + default: +@@ -1358,6 +1378,19 @@ static int tb_switch_add_dma_port(struct tb_switch *sw) + if (!sw->dma_port) + return 0; + ++ /* ++ * If there is status already set then authentication failed ++ * when the dma_port_flash_update_auth() returned. Power cycling ++ * is not needed (it was done already) so only thing we do here ++ * is to unblock runtime PM of the root port. ++ */ ++ nvm_get_auth_status(sw, &status); ++ if (status) { ++ if (!tb_route(sw)) ++ nvm_authenticate_complete(sw); ++ return 0; ++ } ++ + /* + * Check status of the previous flash authentication. If there + * is one we need to power cycle the switch in any case to make +@@ -1373,9 +1406,6 @@ static int tb_switch_add_dma_port(struct tb_switch *sw) + + if (status) { + tb_sw_info(sw, "switch flash authentication failed\n"); +- ret = tb_switch_set_uuid(sw); +- if (ret) +- return ret; + nvm_set_auth_status(sw, status); + } + +diff --git a/drivers/tty/serial/8250/8250_core.c b/drivers/tty/serial/8250/8250_core.c +index 8fe3d0ed229e..69aaee5d7fe1 100644 +--- a/drivers/tty/serial/8250/8250_core.c ++++ b/drivers/tty/serial/8250/8250_core.c +@@ -946,6 +946,21 @@ static struct uart_8250_port *serial8250_find_match_or_unused(struct uart_port * + return NULL; + } + ++static void serial_8250_overrun_backoff_work(struct work_struct *work) ++{ ++ struct uart_8250_port *up = ++ container_of(to_delayed_work(work), struct uart_8250_port, ++ overrun_backoff); ++ struct uart_port *port = &up->port; ++ unsigned long flags; ++ ++ spin_lock_irqsave(&port->lock, flags); ++ up->ier |= UART_IER_RLSI | UART_IER_RDI; ++ up->port.read_status_mask |= UART_LSR_DR; ++ serial_out(up, UART_IER, up->ier); ++ spin_unlock_irqrestore(&port->lock, flags); ++} ++ + /** + * serial8250_register_8250_port - register a serial port + * @up: serial port template +@@ -1059,7 +1074,18 @@ int serial8250_register_8250_port(struct uart_8250_port *up) + + ret = 0; + } ++ ++ /* Initialise interrupt backoff work if required */ ++ if (up->overrun_backoff_time_ms > 0) { ++ uart->overrun_backoff_time_ms = ++ up->overrun_backoff_time_ms; ++ INIT_DELAYED_WORK(&uart->overrun_backoff, ++ serial_8250_overrun_backoff_work); ++ } else { ++ uart->overrun_backoff_time_ms = 0; ++ } + } ++ + mutex_unlock(&serial_mutex); + + return ret; +diff --git a/drivers/tty/serial/8250/8250_fsl.c b/drivers/tty/serial/8250/8250_fsl.c +index 6640a4c7ddd1..bb9571eed275 100644 +--- a/drivers/tty/serial/8250/8250_fsl.c ++++ b/drivers/tty/serial/8250/8250_fsl.c +@@ -45,8 +45,29 @@ int fsl8250_handle_irq(struct uart_port *port) + + lsr = orig_lsr = up->port.serial_in(&up->port, UART_LSR); + +- if (lsr & (UART_LSR_DR | UART_LSR_BI)) ++ /* Process incoming characters first */ ++ if ((lsr & (UART_LSR_DR | UART_LSR_BI)) && ++ (up->ier & (UART_IER_RLSI | UART_IER_RDI))) { + lsr = serial8250_rx_chars(up, lsr); ++ } ++ ++ /* Stop processing interrupts on input overrun */ ++ if ((orig_lsr & UART_LSR_OE) && (up->overrun_backoff_time_ms > 0)) { ++ unsigned long delay; ++ ++ up->ier = port->serial_in(port, UART_IER); ++ if (up->ier & (UART_IER_RLSI | UART_IER_RDI)) { ++ port->ops->stop_rx(port); ++ } else { ++ /* Keep restarting the timer until ++ * the input overrun subsides. ++ */ ++ cancel_delayed_work(&up->overrun_backoff); ++ } ++ ++ delay = msecs_to_jiffies(up->overrun_backoff_time_ms); ++ schedule_delayed_work(&up->overrun_backoff, delay); ++ } + + serial8250_modem_status(up); + +diff --git a/drivers/tty/serial/8250/8250_of.c b/drivers/tty/serial/8250/8250_of.c +index 98125de2f0a6..2488de1c4bc4 100644 +--- a/drivers/tty/serial/8250/8250_of.c ++++ b/drivers/tty/serial/8250/8250_of.c +@@ -244,6 +244,11 @@ static int of_platform_serial_probe(struct platform_device *ofdev) + if (of_property_read_bool(ofdev->dev.of_node, "auto-flow-control")) + port8250.capabilities |= UART_CAP_AFE; + ++ if (of_property_read_u32(ofdev->dev.of_node, ++ "overrun-throttle-ms", ++ &port8250.overrun_backoff_time_ms) != 0) ++ port8250.overrun_backoff_time_ms = 0; ++ + ret = serial8250_register_8250_port(&port8250); + if (ret < 0) + goto err_dispose; +diff --git a/drivers/tty/serial/max310x.c b/drivers/tty/serial/max310x.c +index bd3e6cf81af5..0c35c3c5e373 100644 +--- a/drivers/tty/serial/max310x.c ++++ b/drivers/tty/serial/max310x.c +@@ -844,12 +844,9 @@ static void max310x_wq_proc(struct work_struct *ws) + + static unsigned int max310x_tx_empty(struct uart_port *port) + { +- unsigned int lvl, sts; ++ u8 lvl = max310x_port_read(port, MAX310X_TXFIFOLVL_REG); + +- lvl = max310x_port_read(port, MAX310X_TXFIFOLVL_REG); +- sts = max310x_port_read(port, MAX310X_IRQSTS_REG); +- +- return ((sts & MAX310X_IRQ_TXEMPTY_BIT) && !lvl) ? TIOCSER_TEMT : 0; ++ return lvl ? 0 : TIOCSER_TEMT; + } + + static unsigned int max310x_get_mctrl(struct uart_port *port) +diff --git a/drivers/tty/serial/sh-sci.c b/drivers/tty/serial/sh-sci.c +index 5550289e6678..9e1a6af23ca2 100644 +--- a/drivers/tty/serial/sh-sci.c ++++ b/drivers/tty/serial/sh-sci.c +@@ -1359,7 +1359,7 @@ fail: + dmaengine_terminate_async(chan); + for (i = 0; i < 2; i++) + s->cookie_rx[i] = -EINVAL; +- s->active_rx = -EINVAL; ++ s->active_rx = 0; + s->chan_rx = NULL; + sci_start_rx(port); + if (!port_lock_held) +diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c +index 51d83f77dc04..633ba0123efb 100644 +--- a/drivers/usb/dwc2/core.c ++++ b/drivers/usb/dwc2/core.c +@@ -524,7 +524,7 @@ int dwc2_core_reset(struct dwc2_hsotg *hsotg, bool skip_wait) + greset |= GRSTCTL_CSFTRST; + dwc2_writel(hsotg, greset, GRSTCTL); + +- if (dwc2_hsotg_wait_bit_clear(hsotg, GRSTCTL, GRSTCTL_CSFTRST, 50)) { ++ if (dwc2_hsotg_wait_bit_clear(hsotg, GRSTCTL, GRSTCTL_CSFTRST, 10000)) { + dev_warn(hsotg->dev, "%s: HANG! Soft Reset timeout GRSTCTL GRSTCTL_CSFTRST\n", + __func__); + return -EBUSY; +diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c +index 7e4c13346a1e..7d20296cbe9f 100644 +--- a/drivers/usb/host/ehci-omap.c ++++ b/drivers/usb/host/ehci-omap.c +@@ -159,11 +159,12 @@ static int ehci_hcd_omap_probe(struct platform_device *pdev) + /* get the PHY device */ + phy = devm_usb_get_phy_by_phandle(dev, "phys", i); + if (IS_ERR(phy)) { +- /* Don't bail out if PHY is not absolutely necessary */ +- if (pdata->port_mode[i] != OMAP_EHCI_PORT_MODE_PHY) ++ ret = PTR_ERR(phy); ++ if (ret == -ENODEV) { /* no PHY */ ++ phy = NULL; + continue; ++ } + +- ret = PTR_ERR(phy); + if (ret != -EPROBE_DEFER) + dev_err(dev, "Can't get PHY for port %d: %d\n", + i, ret); +diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c +index f06706efb7f1..3c0f38cd3a5a 100644 +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -1023,6 +1023,9 @@ static const struct usb_device_id id_table_combined[] = { + /* Sienna devices */ + { USB_DEVICE(FTDI_VID, FTDI_SIENNA_PID) }, + { USB_DEVICE(ECHELON_VID, ECHELON_U20_PID) }, ++ /* U-Blox devices */ ++ { USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ZED_PID) }, ++ { USB_DEVICE(UBLOX_VID, UBLOX_C099F9P_ODIN_PID) }, + { } /* Terminating entry */ + }; + +diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h +index 22d66217cb41..e8373528264c 100644 +--- a/drivers/usb/serial/ftdi_sio_ids.h ++++ b/drivers/usb/serial/ftdi_sio_ids.h +@@ -1558,3 +1558,10 @@ + */ + #define UNJO_VID 0x22B7 + #define UNJO_ISODEBUG_V1_PID 0x150D ++ ++/* ++ * U-Blox products (http://www.u-blox.com). ++ */ ++#define UBLOX_VID 0x1546 ++#define UBLOX_C099F9P_ZED_PID 0x0502 ++#define UBLOX_C099F9P_ODIN_PID 0x0503 +diff --git a/drivers/vfio/vfio_iommu_spapr_tce.c b/drivers/vfio/vfio_iommu_spapr_tce.c +index 96721b154454..ec53310f1613 100644 +--- a/drivers/vfio/vfio_iommu_spapr_tce.c ++++ b/drivers/vfio/vfio_iommu_spapr_tce.c +@@ -371,6 +371,7 @@ static void tce_iommu_release(void *iommu_data) + { + struct tce_container *container = iommu_data; + struct tce_iommu_group *tcegrp; ++ struct tce_iommu_prereg *tcemem, *tmtmp; + long i; + + while (tce_groups_attached(container)) { +@@ -393,13 +394,8 @@ static void tce_iommu_release(void *iommu_data) + tce_iommu_free_table(container, tbl); + } + +- while (!list_empty(&container->prereg_list)) { +- struct tce_iommu_prereg *tcemem; +- +- tcemem = list_first_entry(&container->prereg_list, +- struct tce_iommu_prereg, next); +- WARN_ON_ONCE(tce_iommu_prereg_free(container, tcemem)); +- } ++ list_for_each_entry_safe(tcemem, tmtmp, &container->prereg_list, next) ++ WARN_ON(tce_iommu_prereg_free(container, tcemem)); + + tce_iommu_disable(container); + if (container->mm) +diff --git a/drivers/watchdog/meson_gxbb_wdt.c b/drivers/watchdog/meson_gxbb_wdt.c +index 69adeab3fde7..0a6672789640 100644 +--- a/drivers/watchdog/meson_gxbb_wdt.c ++++ b/drivers/watchdog/meson_gxbb_wdt.c +@@ -89,8 +89,8 @@ static unsigned int meson_gxbb_wdt_get_timeleft(struct watchdog_device *wdt_dev) + + reg = readl(data->reg_base + GXBB_WDT_TCNT_REG); + +- return ((reg >> GXBB_WDT_TCNT_CNT_SHIFT) - +- (reg & GXBB_WDT_TCNT_SETUP_MASK)) / 1000; ++ return ((reg & GXBB_WDT_TCNT_SETUP_MASK) - ++ (reg >> GXBB_WDT_TCNT_CNT_SHIFT)) / 1000; + } + + static const struct watchdog_ops meson_gxbb_wdt_ops = { +diff --git a/drivers/watchdog/sama5d4_wdt.c b/drivers/watchdog/sama5d4_wdt.c +index 1e93c1b0e3cf..d4953365dd9a 100644 +--- a/drivers/watchdog/sama5d4_wdt.c ++++ b/drivers/watchdog/sama5d4_wdt.c +@@ -111,9 +111,7 @@ static int sama5d4_wdt_set_timeout(struct watchdog_device *wdd, + u32 value = WDT_SEC2TICKS(timeout); + + wdt->mr &= ~AT91_WDT_WDV; +- wdt->mr &= ~AT91_WDT_WDD; + wdt->mr |= AT91_WDT_SET_WDV(value); +- wdt->mr |= AT91_WDT_SET_WDD(value); + + /* + * WDDIS has to be 0 when updating WDD/WDV. The datasheet states: When +@@ -251,7 +249,7 @@ static int sama5d4_wdt_probe(struct platform_device *pdev) + + timeout = WDT_SEC2TICKS(wdd->timeout); + +- wdt->mr |= AT91_WDT_SET_WDD(timeout); ++ wdt->mr |= AT91_WDT_SET_WDD(WDT_SEC2TICKS(MAX_WDT_TIMEOUT)); + wdt->mr |= AT91_WDT_SET_WDV(timeout); + + ret = sama5d4_wdt_init(wdt); +diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c +index 59661db144e5..097410a7cdb7 100644 +--- a/drivers/xen/xen-pciback/pci_stub.c ++++ b/drivers/xen/xen-pciback/pci_stub.c +@@ -106,7 +106,8 @@ static void pcistub_device_release(struct kref *kref) + * is called from "unbind" which takes a device_lock mutex. + */ + __pci_reset_function_locked(dev); +- if (pci_load_and_free_saved_state(dev, &dev_data->pci_saved_state)) ++ if (dev_data && ++ pci_load_and_free_saved_state(dev, &dev_data->pci_saved_state)) + dev_info(&dev->dev, "Could not reload PCI state\n"); + else + pci_restore_state(dev); +diff --git a/fs/btrfs/delayed-ref.c b/fs/btrfs/delayed-ref.c +index 62ff545ba1f7..7e5c81e80e15 100644 +--- a/fs/btrfs/delayed-ref.c ++++ b/fs/btrfs/delayed-ref.c +@@ -234,8 +234,6 @@ static inline void drop_delayed_ref(struct btrfs_trans_handle *trans, + ref->in_tree = 0; + btrfs_put_delayed_ref(ref); + atomic_dec(&delayed_refs->num_entries); +- if (trans->delayed_ref_updates) +- trans->delayed_ref_updates--; + } + + static bool merge_ref(struct btrfs_trans_handle *trans, +@@ -446,7 +444,6 @@ inserted: + if (ref->action == BTRFS_ADD_DELAYED_REF) + list_add_tail(&ref->add_list, &href->ref_add_list); + atomic_inc(&root->num_entries); +- trans->delayed_ref_updates++; + spin_unlock(&href->lock); + return ret; + } +diff --git a/fs/btrfs/dev-replace.c b/fs/btrfs/dev-replace.c +index 23b13fbecdc2..96763805787e 100644 +--- a/fs/btrfs/dev-replace.c ++++ b/fs/btrfs/dev-replace.c +@@ -810,16 +810,23 @@ int btrfs_dev_replace_cancel(struct btrfs_fs_info *fs_info) + btrfs_dev_replace_write_unlock(dev_replace); + break; + case BTRFS_IOCTL_DEV_REPLACE_STATE_STARTED: +- result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR; + tgt_device = dev_replace->tgtdev; + src_device = dev_replace->srcdev; + btrfs_dev_replace_write_unlock(dev_replace); +- btrfs_scrub_cancel(fs_info); +- /* btrfs_dev_replace_finishing() will handle the cleanup part */ +- btrfs_info_in_rcu(fs_info, +- "dev_replace from %s (devid %llu) to %s canceled", +- btrfs_dev_name(src_device), src_device->devid, +- btrfs_dev_name(tgt_device)); ++ ret = btrfs_scrub_cancel(fs_info); ++ if (ret < 0) { ++ result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NOT_STARTED; ++ } else { ++ result = BTRFS_IOCTL_DEV_REPLACE_RESULT_NO_ERROR; ++ /* ++ * btrfs_dev_replace_finishing() will handle the ++ * cleanup part ++ */ ++ btrfs_info_in_rcu(fs_info, ++ "dev_replace from %s (devid %llu) to %s canceled", ++ btrfs_dev_name(src_device), src_device->devid, ++ btrfs_dev_name(tgt_device)); ++ } + break; + case BTRFS_IOCTL_DEV_REPLACE_STATE_SUSPENDED: + /* +diff --git a/fs/btrfs/disk-io.c b/fs/btrfs/disk-io.c +index b2dc613ebed2..96296dc7d2ea 100644 +--- a/fs/btrfs/disk-io.c ++++ b/fs/btrfs/disk-io.c +@@ -4350,6 +4350,8 @@ static int btrfs_destroy_pinned_extent(struct btrfs_fs_info *fs_info, + unpin = pinned_extents; + again: + while (1) { ++ struct extent_state *cached_state = NULL; ++ + /* + * The btrfs_finish_extent_commit() may get the same range as + * ours between find_first_extent_bit and clear_extent_dirty. +@@ -4358,13 +4360,14 @@ again: + */ + mutex_lock(&fs_info->unused_bg_unpin_mutex); + ret = find_first_extent_bit(unpin, 0, &start, &end, +- EXTENT_DIRTY, NULL); ++ EXTENT_DIRTY, &cached_state); + if (ret) { + mutex_unlock(&fs_info->unused_bg_unpin_mutex); + break; + } + +- clear_extent_dirty(unpin, start, end); ++ clear_extent_dirty(unpin, start, end, &cached_state); ++ free_extent_state(cached_state); + btrfs_error_unpin_extent_range(fs_info, start, end); + mutex_unlock(&fs_info->unused_bg_unpin_mutex); + cond_resched(); +diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c +index 024dd336b20a..4bda5c09cdfe 100644 +--- a/fs/btrfs/extent-tree.c ++++ b/fs/btrfs/extent-tree.c +@@ -6618,9 +6618,11 @@ int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans) + unpin = &fs_info->freed_extents[0]; + + while (!trans->aborted) { ++ struct extent_state *cached_state = NULL; ++ + mutex_lock(&fs_info->unused_bg_unpin_mutex); + ret = find_first_extent_bit(unpin, 0, &start, &end, +- EXTENT_DIRTY, NULL); ++ EXTENT_DIRTY, &cached_state); + if (ret) { + mutex_unlock(&fs_info->unused_bg_unpin_mutex); + break; +@@ -6630,9 +6632,10 @@ int btrfs_finish_extent_commit(struct btrfs_trans_handle *trans) + ret = btrfs_discard_extent(fs_info, start, + end + 1 - start, NULL); + +- clear_extent_dirty(unpin, start, end); ++ clear_extent_dirty(unpin, start, end, &cached_state); + unpin_extent_range(fs_info, start, end, true); + mutex_unlock(&fs_info->unused_bg_unpin_mutex); ++ free_extent_state(cached_state); + cond_resched(); + } + +diff --git a/fs/btrfs/extent_io.h b/fs/btrfs/extent_io.h +index ed27becd963c..a3598b24441e 100644 +--- a/fs/btrfs/extent_io.h ++++ b/fs/btrfs/extent_io.h +@@ -348,11 +348,11 @@ static inline int set_extent_dirty(struct extent_io_tree *tree, u64 start, + } + + static inline int clear_extent_dirty(struct extent_io_tree *tree, u64 start, +- u64 end) ++ u64 end, struct extent_state **cached) + { + return clear_extent_bit(tree, start, end, + EXTENT_DIRTY | EXTENT_DELALLOC | +- EXTENT_DO_ACCOUNTING, 0, 0, NULL); ++ EXTENT_DO_ACCOUNTING, 0, 0, cached); + } + + int convert_extent_bit(struct extent_io_tree *tree, u64 start, u64 end, +diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c +index a8297e7489d9..5bbcdcff68a9 100644 +--- a/fs/btrfs/volumes.c ++++ b/fs/btrfs/volumes.c +@@ -96,7 +96,7 @@ const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = { + .devs_min = 2, + .tolerated_failures = 1, + .devs_increment = 1, +- .ncopies = 2, ++ .ncopies = 1, + .raid_name = "raid5", + .bg_flag = BTRFS_BLOCK_GROUP_RAID5, + .mindev_error = BTRFS_ERROR_DEV_RAID5_MIN_NOT_MET, +@@ -108,7 +108,7 @@ const struct btrfs_raid_attr btrfs_raid_array[BTRFS_NR_RAID_TYPES] = { + .devs_min = 3, + .tolerated_failures = 2, + .devs_increment = 1, +- .ncopies = 3, ++ .ncopies = 1, + .raid_name = "raid6", + .bg_flag = BTRFS_BLOCK_GROUP_RAID6, + .mindev_error = BTRFS_ERROR_DEV_RAID6_MIN_NOT_MET, +@@ -6106,12 +6106,6 @@ static noinline void btrfs_schedule_bio(struct btrfs_device *device, + int should_queue = 1; + struct btrfs_pending_bios *pending_bios; + +- if (test_bit(BTRFS_DEV_STATE_MISSING, &device->dev_state) || +- !device->bdev) { +- bio_io_error(bio); +- return; +- } +- + /* don't bother with additional async steps for reads, right now */ + if (bio_op(bio) == REQ_OP_READ) { + btrfsic_submit_bio(bio); +@@ -6240,7 +6234,8 @@ blk_status_t btrfs_map_bio(struct btrfs_fs_info *fs_info, struct bio *bio, + + for (dev_nr = 0; dev_nr < total_devs; dev_nr++) { + dev = bbio->stripes[dev_nr].dev; +- if (!dev || !dev->bdev || ++ if (!dev || !dev->bdev || test_bit(BTRFS_DEV_STATE_MISSING, ++ &dev->dev_state) || + (bio_op(first_bio) == REQ_OP_WRITE && + !test_bit(BTRFS_DEV_STATE_WRITEABLE, &dev->dev_state))) { + bbio_error(bbio, first_bio, logical); +diff --git a/fs/ceph/super.c b/fs/ceph/super.c +index ccab249a37f6..2bd0b1ed9708 100644 +--- a/fs/ceph/super.c ++++ b/fs/ceph/super.c +@@ -248,6 +248,7 @@ static int parse_fsopt_token(char *c, void *private) + return -ENOMEM; + break; + case Opt_fscache_uniq: ++#ifdef CONFIG_CEPH_FSCACHE + kfree(fsopt->fscache_uniq); + fsopt->fscache_uniq = kstrndup(argstr[0].from, + argstr[0].to-argstr[0].from, +@@ -256,7 +257,10 @@ static int parse_fsopt_token(char *c, void *private) + return -ENOMEM; + fsopt->flags |= CEPH_MOUNT_OPT_FSCACHE; + break; +- /* misc */ ++#else ++ pr_err("fscache support is disabled\n"); ++ return -EINVAL; ++#endif + case Opt_wsize: + if (intval < (int)PAGE_SIZE || intval > CEPH_MAX_WRITE_SIZE) + return -EINVAL; +@@ -328,10 +332,15 @@ static int parse_fsopt_token(char *c, void *private) + fsopt->flags &= ~CEPH_MOUNT_OPT_INO32; + break; + case Opt_fscache: ++#ifdef CONFIG_CEPH_FSCACHE + fsopt->flags |= CEPH_MOUNT_OPT_FSCACHE; + kfree(fsopt->fscache_uniq); + fsopt->fscache_uniq = NULL; + break; ++#else ++ pr_err("fscache support is disabled\n"); ++ return -EINVAL; ++#endif + case Opt_nofscache: + fsopt->flags &= ~CEPH_MOUNT_OPT_FSCACHE; + kfree(fsopt->fscache_uniq); +diff --git a/fs/exofs/super.c b/fs/exofs/super.c +index 7d61e3fa378c..8fb98bb94237 100644 +--- a/fs/exofs/super.c ++++ b/fs/exofs/super.c +@@ -705,21 +705,18 @@ out: + /* + * Read the superblock from the OSD and fill in the fields + */ +-static int exofs_fill_super(struct super_block *sb, void *data, int silent) ++static int exofs_fill_super(struct super_block *sb, ++ struct exofs_mountopt *opts, ++ struct exofs_sb_info *sbi, ++ int silent) + { + struct inode *root; +- struct exofs_mountopt *opts = data; +- struct exofs_sb_info *sbi; /*extended info */ + struct osd_dev *od; /* Master device */ + struct exofs_fscb fscb; /*on-disk superblock info */ + struct ore_comp comp; + unsigned table_count; + int ret; + +- sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); +- if (!sbi) +- return -ENOMEM; +- + /* use mount options to fill superblock */ + if (opts->is_osdname) { + struct osd_dev_info odi = {.systemid_len = 0}; +@@ -863,7 +860,9 @@ static struct dentry *exofs_mount(struct file_system_type *type, + int flags, const char *dev_name, + void *data) + { ++ struct super_block *s; + struct exofs_mountopt opts; ++ struct exofs_sb_info *sbi; + int ret; + + ret = parse_options(data, &opts); +@@ -872,9 +871,31 @@ static struct dentry *exofs_mount(struct file_system_type *type, + return ERR_PTR(ret); + } + ++ sbi = kzalloc(sizeof(*sbi), GFP_KERNEL); ++ if (!sbi) { ++ kfree(opts.dev_name); ++ return ERR_PTR(-ENOMEM); ++ } ++ ++ s = sget(type, NULL, set_anon_super, flags, NULL); ++ ++ if (IS_ERR(s)) { ++ kfree(opts.dev_name); ++ kfree(sbi); ++ return ERR_CAST(s); ++ } ++ + if (!opts.dev_name) + opts.dev_name = dev_name; +- return mount_nodev(type, flags, &opts, exofs_fill_super); ++ ++ ++ ret = exofs_fill_super(s, &opts, sbi, flags & SB_SILENT ? 1 : 0); ++ if (ret) { ++ deactivate_locked_super(s); ++ return ERR_PTR(ret); ++ } ++ s->s_flags |= SB_ACTIVE; ++ return dget(s->s_root); + } + + /* +diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c +index a0c94c365a4c..f8a0af11a31e 100644 +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -5904,8 +5904,23 @@ static int __ext4_expand_extra_isize(struct inode *inode, + { + struct ext4_inode *raw_inode; + struct ext4_xattr_ibody_header *header; ++ unsigned int inode_size = EXT4_INODE_SIZE(inode->i_sb); ++ struct ext4_inode_info *ei = EXT4_I(inode); + int error; + ++ /* this was checked at iget time, but double check for good measure */ ++ if ((EXT4_GOOD_OLD_INODE_SIZE + ei->i_extra_isize > inode_size) || ++ (ei->i_extra_isize & 3)) { ++ EXT4_ERROR_INODE(inode, "bad extra_isize %u (inode size %u)", ++ ei->i_extra_isize, ++ EXT4_INODE_SIZE(inode->i_sb)); ++ return -EFSCORRUPTED; ++ } ++ if ((new_extra_isize < ei->i_extra_isize) || ++ (new_extra_isize < 4) || ++ (new_extra_isize > inode_size - EXT4_GOOD_OLD_INODE_SIZE)) ++ return -EINVAL; /* Should never happen */ ++ + raw_inode = ext4_raw_inode(iloc); + + header = IHDR(inode, raw_inode); +diff --git a/fs/ext4/super.c b/fs/ext4/super.c +index a270391228af..1a8d57fe0b1a 100644 +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -3517,12 +3517,15 @@ 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; + +- /* determine the minimum size of new large inodes, if present */ +- if (sbi->s_inode_size > EXT4_GOOD_OLD_INODE_SIZE && +- sbi->s_want_extra_isize == 0) { +- sbi->s_want_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)) +@@ -3535,10 +3538,10 @@ static void ext4_clamp_want_extra_isize(struct super_block *sb) + } + } + /* Check if enough inode space is available */ +- if (EXT4_GOOD_OLD_INODE_SIZE + sbi->s_want_extra_isize > +- sbi->s_inode_size) { +- sbi->s_want_extra_isize = sizeof(struct ext4_inode) - +- EXT4_GOOD_OLD_INODE_SIZE; ++ 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"); + } +diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c +index c7ea12299769..187bf7e260c9 100644 +--- a/fs/f2fs/file.c ++++ b/fs/f2fs/file.c +@@ -1667,7 +1667,7 @@ static int __f2fs_ioc_setflags(struct inode *inode, unsigned int flags) + + inode->i_ctime = current_time(inode); + f2fs_set_inode_flags(inode); +- f2fs_mark_inode_dirty_sync(inode, false); ++ f2fs_mark_inode_dirty_sync(inode, true); + return 0; + } + +diff --git a/fs/f2fs/segment.c b/fs/f2fs/segment.c +index 43a07514c357..a807a8d5e38f 100644 +--- a/fs/f2fs/segment.c ++++ b/fs/f2fs/segment.c +@@ -1103,7 +1103,7 @@ submit: + list_move_tail(&dc->list, wait_list); + + /* sanity check on discard range */ +- __check_sit_bitmap(sbi, start, start + len); ++ __check_sit_bitmap(sbi, lstart, lstart + len); + + bio->bi_private = dc; + bio->bi_end_io = f2fs_submit_discard_endio; +diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c +index 52feccedd7a4..096b47972139 100644 +--- a/fs/gfs2/bmap.c ++++ b/fs/gfs2/bmap.c +@@ -2122,6 +2122,8 @@ static int do_grow(struct inode *inode, u64 size) + } + + error = gfs2_trans_begin(sdp, RES_DINODE + RES_STATFS + RES_RG_BIT + ++ (unstuff && ++ gfs2_is_jdata(ip) ? RES_JDATA : 0) + + (sdp->sd_args.ar_quota == GFS2_QUOTA_OFF ? + 0 : RES_QUOTA), 0); + if (error) +diff --git a/fs/ocfs2/journal.c b/fs/ocfs2/journal.c +index babb0ec76d67..fc1f209e5db0 100644 +--- a/fs/ocfs2/journal.c ++++ b/fs/ocfs2/journal.c +@@ -1018,7 +1018,8 @@ void ocfs2_journal_shutdown(struct ocfs2_super *osb) + mlog_errno(status); + } + +- if (status == 0) { ++ /* Shutdown the kernel journal system */ ++ if (!jbd2_journal_destroy(journal->j_journal) && !status) { + /* + * Do not toggle if flush was unsuccessful otherwise + * will leave dirty metadata in a "clean" journal +@@ -1027,9 +1028,6 @@ void ocfs2_journal_shutdown(struct ocfs2_super *osb) + if (status < 0) + mlog_errno(status); + } +- +- /* Shutdown the kernel journal system */ +- jbd2_journal_destroy(journal->j_journal); + journal->j_journal = NULL; + + OCFS2_I(inode)->ip_open_count--; +diff --git a/fs/ubifs/sb.c b/fs/ubifs/sb.c +index bf17f58908ff..11dc3977fb64 100644 +--- a/fs/ubifs/sb.c ++++ b/fs/ubifs/sb.c +@@ -63,6 +63,17 @@ + /* Default time granularity in nanoseconds */ + #define DEFAULT_TIME_GRAN 1000000000 + ++static int get_default_compressor(struct ubifs_info *c) ++{ ++ if (ubifs_compr_present(c, UBIFS_COMPR_LZO)) ++ return UBIFS_COMPR_LZO; ++ ++ if (ubifs_compr_present(c, UBIFS_COMPR_ZLIB)) ++ return UBIFS_COMPR_ZLIB; ++ ++ return UBIFS_COMPR_NONE; ++} ++ + /** + * create_default_filesystem - format empty UBI volume. + * @c: UBIFS file-system description object +@@ -186,7 +197,7 @@ static int create_default_filesystem(struct ubifs_info *c) + if (c->mount_opts.override_compr) + sup->default_compr = cpu_to_le16(c->mount_opts.compr_type); + else +- sup->default_compr = cpu_to_le16(UBIFS_COMPR_LZO); ++ sup->default_compr = cpu_to_le16(get_default_compressor(c)); + + generate_random_uuid(sup->uuid); + +diff --git a/fs/xfs/libxfs/xfs_symlink_remote.c b/fs/xfs/libxfs/xfs_symlink_remote.c +index 95374ab2dee7..77d80106f989 100644 +--- a/fs/xfs/libxfs/xfs_symlink_remote.c ++++ b/fs/xfs/libxfs/xfs_symlink_remote.c +@@ -199,7 +199,10 @@ xfs_symlink_local_to_remote( + ifp->if_bytes - 1); + } + +-/* Verify the consistency of an inline symlink. */ ++/* ++ * Verify the in-memory consistency of an inline symlink data fork. This ++ * does not do on-disk format checks. ++ */ + xfs_failaddr_t + xfs_symlink_shortform_verify( + struct xfs_inode *ip) +@@ -215,9 +218,12 @@ xfs_symlink_shortform_verify( + size = ifp->if_bytes; + endp = sfp + size; + +- /* Zero length symlinks can exist while we're deleting a remote one. */ +- if (size == 0) +- return NULL; ++ /* ++ * Zero length symlinks should never occur in memory as they are ++ * never alllowed to exist on disk. ++ */ ++ if (!size) ++ return __this_address; + + /* No negative sizes or overly long symlink targets. */ + if (size < 0 || size > XFS_SYMLINK_MAXLEN) +diff --git a/fs/xfs/xfs_buf.c b/fs/xfs/xfs_buf.c +index e36124546d0d..c1f7c0d5d608 100644 +--- a/fs/xfs/xfs_buf.c ++++ b/fs/xfs/xfs_buf.c +@@ -1506,8 +1506,7 @@ __xfs_buf_submit( + xfs_buf_ioerror(bp, -EIO); + bp->b_flags &= ~XBF_DONE; + xfs_buf_stale(bp); +- if (bp->b_flags & XBF_ASYNC) +- xfs_buf_ioend(bp); ++ xfs_buf_ioend(bp); + return -EIO; + } + +diff --git a/fs/xfs/xfs_ioctl32.c b/fs/xfs/xfs_ioctl32.c +index fba115f4103a..b044f7d36782 100644 +--- a/fs/xfs/xfs_ioctl32.c ++++ b/fs/xfs/xfs_ioctl32.c +@@ -241,6 +241,32 @@ xfs_compat_ioc_bulkstat( + int done; + int error; + ++ /* ++ * Output structure handling functions. Depending on the command, ++ * either the xfs_bstat and xfs_inogrp structures are written out ++ * to userpace memory via bulkreq.ubuffer. Normally the compat ++ * functions and structure size are the correct ones to use ... ++ */ ++ inumbers_fmt_pf inumbers_func = xfs_inumbers_fmt_compat; ++ bulkstat_one_pf bs_one_func = xfs_bulkstat_one_compat; ++ size_t bs_one_size = sizeof(struct compat_xfs_bstat); ++ ++#ifdef CONFIG_X86_X32 ++ if (in_x32_syscall()) { ++ /* ++ * ... but on x32 the input xfs_fsop_bulkreq has pointers ++ * which must be handled in the "compat" (32-bit) way, while ++ * the xfs_bstat and xfs_inogrp structures follow native 64- ++ * bit layout convention. So adjust accordingly, otherwise ++ * the data written out in compat layout will not match what ++ * x32 userspace expects. ++ */ ++ inumbers_func = xfs_inumbers_fmt; ++ bs_one_func = xfs_bulkstat_one; ++ bs_one_size = sizeof(struct xfs_bstat); ++ } ++#endif ++ + /* done = 1 if there are more stats to get and if bulkstat */ + /* should be called again (unused here, but used in dmapi) */ + +@@ -272,15 +298,15 @@ xfs_compat_ioc_bulkstat( + + if (cmd == XFS_IOC_FSINUMBERS_32) { + error = xfs_inumbers(mp, &inlast, &count, +- bulkreq.ubuffer, xfs_inumbers_fmt_compat); ++ bulkreq.ubuffer, inumbers_func); + } else if (cmd == XFS_IOC_FSBULKSTAT_SINGLE_32) { + int res; + +- error = xfs_bulkstat_one_compat(mp, inlast, bulkreq.ubuffer, +- sizeof(compat_xfs_bstat_t), NULL, &res); ++ error = bs_one_func(mp, inlast, bulkreq.ubuffer, ++ bs_one_size, NULL, &res); + } else if (cmd == XFS_IOC_FSBULKSTAT_32) { + error = xfs_bulkstat(mp, &inlast, &count, +- xfs_bulkstat_one_compat, sizeof(compat_xfs_bstat_t), ++ bs_one_func, bs_one_size, + bulkreq.ubuffer, &done); + } else + error = -EINVAL; +@@ -336,6 +362,7 @@ xfs_compat_attrlist_by_handle( + { + int error; + attrlist_cursor_kern_t *cursor; ++ compat_xfs_fsop_attrlist_handlereq_t __user *p = arg; + compat_xfs_fsop_attrlist_handlereq_t al_hreq; + struct dentry *dentry; + char *kbuf; +@@ -370,6 +397,11 @@ xfs_compat_attrlist_by_handle( + if (error) + goto out_kfree; + ++ if (copy_to_user(&p->pos, cursor, sizeof(attrlist_cursor_kern_t))) { ++ error = -EFAULT; ++ goto out_kfree; ++ } ++ + if (copy_to_user(compat_ptr(al_hreq.buffer), kbuf, al_hreq.buflen)) + error = -EFAULT; + +diff --git a/fs/xfs/xfs_rtalloc.c b/fs/xfs/xfs_rtalloc.c +index 926ed314ffba..484eb0adcefb 100644 +--- a/fs/xfs/xfs_rtalloc.c ++++ b/fs/xfs/xfs_rtalloc.c +@@ -1198,13 +1198,11 @@ xfs_rtmount_inodes( + xfs_sb_t *sbp; + + sbp = &mp->m_sb; +- if (sbp->sb_rbmino == NULLFSINO) +- return 0; + error = xfs_iget(mp, NULL, sbp->sb_rbmino, 0, 0, &mp->m_rbmip); + if (error) + return error; + ASSERT(mp->m_rbmip != NULL); +- ASSERT(sbp->sb_rsumino != NULLFSINO); ++ + error = xfs_iget(mp, NULL, sbp->sb_rsumino, 0, 0, &mp->m_rsumip); + if (error) { + xfs_irele(mp->m_rbmip); +diff --git a/fs/xfs/xfs_symlink.c b/fs/xfs/xfs_symlink.c +index a3e98c64b6e3..b2c1177c717f 100644 +--- a/fs/xfs/xfs_symlink.c ++++ b/fs/xfs/xfs_symlink.c +@@ -192,6 +192,7 @@ xfs_symlink( + pathlen = strlen(target_path); + if (pathlen >= XFS_SYMLINK_MAXLEN) /* total string too long */ + return -ENAMETOOLONG; ++ ASSERT(pathlen > 0); + + udqp = gdqp = NULL; + prid = xfs_get_initial_prid(dp); +@@ -378,6 +379,12 @@ out_release_inode: + + /* + * Free a symlink that has blocks associated with it. ++ * ++ * Note: zero length symlinks are not allowed to exist. When we set the size to ++ * zero, also change it to a regular file so that it does not get written to ++ * disk as a zero length symlink. The inode is on the unlinked list already, so ++ * userspace cannot find this inode anymore, so this change is not user visible ++ * but allows us to catch corrupt zero-length symlinks in the verifiers. + */ + STATIC int + xfs_inactive_symlink_rmt( +@@ -412,13 +419,14 @@ xfs_inactive_symlink_rmt( + xfs_trans_ijoin(tp, ip, 0); + + /* +- * Lock the inode, fix the size, and join it to the transaction. +- * Hold it so in the normal path, we still have it locked for +- * the second transaction. In the error paths we need it ++ * Lock the inode, fix the size, turn it into a regular file and join it ++ * to the transaction. Hold it so in the normal path, we still have it ++ * locked for the second transaction. In the error paths we need it + * held so the cancel won't rele it, see below. + */ + size = (int)ip->i_d.di_size; + ip->i_d.di_size = 0; ++ VFS_I(ip)->i_mode = (VFS_I(ip)->i_mode & ~S_IFMT) | S_IFREG; + xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); + /* + * Find the block(s) so we can inval and unmap them. +@@ -494,17 +502,10 @@ xfs_inactive_symlink( + return -EIO; + + xfs_ilock(ip, XFS_ILOCK_EXCL); +- +- /* +- * Zero length symlinks _can_ exist. +- */ + pathlen = (int)ip->i_d.di_size; +- if (!pathlen) { +- xfs_iunlock(ip, XFS_ILOCK_EXCL); +- return 0; +- } ++ ASSERT(pathlen); + +- if (pathlen < 0 || pathlen > XFS_SYMLINK_MAXLEN) { ++ if (pathlen <= 0 || pathlen > XFS_SYMLINK_MAXLEN) { + xfs_alert(mp, "%s: inode (0x%llx) bad symlink length (%d)", + __func__, (unsigned long long)ip->i_ino, pathlen); + xfs_iunlock(ip, XFS_ILOCK_EXCL); +@@ -512,12 +513,12 @@ xfs_inactive_symlink( + return -EFSCORRUPTED; + } + ++ /* ++ * Inline fork state gets removed by xfs_difree() so we have nothing to ++ * do here in that case. ++ */ + if (ip->i_df.if_flags & XFS_IFINLINE) { +- if (ip->i_df.if_bytes > 0) +- xfs_idata_realloc(ip, -(ip->i_df.if_bytes), +- XFS_DATA_FORK); + xfs_iunlock(ip, XFS_ILOCK_EXCL); +- ASSERT(ip->i_df.if_bytes == 0); + return 0; + } + +diff --git a/include/linux/blktrace_api.h b/include/linux/blktrace_api.h +index 8804753805ac..7bb2d8de9f30 100644 +--- a/include/linux/blktrace_api.h ++++ b/include/linux/blktrace_api.h +@@ -116,7 +116,13 @@ extern void blk_fill_rwbs(char *rwbs, unsigned int op, int bytes); + + static inline sector_t blk_rq_trace_sector(struct request *rq) + { +- return blk_rq_is_passthrough(rq) ? 0 : blk_rq_pos(rq); ++ /* ++ * Tracing should ignore starting sector for passthrough requests and ++ * requests where starting sector didn't get set. ++ */ ++ if (blk_rq_is_passthrough(rq) || blk_rq_pos(rq) == (sector_t)-1) ++ return 0; ++ return blk_rq_pos(rq); + } + + static inline unsigned int blk_rq_trace_nr_sectors(struct request *rq) +diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h +index 872f930f1b06..dd0a452373e7 100644 +--- a/include/linux/genalloc.h ++++ b/include/linux/genalloc.h +@@ -51,7 +51,8 @@ typedef unsigned long (*genpool_algo_t)(unsigned long *map, + unsigned long size, + unsigned long start, + unsigned int nr, +- void *data, struct gen_pool *pool); ++ void *data, struct gen_pool *pool, ++ unsigned long start_addr); + + /* + * General purpose special memory pool descriptor. +@@ -131,24 +132,24 @@ extern void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo, + + extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size, + unsigned long start, unsigned int nr, void *data, +- struct gen_pool *pool); ++ struct gen_pool *pool, unsigned long start_addr); + + extern unsigned long gen_pool_fixed_alloc(unsigned long *map, + unsigned long size, unsigned long start, unsigned int nr, +- void *data, struct gen_pool *pool); ++ void *data, struct gen_pool *pool, unsigned long start_addr); + + extern unsigned long gen_pool_first_fit_align(unsigned long *map, + unsigned long size, unsigned long start, unsigned int nr, +- void *data, struct gen_pool *pool); ++ void *data, struct gen_pool *pool, unsigned long start_addr); + + + extern unsigned long gen_pool_first_fit_order_align(unsigned long *map, + unsigned long size, unsigned long start, unsigned int nr, +- void *data, struct gen_pool *pool); ++ void *data, struct gen_pool *pool, unsigned long start_addr); + + extern unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size, + unsigned long start, unsigned int nr, void *data, +- struct gen_pool *pool); ++ struct gen_pool *pool, unsigned long start_addr); + + + extern struct gen_pool *devm_gen_pool_create(struct device *dev, +diff --git a/include/linux/gpio/consumer.h b/include/linux/gpio/consumer.h +index 412098b24f58..8dfd8300d9c3 100644 +--- a/include/linux/gpio/consumer.h ++++ b/include/linux/gpio/consumer.h +@@ -475,7 +475,7 @@ static inline int gpiod_set_consumer_name(struct gpio_desc *desc, + + static inline struct gpio_desc *gpio_to_desc(unsigned gpio) + { +- return ERR_PTR(-EINVAL); ++ return NULL; + } + + static inline int desc_to_gpio(const struct gpio_desc *desc) +diff --git a/include/linux/idr.h b/include/linux/idr.h +index 3ec8628ce17f..b6c6151c7446 100644 +--- a/include/linux/idr.h ++++ b/include/linux/idr.h +@@ -185,7 +185,7 @@ static inline void idr_preload_end(void) + * is convenient for a "not found" value. + */ + #define idr_for_each_entry(idr, entry, id) \ +- for (id = 0; ((entry) = idr_get_next(idr, &(id))) != NULL; ++id) ++ for (id = 0; ((entry) = idr_get_next(idr, &(id))) != NULL; id += 1U) + + /** + * idr_for_each_entry_ul() - Iterate over an IDR's elements of a given type. +diff --git a/include/linux/kprobes.h b/include/linux/kprobes.h +index 32cae0f35b9d..9adb92ad24d3 100644 +--- a/include/linux/kprobes.h ++++ b/include/linux/kprobes.h +@@ -243,10 +243,13 @@ extern int arch_init_kprobes(void); + extern void show_registers(struct pt_regs *regs); + extern void kprobes_inc_nmissed_count(struct kprobe *p); + extern bool arch_within_kprobe_blacklist(unsigned long addr); ++extern int arch_populate_kprobe_blacklist(void); + extern bool arch_kprobe_on_func_entry(unsigned long offset); + extern bool kprobe_on_func_entry(kprobe_opcode_t *addr, const char *sym, unsigned long offset); + + extern bool within_kprobe_blacklist(unsigned long addr); ++extern int kprobe_add_ksym_blacklist(unsigned long entry); ++extern int kprobe_add_area_blacklist(unsigned long start, unsigned long end); + + struct kprobe_insn_cache { + struct mutex mutex; +diff --git a/include/linux/memory_hotplug.h b/include/linux/memory_hotplug.h +index 16487052017d..4915e6cd7fd5 100644 +--- a/include/linux/memory_hotplug.h ++++ b/include/linux/memory_hotplug.h +@@ -21,14 +21,16 @@ struct vmem_altmap; + * walkers which rely on the fully initialized page->flags and others + * should use this rather than pfn_valid && pfn_to_page + */ +-#define pfn_to_online_page(pfn) \ +-({ \ +- struct page *___page = NULL; \ +- unsigned long ___nr = pfn_to_section_nr(pfn); \ +- \ +- if (___nr < NR_MEM_SECTIONS && online_section_nr(___nr))\ +- ___page = pfn_to_page(pfn); \ +- ___page; \ ++#define pfn_to_online_page(pfn) \ ++({ \ ++ struct page *___page = NULL; \ ++ unsigned long ___pfn = pfn; \ ++ unsigned long ___nr = pfn_to_section_nr(___pfn); \ ++ \ ++ if (___nr < NR_MEM_SECTIONS && online_section_nr(___nr) && \ ++ pfn_valid_within(___pfn)) \ ++ ___page = pfn_to_page(___pfn); \ ++ ___page; \ + }) + + /* +diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h +index 8c2fec0bcb26..5ada5fd9652d 100644 +--- a/include/linux/netdevice.h ++++ b/include/linux/netdevice.h +@@ -3790,7 +3790,7 @@ static inline u32 netif_msg_init(int debug_value, int default_msg_enable_bits) + if (debug_value == 0) /* no output */ + return 0; + /* set low N bits */ +- return (1 << debug_value) - 1; ++ return (1U << debug_value) - 1; + } + + static inline void __netif_tx_lock(struct netdev_queue *txq, int cpu) +diff --git a/include/linux/reset-controller.h b/include/linux/reset-controller.h +index 9326d671b6e6..8675ec64987b 100644 +--- a/include/linux/reset-controller.h ++++ b/include/linux/reset-controller.h +@@ -7,7 +7,7 @@ + struct reset_controller_dev; + + /** +- * struct reset_control_ops ++ * struct reset_control_ops - reset controller driver callbacks + * + * @reset: for self-deasserting resets, does all necessary + * things to reset the device +diff --git a/include/linux/sched/task.h b/include/linux/sched/task.h +index 108ede99e533..44c6f15800ff 100644 +--- a/include/linux/sched/task.h ++++ b/include/linux/sched/task.h +@@ -39,6 +39,8 @@ void __noreturn do_task_dead(void); + + extern void proc_caches_init(void); + ++extern void fork_init(void); ++ + extern void release_task(struct task_struct * p); + + #ifdef CONFIG_HAVE_COPY_THREAD_TLS +diff --git a/include/linux/serial_8250.h b/include/linux/serial_8250.h +index 18e21427bce4..5a655ba8d273 100644 +--- a/include/linux/serial_8250.h ++++ b/include/linux/serial_8250.h +@@ -134,6 +134,10 @@ struct uart_8250_port { + void (*dl_write)(struct uart_8250_port *, int); + + struct uart_8250_em485 *em485; ++ ++ /* Serial port overrun backoff */ ++ struct delayed_work overrun_backoff; ++ u32 overrun_backoff_time_ms; + }; + + static inline struct uart_8250_port *up_to_u8250p(struct uart_port *up) +diff --git a/include/linux/swap.h b/include/linux/swap.h +index 7bd0a6f2ac2b..ee8f9f554a9e 100644 +--- a/include/linux/swap.h ++++ b/include/linux/swap.h +@@ -371,14 +371,8 @@ extern unsigned long vm_total_pages; + extern int node_reclaim_mode; + extern int sysctl_min_unmapped_ratio; + extern int sysctl_min_slab_ratio; +-extern int node_reclaim(struct pglist_data *, gfp_t, unsigned int); + #else + #define node_reclaim_mode 0 +-static inline int node_reclaim(struct pglist_data *pgdat, gfp_t mask, +- unsigned int order) +-{ +- return 0; +-} + #endif + + extern int page_evictable(struct page *page); +diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h +index 78a010e19ed4..0643c083ed86 100644 +--- a/include/linux/trace_events.h ++++ b/include/linux/trace_events.h +@@ -529,6 +529,8 @@ extern int trace_event_raw_init(struct trace_event_call *call); + extern int trace_define_field(struct trace_event_call *call, const char *type, + const char *name, int offset, int size, + int is_signed, int filter_type); ++extern int trace_add_event_call_nolock(struct trace_event_call *call); ++extern int trace_remove_event_call_nolock(struct trace_event_call *call); + extern int trace_add_event_call(struct trace_event_call *call); + extern int trace_remove_event_call(struct trace_event_call *call); + extern int trace_event_get_offsets(struct trace_event_call *call); +diff --git a/include/net/fq_impl.h b/include/net/fq_impl.h +index 89a012905ef0..4b3e18ff8e6f 100644 +--- a/include/net/fq_impl.h ++++ b/include/net/fq_impl.h +@@ -312,7 +312,7 @@ static int fq_init(struct fq *fq, int flows_cnt) + fq->limit = 8192; + fq->memory_limit = 16 << 20; /* 16 MBytes */ + +- fq->flows = kcalloc(fq->flows_cnt, sizeof(fq->flows[0]), GFP_KERNEL); ++ fq->flows = kvcalloc(fq->flows_cnt, sizeof(fq->flows[0]), GFP_KERNEL); + if (!fq->flows) + return -ENOMEM; + +@@ -330,7 +330,7 @@ static void fq_reset(struct fq *fq, + for (i = 0; i < fq->flows_cnt; i++) + fq_flow_reset(fq, &fq->flows[i], free_func); + +- kfree(fq->flows); ++ kvfree(fq->flows); + fq->flows = NULL; + } + +diff --git a/include/net/sctp/structs.h b/include/net/sctp/structs.h +index feada358d872..19f8d5881b08 100644 +--- a/include/net/sctp/structs.h ++++ b/include/net/sctp/structs.h +@@ -1247,6 +1247,9 @@ struct sctp_ep_common { + /* What socket does this endpoint belong to? */ + struct sock *sk; + ++ /* Cache netns and it won't change once set */ ++ struct net *net; ++ + /* This is where we receive inbound chunks. */ + struct sctp_inq inqueue; + +diff --git a/include/net/sock.h b/include/net/sock.h +index 0252c0d00310..4545a9ecc219 100644 +--- a/include/net/sock.h ++++ b/include/net/sock.h +@@ -1272,7 +1272,7 @@ static inline void sk_sockets_allocated_inc(struct sock *sk) + percpu_counter_inc(sk->sk_prot->sockets_allocated); + } + +-static inline int ++static inline u64 + sk_sockets_allocated_read_positive(struct sock *sk) + { + return percpu_counter_read_positive(sk->sk_prot->sockets_allocated); +diff --git a/include/trace/events/rpcrdma.h b/include/trace/events/rpcrdma.h +index 53df203b8057..4c91cadd1871 100644 +--- a/include/trace/events/rpcrdma.h ++++ b/include/trace/events/rpcrdma.h +@@ -917,6 +917,34 @@ TRACE_EVENT(xprtrdma_cb_setup, + DEFINE_CB_EVENT(xprtrdma_cb_call); + DEFINE_CB_EVENT(xprtrdma_cb_reply); + ++TRACE_EVENT(xprtrdma_leaked_rep, ++ TP_PROTO( ++ const struct rpc_rqst *rqst, ++ const struct rpcrdma_rep *rep ++ ), ++ ++ TP_ARGS(rqst, rep), ++ ++ TP_STRUCT__entry( ++ __field(unsigned int, task_id) ++ __field(unsigned int, client_id) ++ __field(u32, xid) ++ __field(const void *, rep) ++ ), ++ ++ TP_fast_assign( ++ __entry->task_id = rqst->rq_task->tk_pid; ++ __entry->client_id = rqst->rq_task->tk_client->cl_clid; ++ __entry->xid = be32_to_cpu(rqst->rq_xid); ++ __entry->rep = rep; ++ ), ++ ++ TP_printk("task:%u@%u xid=0x%08x rep=%p", ++ __entry->task_id, __entry->client_id, __entry->xid, ++ __entry->rep ++ ) ++); ++ + /** + ** Server-side RPC/RDMA events + **/ +diff --git a/init/main.c b/init/main.c +index 020972fed117..38a603f62b7b 100644 +--- a/init/main.c ++++ b/init/main.c +@@ -105,7 +105,6 @@ + static int kernel_init(void *); + + extern void init_IRQ(void); +-extern void fork_init(void); + extern void radix_tree_init(void); + + /* +diff --git a/kernel/bpf/cpumap.c b/kernel/bpf/cpumap.c +index 24aac0d0f412..3c18260403dd 100644 +--- a/kernel/bpf/cpumap.c ++++ b/kernel/bpf/cpumap.c +@@ -162,10 +162,14 @@ static void cpu_map_kthread_stop(struct work_struct *work) + static struct sk_buff *cpu_map_build_skb(struct bpf_cpu_map_entry *rcpu, + struct xdp_frame *xdpf) + { ++ unsigned int hard_start_headroom; + unsigned int frame_size; + void *pkt_data_start; + struct sk_buff *skb; + ++ /* Part of headroom was reserved to xdpf */ ++ hard_start_headroom = sizeof(struct xdp_frame) + xdpf->headroom; ++ + /* build_skb need to place skb_shared_info after SKB end, and + * also want to know the memory "truesize". Thus, need to + * know the memory frame size backing xdp_buff. +@@ -183,15 +187,15 @@ static struct sk_buff *cpu_map_build_skb(struct bpf_cpu_map_entry *rcpu, + * is not at a fixed memory location, with mixed length + * packets, which is bad for cache-line hotness. + */ +- frame_size = SKB_DATA_ALIGN(xdpf->len) + xdpf->headroom + ++ frame_size = SKB_DATA_ALIGN(xdpf->len + hard_start_headroom) + + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)); + +- pkt_data_start = xdpf->data - xdpf->headroom; ++ pkt_data_start = xdpf->data - hard_start_headroom; + skb = build_skb(pkt_data_start, frame_size); + if (!skb) + return NULL; + +- skb_reserve(skb, xdpf->headroom); ++ skb_reserve(skb, hard_start_headroom); + __skb_put(skb, xdpf->len); + if (xdpf->metasize) + skb_metadata_set(skb, xdpf->metasize); +@@ -205,6 +209,9 @@ static struct sk_buff *cpu_map_build_skb(struct bpf_cpu_map_entry *rcpu, + * - RX ring dev queue index (skb_record_rx_queue) + */ + ++ /* Allow SKB to reuse area used by xdp_frame */ ++ xdp_scrub_frame(xdpf); ++ + return skb; + } + +diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c +index 6e544e364821..596959288eb9 100644 +--- a/kernel/bpf/syscall.c ++++ b/kernel/bpf/syscall.c +@@ -559,12 +559,12 @@ static int map_create(union bpf_attr *attr) + err = bpf_map_new_fd(map, f_flags); + if (err < 0) { + /* failed to allocate fd. +- * bpf_map_put() is needed because the above ++ * bpf_map_put_with_uref() is needed because the above + * bpf_map_alloc_id() has published the map + * to the userspace and the userspace may + * have refcnt-ed it through BPF_MAP_GET_FD_BY_ID. + */ +- bpf_map_put(map); ++ bpf_map_put_with_uref(map); + return err; + } + +@@ -1887,7 +1887,7 @@ static int bpf_map_get_fd_by_id(const union bpf_attr *attr) + + fd = bpf_map_new_fd(map, f_flags); + if (fd < 0) +- bpf_map_put(map); ++ bpf_map_put_with_uref(map); + + return fd; + } +diff --git a/kernel/fork.c b/kernel/fork.c +index aef1430bdce0..8cb5cd7c97e1 100644 +--- a/kernel/fork.c ++++ b/kernel/fork.c +@@ -163,10 +163,6 @@ static inline void free_task_struct(struct task_struct *tsk) + } + #endif + +-void __weak arch_release_thread_stack(unsigned long *stack) +-{ +-} +- + #ifndef CONFIG_ARCH_THREAD_STACK_ALLOCATOR + + /* +@@ -376,7 +372,6 @@ static void release_task_stack(struct task_struct *tsk) + return; /* Better to leak the stack than to free prematurely */ + + account_kernel_stack(tsk, -1); +- arch_release_thread_stack(tsk->stack); + free_thread_stack(tsk); + tsk->stack = NULL; + #ifdef CONFIG_VMAP_STACK +diff --git a/kernel/kprobes.c b/kernel/kprobes.c +index aed90788db5c..f4e4095ec7ea 100644 +--- a/kernel/kprobes.c ++++ b/kernel/kprobes.c +@@ -2096,6 +2096,47 @@ void dump_kprobe(struct kprobe *kp) + } + NOKPROBE_SYMBOL(dump_kprobe); + ++int kprobe_add_ksym_blacklist(unsigned long entry) ++{ ++ struct kprobe_blacklist_entry *ent; ++ unsigned long offset = 0, size = 0; ++ ++ if (!kernel_text_address(entry) || ++ !kallsyms_lookup_size_offset(entry, &size, &offset)) ++ return -EINVAL; ++ ++ ent = kmalloc(sizeof(*ent), GFP_KERNEL); ++ if (!ent) ++ return -ENOMEM; ++ ent->start_addr = entry; ++ ent->end_addr = entry + size; ++ INIT_LIST_HEAD(&ent->list); ++ list_add_tail(&ent->list, &kprobe_blacklist); ++ ++ return (int)size; ++} ++ ++/* Add all symbols in given area into kprobe blacklist */ ++int kprobe_add_area_blacklist(unsigned long start, unsigned long end) ++{ ++ unsigned long entry; ++ int ret = 0; ++ ++ for (entry = start; entry < end; entry += ret) { ++ ret = kprobe_add_ksym_blacklist(entry); ++ if (ret < 0) ++ return ret; ++ if (ret == 0) /* In case of alias symbol */ ++ ret = 1; ++ } ++ return 0; ++} ++ ++int __init __weak arch_populate_kprobe_blacklist(void) ++{ ++ return 0; ++} ++ + /* + * Lookup and populate the kprobe_blacklist. + * +@@ -2107,26 +2148,24 @@ NOKPROBE_SYMBOL(dump_kprobe); + static int __init populate_kprobe_blacklist(unsigned long *start, + unsigned long *end) + { ++ unsigned long entry; + unsigned long *iter; +- struct kprobe_blacklist_entry *ent; +- unsigned long entry, offset = 0, size = 0; ++ int ret; + + for (iter = start; iter < end; iter++) { + entry = arch_deref_entry_point((void *)*iter); +- +- if (!kernel_text_address(entry) || +- !kallsyms_lookup_size_offset(entry, &size, &offset)) ++ ret = kprobe_add_ksym_blacklist(entry); ++ if (ret == -EINVAL) + continue; +- +- ent = kmalloc(sizeof(*ent), GFP_KERNEL); +- if (!ent) +- return -ENOMEM; +- ent->start_addr = entry; +- ent->end_addr = entry + size; +- INIT_LIST_HEAD(&ent->list); +- list_add_tail(&ent->list, &kprobe_blacklist); ++ if (ret < 0) ++ return ret; + } +- return 0; ++ ++ /* Symbols in __kprobes_text are blacklisted */ ++ ret = kprobe_add_area_blacklist((unsigned long)__kprobes_text_start, ++ (unsigned long)__kprobes_text_end); ++ ++ return ret ? : arch_populate_kprobe_blacklist(); + } + + /* Module notifier call back, checking kprobes on the module */ +diff --git a/kernel/trace/trace_events.c b/kernel/trace/trace_events.c +index 7345f5f8f3fe..017f737237e6 100644 +--- a/kernel/trace/trace_events.c ++++ b/kernel/trace/trace_events.c +@@ -2302,11 +2302,11 @@ __trace_early_add_new_event(struct trace_event_call *call, + struct ftrace_module_file_ops; + static void __add_event_to_tracers(struct trace_event_call *call); + +-/* Add an additional event_call dynamically */ +-int trace_add_event_call(struct trace_event_call *call) ++int trace_add_event_call_nolock(struct trace_event_call *call) + { + int ret; +- mutex_lock(&event_mutex); ++ lockdep_assert_held(&event_mutex); ++ + mutex_lock(&trace_types_lock); + + ret = __register_event(call, NULL); +@@ -2314,6 +2314,16 @@ int trace_add_event_call(struct trace_event_call *call) + __add_event_to_tracers(call); + + mutex_unlock(&trace_types_lock); ++ return ret; ++} ++ ++/* Add an additional event_call dynamically */ ++int trace_add_event_call(struct trace_event_call *call) ++{ ++ int ret; ++ ++ mutex_lock(&event_mutex); ++ ret = trace_add_event_call_nolock(call); + mutex_unlock(&event_mutex); + return ret; + } +@@ -2363,17 +2373,29 @@ static int probe_remove_event_call(struct trace_event_call *call) + return 0; + } + +-/* Remove an event_call */ +-int trace_remove_event_call(struct trace_event_call *call) ++/* no event_mutex version */ ++int trace_remove_event_call_nolock(struct trace_event_call *call) + { + int ret; + +- mutex_lock(&event_mutex); ++ lockdep_assert_held(&event_mutex); ++ + mutex_lock(&trace_types_lock); + down_write(&trace_event_sem); + ret = probe_remove_event_call(call); + up_write(&trace_event_sem); + mutex_unlock(&trace_types_lock); ++ ++ return ret; ++} ++ ++/* Remove an event_call */ ++int trace_remove_event_call(struct trace_event_call *call) ++{ ++ int ret; ++ ++ mutex_lock(&event_mutex); ++ ret = trace_remove_event_call_nolock(call); + mutex_unlock(&event_mutex); + + return ret; +diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c +index dac518977e7d..11d952650fa7 100644 +--- a/kernel/trace/trace_events_hist.c ++++ b/kernel/trace/trace_events_hist.c +@@ -914,7 +914,7 @@ static int register_synth_event(struct synth_event *event) + call->data = event; + call->tp = event->tp; + +- ret = trace_add_event_call(call); ++ ret = trace_add_event_call_nolock(call); + if (ret) { + pr_warn("Failed to register synthetic event: %s\n", + trace_event_name(call)); +@@ -938,7 +938,7 @@ static int unregister_synth_event(struct synth_event *event) + struct trace_event_call *call = &event->call; + int ret; + +- ret = trace_remove_event_call(call); ++ ret = trace_remove_event_call_nolock(call); + + return ret; + } +@@ -1015,12 +1015,10 @@ static void add_or_delete_synth_event(struct synth_event *event, int delete) + if (delete) + free_synth_event(event); + else { +- mutex_lock(&synth_event_mutex); + if (!find_synth_event(event->name)) + list_add(&event->list, &synth_event_list); + else + free_synth_event(event); +- mutex_unlock(&synth_event_mutex); + } + } + +@@ -1032,6 +1030,7 @@ static int create_synth_event(int argc, char **argv) + int i, consumed = 0, n_fields = 0, ret = 0; + char *name; + ++ mutex_lock(&event_mutex); + mutex_lock(&synth_event_mutex); + + /* +@@ -1104,8 +1103,6 @@ static int create_synth_event(int argc, char **argv) + goto err; + } + out: +- mutex_unlock(&synth_event_mutex); +- + if (event) { + if (delete_event) { + ret = unregister_synth_event(event); +@@ -1115,10 +1112,13 @@ static int create_synth_event(int argc, char **argv) + add_or_delete_synth_event(event, ret); + } + } ++ mutex_unlock(&synth_event_mutex); ++ mutex_unlock(&event_mutex); + + return ret; + err: + mutex_unlock(&synth_event_mutex); ++ mutex_unlock(&event_mutex); + + for (i = 0; i < n_fields; i++) + free_synth_field(fields[i]); +@@ -1129,12 +1129,10 @@ static int create_synth_event(int argc, char **argv) + + static int release_all_synth_events(void) + { +- struct list_head release_events; + struct synth_event *event, *e; + int ret = 0; + +- INIT_LIST_HEAD(&release_events); +- ++ mutex_lock(&event_mutex); + mutex_lock(&synth_event_mutex); + + list_for_each_entry(event, &synth_event_list, list) { +@@ -1144,16 +1142,14 @@ static int release_all_synth_events(void) + } + } + +- list_splice_init(&event->list, &release_events); +- +- mutex_unlock(&synth_event_mutex); +- +- list_for_each_entry_safe(event, e, &release_events, list) { ++ list_for_each_entry_safe(event, e, &synth_event_list, list) { + list_del(&event->list); + + ret = unregister_synth_event(event); + add_or_delete_synth_event(event, !ret); + } ++ mutex_unlock(&synth_event_mutex); ++ mutex_unlock(&event_mutex); + + return ret; + } +diff --git a/lib/genalloc.c b/lib/genalloc.c +index ca06adc4f445..7e85d1e37a6e 100644 +--- a/lib/genalloc.c ++++ b/lib/genalloc.c +@@ -35,6 +35,7 @@ + #include <linux/interrupt.h> + #include <linux/genalloc.h> + #include <linux/of_device.h> ++#include <linux/vmalloc.h> + + static inline size_t chunk_size(const struct gen_pool_chunk *chunk) + { +@@ -187,7 +188,7 @@ int gen_pool_add_virt(struct gen_pool *pool, unsigned long virt, phys_addr_t phy + int nbytes = sizeof(struct gen_pool_chunk) + + BITS_TO_LONGS(nbits) * sizeof(long); + +- chunk = kzalloc_node(nbytes, GFP_KERNEL, nid); ++ chunk = vzalloc_node(nbytes, nid); + if (unlikely(chunk == NULL)) + return -ENOMEM; + +@@ -251,7 +252,7 @@ void gen_pool_destroy(struct gen_pool *pool) + bit = find_next_bit(chunk->bits, end_bit, 0); + BUG_ON(bit < end_bit); + +- kfree(chunk); ++ vfree(chunk); + } + kfree_const(pool->name); + kfree(pool); +@@ -311,7 +312,7 @@ unsigned long gen_pool_alloc_algo(struct gen_pool *pool, size_t size, + end_bit = chunk_size(chunk) >> order; + retry: + start_bit = algo(chunk->bits, end_bit, start_bit, +- nbits, data, pool); ++ nbits, data, pool, chunk->start_addr); + if (start_bit >= end_bit) + continue; + remain = bitmap_set_ll(chunk->bits, start_bit, nbits); +@@ -525,7 +526,7 @@ EXPORT_SYMBOL(gen_pool_set_algo); + */ + unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size, + unsigned long start, unsigned int nr, void *data, +- struct gen_pool *pool) ++ struct gen_pool *pool, unsigned long start_addr) + { + return bitmap_find_next_zero_area(map, size, start, nr, 0); + } +@@ -543,16 +544,19 @@ EXPORT_SYMBOL(gen_pool_first_fit); + */ + unsigned long gen_pool_first_fit_align(unsigned long *map, unsigned long size, + unsigned long start, unsigned int nr, void *data, +- struct gen_pool *pool) ++ struct gen_pool *pool, unsigned long start_addr) + { + struct genpool_data_align *alignment; +- unsigned long align_mask; ++ unsigned long align_mask, align_off; + int order; + + alignment = data; + order = pool->min_alloc_order; + align_mask = ((alignment->align + (1UL << order) - 1) >> order) - 1; +- return bitmap_find_next_zero_area(map, size, start, nr, align_mask); ++ align_off = (start_addr & (alignment->align - 1)) >> order; ++ ++ return bitmap_find_next_zero_area_off(map, size, start, nr, ++ align_mask, align_off); + } + EXPORT_SYMBOL(gen_pool_first_fit_align); + +@@ -567,7 +571,7 @@ EXPORT_SYMBOL(gen_pool_first_fit_align); + */ + unsigned long gen_pool_fixed_alloc(unsigned long *map, unsigned long size, + unsigned long start, unsigned int nr, void *data, +- struct gen_pool *pool) ++ struct gen_pool *pool, unsigned long start_addr) + { + struct genpool_data_fixed *fixed_data; + int order; +@@ -601,7 +605,8 @@ EXPORT_SYMBOL(gen_pool_fixed_alloc); + */ + unsigned long gen_pool_first_fit_order_align(unsigned long *map, + unsigned long size, unsigned long start, +- unsigned int nr, void *data, struct gen_pool *pool) ++ unsigned int nr, void *data, struct gen_pool *pool, ++ unsigned long start_addr) + { + unsigned long align_mask = roundup_pow_of_two(nr) - 1; + +@@ -624,7 +629,7 @@ EXPORT_SYMBOL(gen_pool_first_fit_order_align); + */ + unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size, + unsigned long start, unsigned int nr, void *data, +- struct gen_pool *pool) ++ struct gen_pool *pool, unsigned long start_addr) + { + unsigned long start_bit = size; + unsigned long len = size + 1; +diff --git a/lib/radix-tree.c b/lib/radix-tree.c +index bc03ecc4dfd2..e5cab5c4e383 100644 +--- a/lib/radix-tree.c ++++ b/lib/radix-tree.c +@@ -2172,7 +2172,7 @@ void __rcu **idr_get_free(struct radix_tree_root *root, + offset = radix_tree_find_next_bit(node, IDR_FREE, + offset + 1); + start = next_index(start, node, offset); +- if (start > max) ++ if (start > max || start == 0) + return ERR_PTR(-ENOSPC); + while (offset == RADIX_TREE_MAP_SIZE) { + offset = node->offset + 1; +diff --git a/mm/internal.h b/mm/internal.h +index 87256ae1bef8..397183c8fe47 100644 +--- a/mm/internal.h ++++ b/mm/internal.h +@@ -444,6 +444,16 @@ static inline void mminit_validate_memmodel_limits(unsigned long *start_pfn, + #define NODE_RECLAIM_SOME 0 + #define NODE_RECLAIM_SUCCESS 1 + ++#ifdef CONFIG_NUMA ++extern int node_reclaim(struct pglist_data *, gfp_t, unsigned int); ++#else ++static inline int node_reclaim(struct pglist_data *pgdat, gfp_t mask, ++ unsigned int order) ++{ ++ return NODE_RECLAIM_NOSCAN; ++} ++#endif ++ + extern int hwpoison_filter(struct page *p); + + extern u32 hwpoison_filter_dev_major; +diff --git a/mm/memblock.c b/mm/memblock.c +index 237944479d25..bb4e32c6b19e 100644 +--- a/mm/memblock.c ++++ b/mm/memblock.c +@@ -1537,12 +1537,7 @@ void * __init memblock_virt_alloc_try_nid( + */ + void __init __memblock_free_early(phys_addr_t base, phys_addr_t size) + { +- phys_addr_t end = base + size - 1; +- +- memblock_dbg("%s: [%pa-%pa] %pF\n", +- __func__, &base, &end, (void *)_RET_IP_); +- kmemleak_free_part_phys(base, size); +- memblock_remove_range(&memblock.reserved, base, size); ++ memblock_free(base, size); + } + + /** +diff --git a/mm/page_alloc.c b/mm/page_alloc.c +index b34348a41bfe..74fb5c338e8f 100644 +--- a/mm/page_alloc.c ++++ b/mm/page_alloc.c +@@ -4451,16 +4451,19 @@ unsigned long get_zeroed_page(gfp_t gfp_mask) + } + EXPORT_SYMBOL(get_zeroed_page); + +-void __free_pages(struct page *page, unsigned int order) ++static inline void free_the_page(struct page *page, unsigned int order) + { +- if (put_page_testzero(page)) { +- if (order == 0) +- free_unref_page(page); +- else +- __free_pages_ok(page, order); +- } ++ if (order == 0) /* Via pcp? */ ++ free_unref_page(page); ++ else ++ __free_pages_ok(page, order); + } + ++void __free_pages(struct page *page, unsigned int order) ++{ ++ if (put_page_testzero(page)) ++ free_the_page(page, order); ++} + EXPORT_SYMBOL(__free_pages); + + void free_pages(unsigned long addr, unsigned int order) +@@ -4509,14 +4512,8 @@ void __page_frag_cache_drain(struct page *page, unsigned int count) + { + VM_BUG_ON_PAGE(page_ref_count(page) == 0, page); + +- if (page_ref_sub_and_test(page, count)) { +- unsigned int order = compound_order(page); +- +- if (order == 0) +- free_unref_page(page); +- else +- __free_pages_ok(page, order); +- } ++ if (page_ref_sub_and_test(page, count)) ++ free_the_page(page, compound_order(page)); + } + EXPORT_SYMBOL(__page_frag_cache_drain); + +@@ -4582,7 +4579,7 @@ void page_frag_free(void *addr) + struct page *page = virt_to_head_page(addr); + + if (unlikely(put_page_testzero(page))) +- __free_pages_ok(page, compound_order(page)); ++ free_the_page(page, compound_order(page)); + } + EXPORT_SYMBOL(page_frag_free); + +diff --git a/net/bridge/netfilter/ebt_dnat.c b/net/bridge/netfilter/ebt_dnat.c +index dfc86a0199da..1d8c834d9018 100644 +--- a/net/bridge/netfilter/ebt_dnat.c ++++ b/net/bridge/netfilter/ebt_dnat.c +@@ -19,7 +19,6 @@ static unsigned int + ebt_dnat_tg(struct sk_buff *skb, const struct xt_action_param *par) + { + const struct ebt_nat_info *info = par->targinfo; +- struct net_device *dev; + + if (!skb_make_writable(skb, 0)) + return EBT_DROP; +@@ -32,10 +31,22 @@ ebt_dnat_tg(struct sk_buff *skb, const struct xt_action_param *par) + else + skb->pkt_type = PACKET_MULTICAST; + } else { +- if (xt_hooknum(par) != NF_BR_BROUTING) +- dev = br_port_get_rcu(xt_in(par))->br->dev; +- else ++ const struct net_device *dev; ++ ++ switch (xt_hooknum(par)) { ++ case NF_BR_BROUTING: + dev = xt_in(par); ++ break; ++ case NF_BR_PRE_ROUTING: ++ dev = br_port_get_rcu(xt_in(par))->br->dev; ++ break; ++ default: ++ dev = NULL; ++ break; ++ } ++ ++ if (!dev) /* NF_BR_LOCAL_OUT */ ++ return info->target; + + if (ether_addr_equal(info->mac, dev->dev_addr)) + skb->pkt_type = PACKET_HOST; +diff --git a/net/core/neighbour.c b/net/core/neighbour.c +index c52d6e6b341c..7597afee7068 100644 +--- a/net/core/neighbour.c ++++ b/net/core/neighbour.c +@@ -18,6 +18,7 @@ + #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt + + #include <linux/slab.h> ++#include <linux/kmemleak.h> + #include <linux/types.h> + #include <linux/kernel.h> + #include <linux/module.h> +@@ -363,12 +364,14 @@ static struct neigh_hash_table *neigh_hash_alloc(unsigned int shift) + ret = kmalloc(sizeof(*ret), GFP_ATOMIC); + if (!ret) + return NULL; +- if (size <= PAGE_SIZE) ++ if (size <= PAGE_SIZE) { + buckets = kzalloc(size, GFP_ATOMIC); +- else ++ } else { + buckets = (struct neighbour __rcu **) + __get_free_pages(GFP_ATOMIC | __GFP_ZERO, + get_order(size)); ++ kmemleak_alloc(buckets, size, 1, GFP_ATOMIC); ++ } + if (!buckets) { + kfree(ret); + return NULL; +@@ -388,10 +391,12 @@ static void neigh_hash_free_rcu(struct rcu_head *head) + size_t size = (1 << nht->hash_shift) * sizeof(struct neighbour *); + struct neighbour __rcu **buckets = nht->hash_buckets; + +- if (size <= PAGE_SIZE) ++ if (size <= PAGE_SIZE) { + kfree(buckets); +- else ++ } else { ++ kmemleak_free(buckets); + free_pages((unsigned long)buckets, get_order(size)); ++ } + kfree(nht); + } + +diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c +index 6dab186d4b8f..c60123dff803 100644 +--- a/net/core/net_namespace.c ++++ b/net/core/net_namespace.c +@@ -913,7 +913,8 @@ static int __init net_ns_init(void) + init_net_initialized = true; + up_write(&pernet_ops_rwsem); + +- register_pernet_subsys(&net_ns_ops); ++ if (register_pernet_subsys(&net_ns_ops)) ++ panic("Could not register network namespace subsystems"); + + rtnl_register(PF_UNSPEC, RTM_NEWNSID, rtnl_net_newid, NULL, + RTNL_FLAG_DOIT_UNLOCKED); +diff --git a/net/core/sock.c b/net/core/sock.c +index ba4f843cdd1d..bbde5f6a7dc9 100644 +--- a/net/core/sock.c ++++ b/net/core/sock.c +@@ -2435,7 +2435,7 @@ int __sk_mem_raise_allocated(struct sock *sk, int size, int amt, int kind) + } + + if (sk_has_memory_pressure(sk)) { +- int alloc; ++ u64 alloc; + + if (!sk_under_memory_pressure(sk)) + return 1; +diff --git a/net/decnet/dn_dev.c b/net/decnet/dn_dev.c +index bfd43e8f2c06..3235540f6adf 100644 +--- a/net/decnet/dn_dev.c ++++ b/net/decnet/dn_dev.c +@@ -56,7 +56,7 @@ + #include <net/dn_neigh.h> + #include <net/dn_fib.h> + +-#define DN_IFREQ_SIZE (sizeof(struct ifreq) - sizeof(struct sockaddr) + sizeof(struct sockaddr_dn)) ++#define DN_IFREQ_SIZE (offsetof(struct ifreq, ifr_ifru) + sizeof(struct sockaddr_dn)) + + static char dn_rt_all_end_mcast[ETH_ALEN] = {0xAB,0x00,0x00,0x04,0x00,0x00}; + static char dn_rt_all_rt_mcast[ETH_ALEN] = {0xAB,0x00,0x00,0x03,0x00,0x00}; +diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c +index 681276111310..a3f77441f3e6 100644 +--- a/net/ipv4/ip_gre.c ++++ b/net/ipv4/ip_gre.c +@@ -1466,9 +1466,23 @@ static int ipgre_fill_info(struct sk_buff *skb, const struct net_device *dev) + struct ip_tunnel_parm *p = &t->parms; + __be16 o_flags = p->o_flags; + +- if ((t->erspan_ver == 1 || t->erspan_ver == 2) && +- !t->collect_md) +- o_flags |= TUNNEL_KEY; ++ if (t->erspan_ver == 1 || t->erspan_ver == 2) { ++ if (!t->collect_md) ++ o_flags |= TUNNEL_KEY; ++ ++ if (nla_put_u8(skb, IFLA_GRE_ERSPAN_VER, t->erspan_ver)) ++ goto nla_put_failure; ++ ++ if (t->erspan_ver == 1) { ++ if (nla_put_u32(skb, IFLA_GRE_ERSPAN_INDEX, t->index)) ++ goto nla_put_failure; ++ } else { ++ if (nla_put_u8(skb, IFLA_GRE_ERSPAN_DIR, t->dir)) ++ goto nla_put_failure; ++ if (nla_put_u16(skb, IFLA_GRE_ERSPAN_HWID, t->hwid)) ++ goto nla_put_failure; ++ } ++ } + + if (nla_put_u32(skb, IFLA_GRE_LINK, p->link) || + nla_put_be16(skb, IFLA_GRE_IFLAGS, +@@ -1504,19 +1518,6 @@ static int ipgre_fill_info(struct sk_buff *skb, const struct net_device *dev) + goto nla_put_failure; + } + +- if (nla_put_u8(skb, IFLA_GRE_ERSPAN_VER, t->erspan_ver)) +- goto nla_put_failure; +- +- if (t->erspan_ver == 1) { +- if (nla_put_u32(skb, IFLA_GRE_ERSPAN_INDEX, t->index)) +- goto nla_put_failure; +- } else if (t->erspan_ver == 2) { +- if (nla_put_u8(skb, IFLA_GRE_ERSPAN_DIR, t->dir)) +- goto nla_put_failure; +- if (nla_put_u16(skb, IFLA_GRE_ERSPAN_HWID, t->hwid)) +- goto nla_put_failure; +- } +- + return 0; + + nla_put_failure: +diff --git a/net/ipv4/ip_tunnel.c b/net/ipv4/ip_tunnel.c +index c4f5602308ed..054d01c16dc6 100644 +--- a/net/ipv4/ip_tunnel.c ++++ b/net/ipv4/ip_tunnel.c +@@ -644,13 +644,19 @@ void ip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev, + dst = tnl_params->daddr; + if (dst == 0) { + /* NBMA tunnel */ ++ struct ip_tunnel_info *tun_info; + + if (!skb_dst(skb)) { + dev->stats.tx_fifo_errors++; + goto tx_error; + } + +- if (skb->protocol == htons(ETH_P_IP)) { ++ tun_info = skb_tunnel_info(skb); ++ if (tun_info && (tun_info->mode & IP_TUNNEL_INFO_TX) && ++ ip_tunnel_info_af(tun_info) == AF_INET && ++ tun_info->key.u.ipv4.dst) ++ dst = tun_info->key.u.ipv4.dst; ++ else if (skb->protocol == htons(ETH_P_IP)) { + rt = skb_rtable(skb); + dst = rt_nexthop(rt, inner_iph->daddr); + } +diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c +index 9d775b8df57d..c719a41d2eba 100644 +--- a/net/ipv4/tcp_timer.c ++++ b/net/ipv4/tcp_timer.c +@@ -443,10 +443,8 @@ void tcp_retransmit_timer(struct sock *sk) + */ + return; + } +- if (!tp->packets_out) +- goto out; +- +- WARN_ON(tcp_rtx_queue_empty(sk)); ++ if (!tp->packets_out || WARN_ON_ONCE(tcp_rtx_queue_empty(sk))) ++ return; + + tp->tlp_high_seq = 0; + +diff --git a/net/ipv6/ip6_gre.c b/net/ipv6/ip6_gre.c +index dee4113f21a9..8fd28edd6ac5 100644 +--- a/net/ipv6/ip6_gre.c ++++ b/net/ipv6/ip6_gre.c +@@ -2135,9 +2135,23 @@ static int ip6gre_fill_info(struct sk_buff *skb, const struct net_device *dev) + struct __ip6_tnl_parm *p = &t->parms; + __be16 o_flags = p->o_flags; + +- if ((p->erspan_ver == 1 || p->erspan_ver == 2) && +- !p->collect_md) +- o_flags |= TUNNEL_KEY; ++ if (p->erspan_ver == 1 || p->erspan_ver == 2) { ++ if (!p->collect_md) ++ o_flags |= TUNNEL_KEY; ++ ++ if (nla_put_u8(skb, IFLA_GRE_ERSPAN_VER, p->erspan_ver)) ++ goto nla_put_failure; ++ ++ if (p->erspan_ver == 1) { ++ if (nla_put_u32(skb, IFLA_GRE_ERSPAN_INDEX, p->index)) ++ goto nla_put_failure; ++ } else { ++ if (nla_put_u8(skb, IFLA_GRE_ERSPAN_DIR, p->dir)) ++ goto nla_put_failure; ++ if (nla_put_u16(skb, IFLA_GRE_ERSPAN_HWID, p->hwid)) ++ goto nla_put_failure; ++ } ++ } + + if (nla_put_u32(skb, IFLA_GRE_LINK, p->link) || + nla_put_be16(skb, IFLA_GRE_IFLAGS, +@@ -2152,8 +2166,7 @@ static int ip6gre_fill_info(struct sk_buff *skb, const struct net_device *dev) + nla_put_u8(skb, IFLA_GRE_ENCAP_LIMIT, p->encap_limit) || + nla_put_be32(skb, IFLA_GRE_FLOWINFO, p->flowinfo) || + nla_put_u32(skb, IFLA_GRE_FLAGS, p->flags) || +- nla_put_u32(skb, IFLA_GRE_FWMARK, p->fwmark) || +- nla_put_u32(skb, IFLA_GRE_ERSPAN_INDEX, p->index)) ++ nla_put_u32(skb, IFLA_GRE_FWMARK, p->fwmark)) + goto nla_put_failure; + + if (nla_put_u16(skb, IFLA_GRE_ENCAP_TYPE, +@@ -2171,19 +2184,6 @@ static int ip6gre_fill_info(struct sk_buff *skb, const struct net_device *dev) + goto nla_put_failure; + } + +- if (nla_put_u8(skb, IFLA_GRE_ERSPAN_VER, p->erspan_ver)) +- goto nla_put_failure; +- +- if (p->erspan_ver == 1) { +- if (nla_put_u32(skb, IFLA_GRE_ERSPAN_INDEX, p->index)) +- goto nla_put_failure; +- } else if (p->erspan_ver == 2) { +- if (nla_put_u8(skb, IFLA_GRE_ERSPAN_DIR, p->dir)) +- goto nla_put_failure; +- if (nla_put_u16(skb, IFLA_GRE_ERSPAN_HWID, p->hwid)) +- goto nla_put_failure; +- } +- + return 0; + + nla_put_failure: +diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c +index f34202242d24..507409e3fd39 100644 +--- a/net/mac80211/sta_info.c ++++ b/net/mac80211/sta_info.c +@@ -2356,7 +2356,8 @@ unsigned long ieee80211_sta_last_active(struct sta_info *sta) + { + struct ieee80211_sta_rx_stats *stats = sta_get_last_rx_stats(sta); + +- if (time_after(stats->last_rx, sta->status_stats.last_ack)) ++ if (!sta->status_stats.last_ack || ++ time_after(stats->last_rx, sta->status_stats.last_ack)) + return stats->last_rx; + return sta->status_stats.last_ack; + } +diff --git a/net/netfilter/nf_nat_sip.c b/net/netfilter/nf_nat_sip.c +index 1f3086074981..aa1be643d7a0 100644 +--- a/net/netfilter/nf_nat_sip.c ++++ b/net/netfilter/nf_nat_sip.c +@@ -18,6 +18,7 @@ + + #include <net/netfilter/nf_nat.h> + #include <net/netfilter/nf_nat_helper.h> ++#include <net/netfilter/nf_conntrack_core.h> + #include <net/netfilter/nf_conntrack_helper.h> + #include <net/netfilter/nf_conntrack_expect.h> + #include <net/netfilter/nf_conntrack_seqadj.h> +@@ -316,6 +317,9 @@ static void nf_nat_sip_seq_adjust(struct sk_buff *skb, unsigned int protoff, + static void nf_nat_sip_expected(struct nf_conn *ct, + struct nf_conntrack_expect *exp) + { ++ struct nf_conn_help *help = nfct_help(ct->master); ++ struct nf_conntrack_expect *pair_exp; ++ int range_set_for_snat = 0; + struct nf_nat_range2 range; + + /* This must be a fresh one. */ +@@ -327,15 +331,42 @@ static void nf_nat_sip_expected(struct nf_conn *ct, + range.min_addr = range.max_addr = exp->saved_addr; + nf_nat_setup_info(ct, &range, NF_NAT_MANIP_DST); + +- /* Change src to where master sends to, but only if the connection +- * actually came from the same source. */ +- if (nf_inet_addr_cmp(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3, ++ /* Do media streams SRC manip according with the parameters ++ * found in the paired expectation. ++ */ ++ if (exp->class != SIP_EXPECT_SIGNALLING) { ++ spin_lock_bh(&nf_conntrack_expect_lock); ++ hlist_for_each_entry(pair_exp, &help->expectations, lnode) { ++ if (pair_exp->tuple.src.l3num == nf_ct_l3num(ct) && ++ pair_exp->tuple.dst.protonum == ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.dst.protonum && ++ nf_inet_addr_cmp(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3, &pair_exp->saved_addr) && ++ ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u.all == pair_exp->saved_proto.all) { ++ range.flags = (NF_NAT_RANGE_MAP_IPS | NF_NAT_RANGE_PROTO_SPECIFIED); ++ range.min_proto.all = range.max_proto.all = pair_exp->tuple.dst.u.all; ++ range.min_addr = range.max_addr = pair_exp->tuple.dst.u3; ++ range_set_for_snat = 1; ++ break; ++ } ++ } ++ spin_unlock_bh(&nf_conntrack_expect_lock); ++ } ++ ++ /* When no paired expectation has been found, change src to ++ * where master sends to, but only if the connection actually came ++ * from the same source. ++ */ ++ if (!range_set_for_snat && ++ nf_inet_addr_cmp(&ct->tuplehash[IP_CT_DIR_ORIGINAL].tuple.src.u3, + &ct->master->tuplehash[exp->dir].tuple.src.u3)) { + range.flags = NF_NAT_RANGE_MAP_IPS; + range.min_addr = range.max_addr + = ct->master->tuplehash[!exp->dir].tuple.dst.u3; +- nf_nat_setup_info(ct, &range, NF_NAT_MANIP_SRC); ++ range_set_for_snat = 1; + } ++ ++ /* Perform SRC manip. */ ++ if (range_set_for_snat) ++ nf_nat_setup_info(ct, &range, NF_NAT_MANIP_SRC); + } + + static unsigned int nf_nat_sip_expect(struct sk_buff *skb, unsigned int protoff, +diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c +index 289d079008ee..ec0f8b5bde0a 100644 +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -5737,6 +5737,8 @@ static int nf_tables_fill_flowtable_info(struct sk_buff *skb, struct net *net, + goto nla_put_failure; + + nest = nla_nest_start(skb, NFTA_FLOWTABLE_HOOK); ++ if (!nest) ++ goto nla_put_failure; + if (nla_put_be32(skb, NFTA_FLOWTABLE_HOOK_NUM, htonl(flowtable->hooknum)) || + nla_put_be32(skb, NFTA_FLOWTABLE_HOOK_PRIORITY, htonl(flowtable->priority))) + goto nla_put_failure; +diff --git a/net/openvswitch/datapath.c b/net/openvswitch/datapath.c +index c297fe8afdfe..f350faef044d 100644 +--- a/net/openvswitch/datapath.c ++++ b/net/openvswitch/datapath.c +@@ -697,9 +697,13 @@ static size_t ovs_flow_cmd_msg_size(const struct sw_flow_actions *acts, + { + size_t len = NLMSG_ALIGN(sizeof(struct ovs_header)); + +- /* OVS_FLOW_ATTR_UFID */ ++ /* OVS_FLOW_ATTR_UFID, or unmasked flow key as fallback ++ * see ovs_nla_put_identifier() ++ */ + if (sfid && ovs_identifier_is_ufid(sfid)) + len += nla_total_size(sfid->ufid_len); ++ else ++ len += nla_total_size(ovs_key_attr_size()); + + /* OVS_FLOW_ATTR_KEY */ + if (!sfid || should_fill_key(sfid, ufid_flags)) +@@ -875,7 +879,10 @@ static struct sk_buff *ovs_flow_cmd_build_info(const struct sw_flow *flow, + retval = ovs_flow_cmd_fill_info(flow, dp_ifindex, skb, + info->snd_portid, info->snd_seq, 0, + cmd, ufid_flags); +- BUG_ON(retval < 0); ++ if (WARN_ON_ONCE(retval < 0)) { ++ kfree_skb(skb); ++ skb = ERR_PTR(retval); ++ } + return skb; + } + +@@ -1338,7 +1345,10 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info) + OVS_FLOW_CMD_DEL, + ufid_flags); + rcu_read_unlock(); +- BUG_ON(err < 0); ++ if (WARN_ON_ONCE(err < 0)) { ++ kfree_skb(reply); ++ goto out_free; ++ } + + ovs_notify(&dp_flow_genl_family, reply, info); + } else { +@@ -1346,6 +1356,7 @@ static int ovs_flow_cmd_del(struct sk_buff *skb, struct genl_info *info) + } + } + ++out_free: + ovs_flow_free(flow, true); + return 0; + unlock: +diff --git a/net/psample/psample.c b/net/psample/psample.c +index 4cea353221da..30e8239bd774 100644 +--- a/net/psample/psample.c ++++ b/net/psample/psample.c +@@ -223,7 +223,7 @@ void psample_sample_packet(struct psample_group *group, struct sk_buff *skb, + data_len = PSAMPLE_MAX_PACKET_SIZE - meta_len - NLA_HDRLEN + - NLA_ALIGNTO; + +- nl_skb = genlmsg_new(meta_len + data_len, GFP_ATOMIC); ++ nl_skb = genlmsg_new(meta_len + nla_total_size(data_len), GFP_ATOMIC); + if (unlikely(!nl_skb)) + return; + +diff --git a/net/sched/sch_mq.c b/net/sched/sch_mq.c +index d6b8ae4ed7a3..15c6eb547684 100644 +--- a/net/sched/sch_mq.c ++++ b/net/sched/sch_mq.c +@@ -242,7 +242,8 @@ static int mq_dump_class_stats(struct Qdisc *sch, unsigned long cl, + struct netdev_queue *dev_queue = mq_queue_get(sch, cl); + + sch = dev_queue->qdisc_sleeping; +- if (gnet_stats_copy_basic(&sch->running, d, NULL, &sch->bstats) < 0 || ++ if (gnet_stats_copy_basic(&sch->running, d, sch->cpu_bstats, ++ &sch->bstats) < 0 || + gnet_stats_copy_queue(d, NULL, &sch->qstats, sch->q.qlen) < 0) + return -1; + return 0; +diff --git a/net/sched/sch_mqprio.c b/net/sched/sch_mqprio.c +index 0e9d761cdd80..68ce86cab63c 100644 +--- a/net/sched/sch_mqprio.c ++++ b/net/sched/sch_mqprio.c +@@ -559,8 +559,8 @@ static int mqprio_dump_class_stats(struct Qdisc *sch, unsigned long cl, + struct netdev_queue *dev_queue = mqprio_queue_get(sch, cl); + + sch = dev_queue->qdisc_sleeping; +- if (gnet_stats_copy_basic(qdisc_root_sleeping_running(sch), +- d, NULL, &sch->bstats) < 0 || ++ if (gnet_stats_copy_basic(qdisc_root_sleeping_running(sch), d, ++ sch->cpu_bstats, &sch->bstats) < 0 || + gnet_stats_copy_queue(d, NULL, + &sch->qstats, sch->q.qlen) < 0) + return -1; +diff --git a/net/sched/sch_multiq.c b/net/sched/sch_multiq.c +index 1da7ea8de0ad..1df78e361ef9 100644 +--- a/net/sched/sch_multiq.c ++++ b/net/sched/sch_multiq.c +@@ -343,7 +343,7 @@ static int multiq_dump_class_stats(struct Qdisc *sch, unsigned long cl, + + cl_q = q->queues[cl - 1]; + if (gnet_stats_copy_basic(qdisc_root_sleeping_running(sch), +- d, NULL, &cl_q->bstats) < 0 || ++ d, cl_q->cpu_bstats, &cl_q->bstats) < 0 || + gnet_stats_copy_queue(d, NULL, &cl_q->qstats, cl_q->q.qlen) < 0) + return -1; + +diff --git a/net/sched/sch_prio.c b/net/sched/sch_prio.c +index 222e53d3d27a..5672abede0cc 100644 +--- a/net/sched/sch_prio.c ++++ b/net/sched/sch_prio.c +@@ -396,7 +396,7 @@ static int prio_dump_class_stats(struct Qdisc *sch, unsigned long cl, + + cl_q = q->queues[cl - 1]; + if (gnet_stats_copy_basic(qdisc_root_sleeping_running(sch), +- d, NULL, &cl_q->bstats) < 0 || ++ d, cl_q->cpu_bstats, &cl_q->bstats) < 0 || + gnet_stats_copy_queue(d, NULL, &cl_q->qstats, cl_q->q.qlen) < 0) + return -1; + +diff --git a/net/sctp/associola.c b/net/sctp/associola.c +index 914750b819b2..f68ccd1f4860 100644 +--- a/net/sctp/associola.c ++++ b/net/sctp/associola.c +@@ -80,6 +80,7 @@ static struct sctp_association *sctp_association_init( + /* Discarding const is appropriate here. */ + asoc->ep = (struct sctp_endpoint *)ep; + asoc->base.sk = (struct sock *)sk; ++ asoc->base.net = sock_net(sk); + + sctp_endpoint_hold(asoc->ep); + sock_hold(asoc->base.sk); +diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c +index c99114eaf42e..8640dedcf64f 100644 +--- a/net/sctp/endpointola.c ++++ b/net/sctp/endpointola.c +@@ -165,6 +165,7 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep, + + /* Remember who we are attached to. */ + ep->base.sk = sk; ++ ep->base.net = sock_net(sk); + sock_hold(ep->base.sk); + + return ep; +diff --git a/net/sctp/input.c b/net/sctp/input.c +index 5c36a99882ed..bfe29158afcc 100644 +--- a/net/sctp/input.c ++++ b/net/sctp/input.c +@@ -815,7 +815,7 @@ static inline int sctp_hash_cmp(struct rhashtable_compare_arg *arg, + if (!sctp_transport_hold(t)) + return err; + +- if (!net_eq(sock_net(t->asoc->base.sk), x->net)) ++ if (!net_eq(t->asoc->base.net, x->net)) + goto out; + if (x->lport != htons(t->asoc->base.bind_addr.port)) + goto out; +@@ -830,7 +830,7 @@ static inline __u32 sctp_hash_obj(const void *data, u32 len, u32 seed) + { + const struct sctp_transport *t = data; + const union sctp_addr *paddr = &t->ipaddr; +- const struct net *net = sock_net(t->asoc->base.sk); ++ const struct net *net = t->asoc->base.net; + __be16 lport = htons(t->asoc->base.bind_addr.port); + __u32 addr; + +diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c +index 713a669d2058..559f09ac0b22 100644 +--- a/net/sctp/sm_statefuns.c ++++ b/net/sctp/sm_statefuns.c +@@ -2175,8 +2175,10 @@ enum sctp_disposition sctp_sf_do_5_2_4_dupcook( + + /* Update socket peer label if first association. */ + if (security_sctp_assoc_request((struct sctp_endpoint *)ep, +- chunk->skb)) ++ chunk->skb)) { ++ sctp_association_free(new_asoc); + return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands); ++ } + + /* Set temp so that it won't be added into hashtable */ + new_asoc->temp = 1; +diff --git a/net/sctp/transport.c b/net/sctp/transport.c +index 033696e6f74f..ad158d311ffa 100644 +--- a/net/sctp/transport.c ++++ b/net/sctp/transport.c +@@ -207,7 +207,8 @@ void sctp_transport_reset_hb_timer(struct sctp_transport *transport) + + /* When a data chunk is sent, reset the heartbeat interval. */ + expires = jiffies + sctp_transport_timeout(transport); +- if (time_before(transport->hb_timer.expires, expires) && ++ if ((time_before(transport->hb_timer.expires, expires) || ++ !timer_pending(&transport->hb_timer)) && + !mod_timer(&transport->hb_timer, + expires + prandom_u32_max(transport->rto))) + sctp_transport_hold(transport); +diff --git a/net/smc/smc_cdc.c b/net/smc/smc_cdc.c +index ed5dcf03fe0b..333e4353498f 100644 +--- a/net/smc/smc_cdc.c ++++ b/net/smc/smc_cdc.c +@@ -96,6 +96,7 @@ int smc_cdc_msg_send(struct smc_connection *conn, + struct smc_wr_buf *wr_buf, + struct smc_cdc_tx_pend *pend) + { ++ union smc_host_cursor cfed; + struct smc_link *link; + int rc; + +@@ -105,12 +106,10 @@ int smc_cdc_msg_send(struct smc_connection *conn, + + conn->tx_cdc_seq++; + conn->local_tx_ctrl.seqno = conn->tx_cdc_seq; +- smc_host_msg_to_cdc((struct smc_cdc_msg *)wr_buf, +- &conn->local_tx_ctrl, conn); ++ smc_host_msg_to_cdc((struct smc_cdc_msg *)wr_buf, conn, &cfed); + rc = smc_wr_tx_send(link, (struct smc_wr_tx_pend_priv *)pend); + if (!rc) +- smc_curs_copy(&conn->rx_curs_confirmed, +- &conn->local_tx_ctrl.cons, conn); ++ smc_curs_copy(&conn->rx_curs_confirmed, &cfed, conn); + + return rc; + } +diff --git a/net/smc/smc_cdc.h b/net/smc/smc_cdc.h +index 934df4473a7c..34d2e1450320 100644 +--- a/net/smc/smc_cdc.h ++++ b/net/smc/smc_cdc.h +@@ -135,7 +135,9 @@ static inline void smc_curs_copy_net(union smc_cdc_cursor *tgt, + #endif + } + +-/* calculate cursor difference between old and new, where old <= new */ ++/* calculate cursor difference between old and new, where old <= new and ++ * difference cannot exceed size ++ */ + static inline int smc_curs_diff(unsigned int size, + union smc_host_cursor *old, + union smc_host_cursor *new) +@@ -160,28 +162,51 @@ static inline int smc_curs_comp(unsigned int size, + return smc_curs_diff(size, old, new); + } + ++/* calculate cursor difference between old and new, where old <= new and ++ * difference may exceed size ++ */ ++static inline int smc_curs_diff_large(unsigned int size, ++ union smc_host_cursor *old, ++ union smc_host_cursor *new) ++{ ++ if (old->wrap < new->wrap) ++ return min_t(int, ++ (size - old->count) + new->count + ++ (new->wrap - old->wrap - 1) * size, ++ size); ++ ++ if (old->wrap > new->wrap) /* wrap has switched from 0xffff to 0x0000 */ ++ return min_t(int, ++ (size - old->count) + new->count + ++ (new->wrap + 0xffff - old->wrap) * size, ++ size); ++ ++ return max_t(int, 0, (new->count - old->count)); ++} ++ + static inline void smc_host_cursor_to_cdc(union smc_cdc_cursor *peer, + union smc_host_cursor *local, ++ union smc_host_cursor *save, + struct smc_connection *conn) + { +- union smc_host_cursor temp; +- +- smc_curs_copy(&temp, local, conn); +- peer->count = htonl(temp.count); +- peer->wrap = htons(temp.wrap); ++ smc_curs_copy(save, local, conn); ++ peer->count = htonl(save->count); ++ peer->wrap = htons(save->wrap); + /* peer->reserved = htons(0); must be ensured by caller */ + } + + static inline void smc_host_msg_to_cdc(struct smc_cdc_msg *peer, +- struct smc_host_cdc_msg *local, +- struct smc_connection *conn) ++ struct smc_connection *conn, ++ union smc_host_cursor *save) + { ++ struct smc_host_cdc_msg *local = &conn->local_tx_ctrl; ++ + peer->common.type = local->common.type; + peer->len = local->len; + peer->seqno = htons(local->seqno); + peer->token = htonl(local->token); +- smc_host_cursor_to_cdc(&peer->prod, &local->prod, conn); +- smc_host_cursor_to_cdc(&peer->cons, &local->cons, conn); ++ smc_host_cursor_to_cdc(&peer->prod, &local->prod, save, conn); ++ smc_host_cursor_to_cdc(&peer->cons, &local->cons, save, conn); + peer->prod_flags = local->prod_flags; + peer->conn_state_flags = local->conn_state_flags; + } +diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c +index 18daebcef181..2c9baf8bf118 100644 +--- a/net/smc/smc_core.c ++++ b/net/smc/smc_core.c +@@ -128,6 +128,8 @@ static void smc_lgr_unregister_conn(struct smc_connection *conn) + { + struct smc_link_group *lgr = conn->lgr; + ++ if (!lgr) ++ return; + write_lock_bh(&lgr->conns_lock); + if (conn->alert_token_local) { + __smc_lgr_unregister_conn(conn); +@@ -612,6 +614,8 @@ int smc_conn_create(struct smc_sock *smc, bool is_smcd, int srv_first_contact, + local_contact = SMC_REUSE_CONTACT; + conn->lgr = lgr; + smc_lgr_register_conn(conn); /* add smc conn to lgr */ ++ if (delayed_work_pending(&lgr->free_work)) ++ cancel_delayed_work(&lgr->free_work); + write_unlock_bh(&lgr->conns_lock); + break; + } +diff --git a/net/smc/smc_tx.c b/net/smc/smc_tx.c +index 28361aef9982..0ecbbdc337b8 100644 +--- a/net/smc/smc_tx.c ++++ b/net/smc/smc_tx.c +@@ -163,12 +163,11 @@ int smc_tx_sendmsg(struct smc_sock *smc, struct msghdr *msg, size_t len) + conn->local_tx_ctrl.prod_flags.urg_data_pending = 1; + + if (!atomic_read(&conn->sndbuf_space) || conn->urg_tx_pend) { ++ if (send_done) ++ return send_done; + rc = smc_tx_wait(smc, msg->msg_flags); +- if (rc) { +- if (send_done) +- return send_done; ++ if (rc) + goto out_err; +- } + continue; + } + +@@ -596,7 +595,8 @@ void smc_tx_consumer_update(struct smc_connection *conn, bool force) + if (to_confirm > conn->rmbe_update_limit) { + smc_curs_copy(&prod, &conn->local_rx_ctrl.prod, conn); + sender_free = conn->rmb_desc->len - +- smc_curs_diff(conn->rmb_desc->len, &prod, &cfed); ++ smc_curs_diff_large(conn->rmb_desc->len, ++ &cfed, &prod); + } + + if (conn->local_rx_ctrl.prod_flags.cons_curs_upd_req || +diff --git a/net/sunrpc/xprtrdma/rpc_rdma.c b/net/sunrpc/xprtrdma/rpc_rdma.c +index c8ae983c6cc0..f2eaf264726b 100644 +--- a/net/sunrpc/xprtrdma/rpc_rdma.c ++++ b/net/sunrpc/xprtrdma/rpc_rdma.c +@@ -1360,6 +1360,10 @@ void rpcrdma_reply_handler(struct rpcrdma_rep *rep) + spin_unlock(&xprt->recv_lock); + + req = rpcr_to_rdmar(rqst); ++ if (req->rl_reply) { ++ trace_xprtrdma_leaked_rep(rqst, req->rl_reply); ++ rpcrdma_recv_buffer_put(req->rl_reply); ++ } + req->rl_reply = rep; + rep->rr_rqst = rqst; + clear_bit(RPCRDMA_REQ_F_PENDING, &req->rl_flags); +diff --git a/net/tipc/link.c b/net/tipc/link.c +index 6344aca4487b..0fbf8ea18ce0 100644 +--- a/net/tipc/link.c ++++ b/net/tipc/link.c +@@ -1114,7 +1114,7 @@ static bool tipc_data_input(struct tipc_link *l, struct sk_buff *skb, + default: + pr_warn("Dropping received illegal msg type\n"); + kfree_skb(skb); +- return false; ++ return true; + }; + } + +diff --git a/net/tipc/netlink_compat.c b/net/tipc/netlink_compat.c +index 318c541970ec..29e684054abe 100644 +--- a/net/tipc/netlink_compat.c ++++ b/net/tipc/netlink_compat.c +@@ -548,7 +548,7 @@ static int tipc_nl_compat_link_stat_dump(struct tipc_nl_compat_msg *msg, + if (len <= 0) + return -EINVAL; + +- len = min_t(int, len, TIPC_MAX_BEARER_NAME); ++ len = min_t(int, len, TIPC_MAX_LINK_NAME); + if (!string_is_valid(name, len)) + return -EINVAL; + +@@ -830,7 +830,7 @@ static int tipc_nl_compat_link_reset_stats(struct tipc_nl_compat_cmd_doit *cmd, + if (len <= 0) + return -EINVAL; + +- len = min_t(int, len, TIPC_MAX_BEARER_NAME); ++ len = min_t(int, len, TIPC_MAX_LINK_NAME); + if (!string_is_valid(name, len)) + return -EINVAL; + +@@ -983,6 +983,10 @@ static int tipc_nl_compat_publ_dump(struct tipc_nl_compat_msg *msg, u32 sock) + + hdr = genlmsg_put(args, 0, 0, &tipc_genl_family, NLM_F_MULTI, + TIPC_NL_PUBL_GET); ++ if (!hdr) { ++ kfree_skb(args); ++ return -EMSGSIZE; ++ } + + nest = nla_nest_start(args, TIPC_NLA_SOCK); + if (!nest) { +@@ -1030,8 +1034,11 @@ static int tipc_nl_compat_sk_dump(struct tipc_nl_compat_msg *msg, + u32 node; + struct nlattr *con[TIPC_NLA_CON_MAX + 1]; + +- nla_parse_nested(con, TIPC_NLA_CON_MAX, +- sock[TIPC_NLA_SOCK_CON], NULL, NULL); ++ err = nla_parse_nested(con, TIPC_NLA_CON_MAX, ++ sock[TIPC_NLA_SOCK_CON], NULL, NULL); ++ ++ if (err) ++ return err; + + node = nla_get_u32(con[TIPC_NLA_CON_NODE]); + tipc_tlv_sprintf(msg->rep, " connected to <%u.%u.%u:%u>", +diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c +index b2724fb06bbb..62ec9182f234 100644 +--- a/net/vmw_vsock/af_vsock.c ++++ b/net/vmw_vsock/af_vsock.c +@@ -107,6 +107,7 @@ + #include <linux/mutex.h> + #include <linux/net.h> + #include <linux/poll.h> ++#include <linux/random.h> + #include <linux/skbuff.h> + #include <linux/smp.h> + #include <linux/socket.h> +@@ -480,9 +481,13 @@ out: + static int __vsock_bind_stream(struct vsock_sock *vsk, + struct sockaddr_vm *addr) + { +- static u32 port = LAST_RESERVED_PORT + 1; ++ static u32 port = 0; + struct sockaddr_vm new_addr; + ++ if (!port) ++ port = LAST_RESERVED_PORT + 1 + ++ prandom_u32_max(U32_MAX - LAST_RESERVED_PORT); ++ + vsock_addr_init(&new_addr, addr->svm_cid, addr->svm_port); + + if (addr->svm_port == VMADDR_PORT_ANY) { +diff --git a/net/xfrm/xfrm_state.c b/net/xfrm/xfrm_state.c +index 11e09eb138d6..47a8ff972a2b 100644 +--- a/net/xfrm/xfrm_state.c ++++ b/net/xfrm/xfrm_state.c +@@ -456,6 +456,8 @@ static void ___xfrm_state_destroy(struct xfrm_state *x) + x->type->destructor(x); + xfrm_put_type(x->type); + } ++ if (x->xfrag.page) ++ put_page(x->xfrag.page); + xfrm_dev_state_free(x); + security_xfrm_state_free(x); + xfrm_state_free(x); +diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile +index 36f9f41d094b..75d4b48601aa 100644 +--- a/samples/bpf/Makefile ++++ b/samples/bpf/Makefile +@@ -172,6 +172,7 @@ KBUILD_HOSTCFLAGS += -I$(srctree)/tools/lib/ + KBUILD_HOSTCFLAGS += -I$(srctree)/tools/testing/selftests/bpf/ + KBUILD_HOSTCFLAGS += -I$(srctree)/tools/lib/ -I$(srctree)/tools/include + KBUILD_HOSTCFLAGS += -I$(srctree)/tools/perf ++KBUILD_HOSTCFLAGS += -DHAVE_ATTR_TEST=0 + + HOSTCFLAGS_bpf_load.o += -I$(objtree)/usr/include -Wno-unused-variable + HOSTCFLAGS_trace_helpers.o += -I$(srctree)/tools/lib/bpf/ +diff --git a/samples/vfio-mdev/mtty.c b/samples/vfio-mdev/mtty.c +index 7abb79d8313d..f6732aa16bb1 100644 +--- a/samples/vfio-mdev/mtty.c ++++ b/samples/vfio-mdev/mtty.c +@@ -171,7 +171,7 @@ static struct mdev_state *find_mdev_state_by_uuid(uuid_le uuid) + return NULL; + } + +-void dump_buffer(char *buf, uint32_t count) ++void dump_buffer(u8 *buf, uint32_t count) + { + #if defined(DEBUG) + int i; +@@ -250,7 +250,7 @@ static void mtty_create_config_space(struct mdev_state *mdev_state) + } + + static void handle_pci_cfg_write(struct mdev_state *mdev_state, u16 offset, +- char *buf, u32 count) ++ u8 *buf, u32 count) + { + u32 cfg_addr, bar_mask, bar_index = 0; + +@@ -304,7 +304,7 @@ static void handle_pci_cfg_write(struct mdev_state *mdev_state, u16 offset, + } + + static void handle_bar_write(unsigned int index, struct mdev_state *mdev_state, +- u16 offset, char *buf, u32 count) ++ u16 offset, u8 *buf, u32 count) + { + u8 data = *buf; + +@@ -475,7 +475,7 @@ static void handle_bar_write(unsigned int index, struct mdev_state *mdev_state, + } + + static void handle_bar_read(unsigned int index, struct mdev_state *mdev_state, +- u16 offset, char *buf, u32 count) ++ u16 offset, u8 *buf, u32 count) + { + /* Handle read requests by guest */ + switch (offset) { +@@ -650,7 +650,7 @@ static void mdev_read_base(struct mdev_state *mdev_state) + } + } + +-static ssize_t mdev_access(struct mdev_device *mdev, char *buf, size_t count, ++static ssize_t mdev_access(struct mdev_device *mdev, u8 *buf, size_t count, + loff_t pos, bool is_write) + { + struct mdev_state *mdev_state; +@@ -698,7 +698,7 @@ static ssize_t mdev_access(struct mdev_device *mdev, char *buf, size_t count, + #if defined(DEBUG_REGS) + pr_info("%s: BAR%d WR @0x%llx %s val:0x%02x dlab:%d\n", + __func__, index, offset, wr_reg[offset], +- (u8)*buf, mdev_state->s[index].dlab); ++ *buf, mdev_state->s[index].dlab); + #endif + handle_bar_write(index, mdev_state, offset, buf, count); + } else { +@@ -708,7 +708,7 @@ static ssize_t mdev_access(struct mdev_device *mdev, char *buf, size_t count, + #if defined(DEBUG_REGS) + pr_info("%s: BAR%d RD @0x%llx %s val:0x%02x dlab:%d\n", + __func__, index, offset, rd_reg[offset], +- (u8)*buf, mdev_state->s[index].dlab); ++ *buf, mdev_state->s[index].dlab); + #endif + } + break; +@@ -827,7 +827,7 @@ ssize_t mtty_read(struct mdev_device *mdev, char __user *buf, size_t count, + if (count >= 4 && !(*ppos % 4)) { + u32 val; + +- ret = mdev_access(mdev, (char *)&val, sizeof(val), ++ ret = mdev_access(mdev, (u8 *)&val, sizeof(val), + *ppos, false); + if (ret <= 0) + goto read_err; +@@ -839,7 +839,7 @@ ssize_t mtty_read(struct mdev_device *mdev, char __user *buf, size_t count, + } else if (count >= 2 && !(*ppos % 2)) { + u16 val; + +- ret = mdev_access(mdev, (char *)&val, sizeof(val), ++ ret = mdev_access(mdev, (u8 *)&val, sizeof(val), + *ppos, false); + if (ret <= 0) + goto read_err; +@@ -851,7 +851,7 @@ ssize_t mtty_read(struct mdev_device *mdev, char __user *buf, size_t count, + } else { + u8 val; + +- ret = mdev_access(mdev, (char *)&val, sizeof(val), ++ ret = mdev_access(mdev, (u8 *)&val, sizeof(val), + *ppos, false); + if (ret <= 0) + goto read_err; +@@ -889,7 +889,7 @@ ssize_t mtty_write(struct mdev_device *mdev, const char __user *buf, + if (copy_from_user(&val, buf, sizeof(val))) + goto write_err; + +- ret = mdev_access(mdev, (char *)&val, sizeof(val), ++ ret = mdev_access(mdev, (u8 *)&val, sizeof(val), + *ppos, true); + if (ret <= 0) + goto write_err; +@@ -901,7 +901,7 @@ ssize_t mtty_write(struct mdev_device *mdev, const char __user *buf, + if (copy_from_user(&val, buf, sizeof(val))) + goto write_err; + +- ret = mdev_access(mdev, (char *)&val, sizeof(val), ++ ret = mdev_access(mdev, (u8 *)&val, sizeof(val), + *ppos, true); + if (ret <= 0) + goto write_err; +@@ -913,7 +913,7 @@ ssize_t mtty_write(struct mdev_device *mdev, const char __user *buf, + if (copy_from_user(&val, buf, sizeof(val))) + goto write_err; + +- ret = mdev_access(mdev, (char *)&val, sizeof(val), ++ ret = mdev_access(mdev, (u8 *)&val, sizeof(val), + *ppos, true); + if (ret <= 0) + goto write_err; +diff --git a/scripts/gdb/linux/symbols.py b/scripts/gdb/linux/symbols.py +index 004b0ac7fa72..4644f1a83b57 100644 +--- a/scripts/gdb/linux/symbols.py ++++ b/scripts/gdb/linux/symbols.py +@@ -99,7 +99,8 @@ lx-symbols command.""" + attrs[n]['name'].string(): attrs[n]['address'] + for n in range(int(sect_attrs['nsections']))} + args = [] +- for section_name in [".data", ".data..read_mostly", ".rodata", ".bss"]: ++ for section_name in [".data", ".data..read_mostly", ".rodata", ".bss", ++ ".text", ".text.hot", ".text.unlikely"]: + address = section_name_to_address.get(section_name) + if address: + args.append(" -s {name} {addr}".format( +diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c +index 40e3a098f6fb..d95a7e41a29d 100644 +--- a/security/apparmor/apparmorfs.c ++++ b/security/apparmor/apparmorfs.c +@@ -361,6 +361,7 @@ static void aafs_remove(struct dentry *dentry) + simple_rmdir(dir, dentry); + else + simple_unlink(dir, dentry); ++ d_delete(dentry); + dput(dentry); + } + inode_unlock(dir); +diff --git a/sound/core/compress_offload.c b/sound/core/compress_offload.c +index 516ec3587325..509038d6bccd 100644 +--- a/sound/core/compress_offload.c ++++ b/sound/core/compress_offload.c +@@ -529,7 +529,7 @@ static int snd_compress_check_input(struct snd_compr_params *params) + { + /* first let's check the buffer parameter's */ + if (params->buffer.fragment_size == 0 || +- params->buffer.fragments > INT_MAX / params->buffer.fragment_size || ++ params->buffer.fragments > U32_MAX / params->buffer.fragment_size || + params->buffer.fragments == 0) + return -EINVAL; + +diff --git a/sound/soc/codecs/msm8916-wcd-analog.c b/sound/soc/codecs/msm8916-wcd-analog.c +index b7cf7cce95fe..4f0497ab1aa8 100644 +--- a/sound/soc/codecs/msm8916-wcd-analog.c ++++ b/sound/soc/codecs/msm8916-wcd-analog.c +@@ -303,7 +303,7 @@ struct pm8916_wcd_analog_priv { + }; + + static const char *const adc2_mux_text[] = { "ZERO", "INP2", "INP3" }; +-static const char *const rdac2_mux_text[] = { "ZERO", "RX2", "RX1" }; ++static const char *const rdac2_mux_text[] = { "RX1", "RX2" }; + static const char *const hph_text[] = { "ZERO", "Switch", }; + + static const struct soc_enum hph_enum = SOC_ENUM_SINGLE_VIRT( +@@ -318,7 +318,7 @@ static const struct soc_enum adc2_enum = SOC_ENUM_SINGLE_VIRT( + + /* RDAC2 MUX */ + static const struct soc_enum rdac2_mux_enum = SOC_ENUM_SINGLE( +- CDC_D_CDC_CONN_HPHR_DAC_CTL, 0, 3, rdac2_mux_text); ++ CDC_D_CDC_CONN_HPHR_DAC_CTL, 0, 2, rdac2_mux_text); + + static const struct snd_kcontrol_new spkr_switch[] = { + SOC_DAPM_SINGLE("Switch", CDC_A_SPKR_DAC_CTL, 7, 1, 0) +diff --git a/sound/soc/codecs/rt5645.c b/sound/soc/codecs/rt5645.c +index 1dc70f452c1b..f842db498c74 100644 +--- a/sound/soc/codecs/rt5645.c ++++ b/sound/soc/codecs/rt5645.c +@@ -3662,6 +3662,11 @@ static const struct rt5645_platform_data jd_mode3_platform_data = { + .jd_mode = 3, + }; + ++static const struct rt5645_platform_data lattepanda_board_platform_data = { ++ .jd_mode = 2, ++ .inv_jd1_1 = true ++}; ++ + static const struct dmi_system_id dmi_platform_data[] = { + { + .ident = "Chrome Buddy", +@@ -3759,6 +3764,15 @@ static const struct dmi_system_id dmi_platform_data[] = { + }, + .driver_data = (void *)&intel_braswell_platform_data, + }, ++ { ++ .ident = "LattePanda board", ++ .matches = { ++ DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "AMI Corporation"), ++ DMI_EXACT_MATCH(DMI_BOARD_NAME, "Cherry Trail CR"), ++ DMI_EXACT_MATCH(DMI_BOARD_VERSION, "Default string"), ++ }, ++ .driver_data = (void *)&lattepanda_board_platform_data, ++ }, + { } + }; + +diff --git a/sound/soc/kirkwood/kirkwood-i2s.c b/sound/soc/kirkwood/kirkwood-i2s.c +index 9a2777b72dcd..4395bb7029a0 100644 +--- a/sound/soc/kirkwood/kirkwood-i2s.c ++++ b/sound/soc/kirkwood/kirkwood-i2s.c +@@ -563,10 +563,6 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev) + return PTR_ERR(priv->clk); + } + +- err = clk_prepare_enable(priv->clk); +- if (err < 0) +- return err; +- + priv->extclk = devm_clk_get(&pdev->dev, "extclk"); + if (IS_ERR(priv->extclk)) { + if (PTR_ERR(priv->extclk) == -EPROBE_DEFER) +@@ -582,6 +578,10 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev) + } + } + ++ err = clk_prepare_enable(priv->clk); ++ if (err < 0) ++ return err; ++ + /* Some sensible defaults - this reflects the powerup values */ + priv->ctl_play = KIRKWOOD_PLAYCTL_SIZE_24; + priv->ctl_rec = KIRKWOOD_RECCTL_SIZE_24; +@@ -595,7 +595,7 @@ static int kirkwood_i2s_dev_probe(struct platform_device *pdev) + priv->ctl_rec |= KIRKWOOD_RECCTL_BURST_128; + } + +- err = devm_snd_soc_register_component(&pdev->dev, &kirkwood_soc_component, ++ err = snd_soc_register_component(&pdev->dev, &kirkwood_soc_component, + soc_dai, 2); + if (err) { + dev_err(&pdev->dev, "snd_soc_register_component failed\n"); +@@ -618,6 +618,7 @@ static int kirkwood_i2s_dev_remove(struct platform_device *pdev) + { + struct kirkwood_dma_data *priv = dev_get_drvdata(&pdev->dev); + ++ snd_soc_unregister_component(&pdev->dev); + if (!IS_ERR(priv->extclk)) + clk_disable_unprepare(priv->extclk); + clk_disable_unprepare(priv->clk); +diff --git a/sound/soc/samsung/i2s.c b/sound/soc/samsung/i2s.c +index ce00fe2f6aae..d4bde4834ce5 100644 +--- a/sound/soc/samsung/i2s.c ++++ b/sound/soc/samsung/i2s.c +@@ -604,6 +604,7 @@ static int i2s_set_fmt(struct snd_soc_dai *dai, + unsigned int fmt) + { + struct i2s_dai *i2s = to_info(dai); ++ struct i2s_dai *other = get_other_dai(i2s); + int lrp_shift, sdf_shift, sdf_mask, lrp_rlow, mod_slave; + u32 mod, tmp = 0; + unsigned long flags; +@@ -661,7 +662,8 @@ static int i2s_set_fmt(struct snd_soc_dai *dai, + * CLK_I2S_RCLK_SRC clock is not exposed so we ensure any + * clock configuration assigned in DT is not overwritten. + */ +- if (i2s->rclk_srcrate == 0 && i2s->clk_data.clks == NULL) ++ if (i2s->rclk_srcrate == 0 && i2s->clk_data.clks == NULL && ++ other->clk_data.clks == NULL) + i2s_set_sysclk(dai, SAMSUNG_I2S_RCLKSRC_0, + 0, SND_SOC_CLOCK_IN); + break; +@@ -699,6 +701,7 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, + struct snd_pcm_hw_params *params, struct snd_soc_dai *dai) + { + struct i2s_dai *i2s = to_info(dai); ++ struct i2s_dai *other = get_other_dai(i2s); + u32 mod, mask = 0, val = 0; + struct clk *rclksrc; + unsigned long flags; +@@ -784,6 +787,9 @@ static int i2s_hw_params(struct snd_pcm_substream *substream, + i2s->frmclk = params_rate(params); + + rclksrc = i2s->clk_table[CLK_I2S_RCLK_SRC]; ++ if (!rclksrc || IS_ERR(rclksrc)) ++ rclksrc = other->clk_table[CLK_I2S_RCLK_SRC]; ++ + if (rclksrc && !IS_ERR(rclksrc)) + i2s->rclk_srcrate = clk_get_rate(rclksrc); + +diff --git a/sound/soc/stm/stm32_i2s.c b/sound/soc/stm/stm32_i2s.c +index 6d0bf78d114d..aa2b1196171a 100644 +--- a/sound/soc/stm/stm32_i2s.c ++++ b/sound/soc/stm/stm32_i2s.c +@@ -246,8 +246,8 @@ static irqreturn_t stm32_i2s_isr(int irq, void *devid) + return IRQ_NONE; + } + +- regmap_update_bits(i2s->regmap, STM32_I2S_IFCR_REG, +- I2S_IFCR_MASK, flags); ++ regmap_write_bits(i2s->regmap, STM32_I2S_IFCR_REG, ++ I2S_IFCR_MASK, flags); + + if (flags & I2S_SR_OVR) { + dev_dbg(&pdev->dev, "Overrun\n"); +@@ -276,7 +276,6 @@ static bool stm32_i2s_readable_reg(struct device *dev, unsigned int reg) + case STM32_I2S_CFG2_REG: + case STM32_I2S_IER_REG: + case STM32_I2S_SR_REG: +- case STM32_I2S_IFCR_REG: + case STM32_I2S_TXDR_REG: + case STM32_I2S_RXDR_REG: + case STM32_I2S_CGFR_REG: +@@ -488,7 +487,7 @@ static int stm32_i2s_configure(struct snd_soc_dai *cpu_dai, + { + struct stm32_i2s_data *i2s = snd_soc_dai_get_drvdata(cpu_dai); + int format = params_width(params); +- u32 cfgr, cfgr_mask, cfg1, cfg1_mask; ++ u32 cfgr, cfgr_mask, cfg1; + unsigned int fthlv; + int ret; + +@@ -501,7 +500,7 @@ static int stm32_i2s_configure(struct snd_soc_dai *cpu_dai, + switch (format) { + case 16: + cfgr = I2S_CGFR_DATLEN_SET(I2S_I2SMOD_DATLEN_16); +- cfgr_mask = I2S_CGFR_DATLEN_MASK; ++ cfgr_mask = I2S_CGFR_DATLEN_MASK | I2S_CGFR_CHLEN; + break; + case 32: + cfgr = I2S_CGFR_DATLEN_SET(I2S_I2SMOD_DATLEN_32) | +@@ -529,15 +528,11 @@ static int stm32_i2s_configure(struct snd_soc_dai *cpu_dai, + if (ret < 0) + return ret; + +- cfg1 = I2S_CFG1_RXDMAEN | I2S_CFG1_TXDMAEN; +- cfg1_mask = cfg1; +- + fthlv = STM32_I2S_FIFO_SIZE * I2S_FIFO_TH_ONE_QUARTER / 4; +- cfg1 |= I2S_CFG1_FTHVL_SET(fthlv - 1); +- cfg1_mask |= I2S_CFG1_FTHVL_MASK; ++ cfg1 = I2S_CFG1_FTHVL_SET(fthlv - 1); + + return regmap_update_bits(i2s->regmap, STM32_I2S_CFG1_REG, +- cfg1_mask, cfg1); ++ I2S_CFG1_FTHVL_MASK, cfg1); + } + + static int stm32_i2s_startup(struct snd_pcm_substream *substream, +@@ -551,8 +546,8 @@ static int stm32_i2s_startup(struct snd_pcm_substream *substream, + i2s->refcount++; + spin_unlock(&i2s->lock_fd); + +- return regmap_update_bits(i2s->regmap, STM32_I2S_IFCR_REG, +- I2S_IFCR_MASK, I2S_IFCR_MASK); ++ return regmap_write_bits(i2s->regmap, STM32_I2S_IFCR_REG, ++ I2S_IFCR_MASK, I2S_IFCR_MASK); + } + + static int stm32_i2s_hw_params(struct snd_pcm_substream *substream, +@@ -589,6 +584,10 @@ static int stm32_i2s_trigger(struct snd_pcm_substream *substream, int cmd, + /* Enable i2s */ + dev_dbg(cpu_dai->dev, "start I2S\n"); + ++ cfg1_mask = I2S_CFG1_RXDMAEN | I2S_CFG1_TXDMAEN; ++ regmap_update_bits(i2s->regmap, STM32_I2S_CFG1_REG, ++ cfg1_mask, cfg1_mask); ++ + ret = regmap_update_bits(i2s->regmap, STM32_I2S_CR1_REG, + I2S_CR1_SPE, I2S_CR1_SPE); + if (ret < 0) { +@@ -603,8 +602,8 @@ static int stm32_i2s_trigger(struct snd_pcm_substream *substream, int cmd, + return ret; + } + +- regmap_update_bits(i2s->regmap, STM32_I2S_IFCR_REG, +- I2S_IFCR_MASK, I2S_IFCR_MASK); ++ regmap_write_bits(i2s->regmap, STM32_I2S_IFCR_REG, ++ I2S_IFCR_MASK, I2S_IFCR_MASK); + + if (playback_flg) { + ier = I2S_IER_UDRIE; +diff --git a/sound/soc/stm/stm32_sai.c b/sound/soc/stm/stm32_sai.c +index f22654253c43..540c4a00405c 100644 +--- a/sound/soc/stm/stm32_sai.c ++++ b/sound/soc/stm/stm32_sai.c +@@ -112,16 +112,21 @@ static int stm32_sai_set_sync(struct stm32_sai_data *sai_client, + if (!sai_provider) { + dev_err(&sai_client->pdev->dev, + "SAI sync provider data not found\n"); +- return -EINVAL; ++ ret = -EINVAL; ++ goto out_put_dev; + } + + /* Configure sync client */ + ret = stm32_sai_sync_conf_client(sai_client, synci); + if (ret < 0) +- return ret; ++ goto out_put_dev; + + /* Configure sync provider */ +- return stm32_sai_sync_conf_provider(sai_provider, synco); ++ ret = stm32_sai_sync_conf_provider(sai_provider, synco); ++ ++out_put_dev: ++ put_device(&pdev->dev); ++ return ret; + } + + static int stm32_sai_probe(struct platform_device *pdev) +diff --git a/sound/soc/stm/stm32_sai_sub.c b/sound/soc/stm/stm32_sai_sub.c +index 2fb2b914e78b..6c2e69e32c86 100644 +--- a/sound/soc/stm/stm32_sai_sub.c ++++ b/sound/soc/stm/stm32_sai_sub.c +@@ -994,6 +994,16 @@ static int stm32_sai_pcm_process_spdif(struct snd_pcm_substream *substream, + return 0; + } + ++/* No support of mmap in S/PDIF mode */ ++static const struct snd_pcm_hardware stm32_sai_pcm_hw_spdif = { ++ .info = SNDRV_PCM_INFO_INTERLEAVED, ++ .buffer_bytes_max = 8 * PAGE_SIZE, ++ .period_bytes_min = 1024, ++ .period_bytes_max = PAGE_SIZE, ++ .periods_min = 2, ++ .periods_max = 8, ++}; ++ + static const struct snd_pcm_hardware stm32_sai_pcm_hw = { + .info = SNDRV_PCM_INFO_INTERLEAVED | SNDRV_PCM_INFO_MMAP, + .buffer_bytes_max = 8 * PAGE_SIZE, +@@ -1050,7 +1060,7 @@ static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config = { + }; + + static const struct snd_dmaengine_pcm_config stm32_sai_pcm_config_spdif = { +- .pcm_hardware = &stm32_sai_pcm_hw, ++ .pcm_hardware = &stm32_sai_pcm_hw_spdif, + .prepare_slave_config = snd_dmaengine_pcm_prepare_slave_config, + .process = stm32_sai_pcm_process_spdif, + }; +diff --git a/tools/testing/selftests/bpf/test_sockmap.c b/tools/testing/selftests/bpf/test_sockmap.c +index 0c7d9e556b47..a7fc91bb9119 100644 +--- a/tools/testing/selftests/bpf/test_sockmap.c ++++ b/tools/testing/selftests/bpf/test_sockmap.c +@@ -248,6 +248,10 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, + int i, fp; + + file = fopen(".sendpage_tst.tmp", "w+"); ++ if (!file) { ++ perror("create file for sendpage"); ++ return 1; ++ } + for (i = 0; i < iov_length * cnt; i++, k++) + fwrite(&k, sizeof(char), 1, file); + fflush(file); +@@ -255,6 +259,11 @@ static int msg_loop_sendpage(int fd, int iov_length, int cnt, + fclose(file); + + fp = open(".sendpage_tst.tmp", O_RDONLY); ++ if (fp < 0) { ++ perror("reopen file for sendpage"); ++ return 1; ++ } ++ + clock_gettime(CLOCK_MONOTONIC, &s->start); + for (i = 0; i < cnt; i++) { + int sent = sendfile(fd, fp, NULL, iov_length); +diff --git a/tools/vm/page-types.c b/tools/vm/page-types.c +index 37908a83ddc2..1ff3a6c0367b 100644 +--- a/tools/vm/page-types.c ++++ b/tools/vm/page-types.c +@@ -701,7 +701,7 @@ static void walk_pfn(unsigned long voffset, + if (kpagecgroup_read(cgi, index, pages) != pages) + fatal("kpagecgroup returned fewer pages than expected"); + +- if (kpagecount_read(cnt, index, batch) != pages) ++ if (kpagecount_read(cnt, index, pages) != pages) + fatal("kpagecount returned fewer pages than expected"); + + for (i = 0; i < pages; i++) +diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c +index df3fc0f214ec..9502b1a44232 100644 +--- a/virt/kvm/kvm_main.c ++++ b/virt/kvm/kvm_main.c +@@ -3990,7 +3990,7 @@ static void kvm_uevent_notify_change(unsigned int type, struct kvm *kvm) + } + add_uevent_var(env, "PID=%d", kvm->userspace_pid); + +- if (kvm->debugfs_dentry) { ++ if (!IS_ERR_OR_NULL(kvm->debugfs_dentry)) { + char *tmp, *p = kmalloc(PATH_MAX, GFP_KERNEL); + + if (p) { |