diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/gemini-sq201.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/gemini-sq201.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/gemini-sq201.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/gemini-sq201.dts	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx1-ads.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx1-ads.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx1-ads.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx1-ads.dts	2019-12-05 03:21:36.000000000 -0500
@@ -21,6 +21,7 @@
 	};
 
 	memory@8000000 {
+		device_type = "memory";
 		reg = <0x08000000 0x04000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx1-apf9328.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx1-apf9328.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx1-apf9328.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx1-apf9328.dts	2019-12-05 03:21:36.000000000 -0500
@@ -21,6 +21,7 @@
 	};
 
 	memory@8000000 {
+		device_type = "memory";
 		reg = <0x08000000 0x00800000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx1.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx1.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx1.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx1.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23-evk.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23-evk.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23-evk.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23-evk.dts	2019-12-05 03:21:36.000000000 -0500
@@ -10,6 +10,7 @@
 	compatible = "fsl,imx23-evk", "fsl,imx23";
 
 	memory@40000000 {
+		device_type = "memory";
 		reg = <0x40000000 0x08000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23-olinuxino.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23-olinuxino.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23-olinuxino.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23-olinuxino.dts	2019-12-05 03:21:36.000000000 -0500
@@ -20,6 +20,7 @@
 	compatible = "olimex,imx23-olinuxino", "fsl,imx23";
 
 	memory@40000000 {
+		device_type = "memory";
 		reg = <0x40000000 0x04000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23-sansa.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23-sansa.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23-sansa.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23-sansa.dts	2019-12-05 03:21:36.000000000 -0500
@@ -50,6 +50,7 @@
 	compatible = "sandisk,sansa_fuze_plus", "fsl,imx23";
 
 	memory@40000000 {
+		device_type = "memory";
 		reg = <0x40000000 0x04000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23-stmp378x_devb.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23-stmp378x_devb.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23-stmp378x_devb.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23-stmp378x_devb.dts	2019-12-05 03:21:36.000000000 -0500
@@ -17,6 +17,7 @@
 	compatible = "fsl,stmp378x-devb", "fsl,imx23";
 
 	memory@40000000 {
+		device_type = "memory";
 		reg = <0x40000000 0x04000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23-xfi3.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23-xfi3.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx23-xfi3.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx23-xfi3.dts	2019-12-05 03:21:36.000000000 -0500
@@ -49,6 +49,7 @@
 	compatible = "creative,x-fi3", "fsl,imx23";
 
 	memory@40000000 {
+		device_type = "memory";
 		reg = <0x40000000 0x04000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx25.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx25.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx25.dtsi	2019-12-01 03:56:30.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx25.dtsi	2019-12-05 06:26:05.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx25-eukrea-cpuimx25.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -18,6 +18,7 @@
 	compatible = "eukrea,cpuimx25", "fsl,imx25";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x4000000>; /* 64M */
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx25-karo-tx25.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx25-karo-tx25.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx25-karo-tx25.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx25-karo-tx25.dts	2019-12-05 03:21:36.000000000 -0500
@@ -37,6 +37,7 @@
 	};
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x02000000 0x90000000 0x02000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx25-pdk.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx25-pdk.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx25-pdk.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx25-pdk.dts	2019-12-05 03:21:36.000000000 -0500
@@ -12,6 +12,7 @@
 	compatible = "fsl,imx25-pdk", "fsl,imx25";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x4000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27-apf27.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27-apf27.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27-apf27.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27-apf27.dts	2019-12-05 03:21:36.000000000 -0500
@@ -20,6 +20,7 @@
 	compatible = "armadeus,imx27-apf27", "fsl,imx27";
 
 	memory@a0000000 {
+		device_type = "memory";
 		reg = <0xa0000000 0x04000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27-eukrea-cpuimx27.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -17,6 +17,7 @@
 	compatible = "eukrea,cpuimx27", "fsl,imx27";
 
 	memory@a0000000 {
+		device_type = "memory";
 		reg = <0xa0000000 0x04000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27-pdk.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27-pdk.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27-pdk.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27-pdk.dts	2019-12-05 03:21:36.000000000 -0500
@@ -10,6 +10,7 @@
 	compatible = "fsl,imx27-pdk", "fsl,imx27";
 
 	memory@a0000000 {
+		device_type = "memory";
 		reg = <0xa0000000 0x08000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27-phytec-phycard-s-som.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27-phytec-phycard-s-som.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27-phytec-phycard-s-som.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27-phytec-phycard-s-som.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -18,6 +18,7 @@
 	compatible = "phytec,imx27-pca100", "fsl,imx27";
 
 	memory@a0000000 {
+		device_type = "memory";
 		reg = <0xa0000000 0x08000000>; /* 128MB */
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx27-phytec-phycore-som.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -17,6 +17,7 @@
 	compatible = "phytec,imx27-pcm038", "fsl,imx27";
 
 	memory@a0000000 {
+		device_type = "memory";
 		reg = <0xa0000000 0x08000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx31-bug.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx31-bug.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx31-bug.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx31-bug.dts	2019-12-05 03:21:36.000000000 -0500
@@ -17,6 +17,7 @@
 	compatible = "buglabs,imx31-bug", "fsl,imx31";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x8000000>; /* 128M */
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx31.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx31.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx31.dtsi	2019-12-01 03:56:33.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx31.dtsi	2019-12-05 06:26:09.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx31-lite.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx31-lite.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx31-lite.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx31-lite.dts	2019-12-05 03:21:36.000000000 -0500
@@ -18,6 +18,7 @@
 	};
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x8000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx35.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx35.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx35.dtsi	2019-12-01 03:56:36.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx35.dtsi	2019-12-05 06:26:12.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx35-eukrea-cpuimx35.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx35-eukrea-cpuimx35.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx35-eukrea-cpuimx35.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx35-eukrea-cpuimx35.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -18,6 +18,7 @@
 	compatible = "eukrea,cpuimx35", "fsl,imx35";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x8000000>; /* 128M */
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx35-pdk.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx35-pdk.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx35-pdk.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx35-pdk.dts	2019-12-05 03:21:36.000000000 -0500
@@ -11,6 +11,7 @@
 	compatible = "fsl,imx35-pdk", "fsl,imx35";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x8000000>,
 		      <0x90000000 0x8000000>;
 	};
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx50.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx50.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx50.dtsi	2019-12-01 03:56:38.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx50.dtsi	2019-12-05 06:26:16.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx50-evk.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx50-evk.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx50-evk.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx50-evk.dts	2019-12-05 03:21:36.000000000 -0500
@@ -12,6 +12,7 @@
 	compatible = "fsl,imx50-evk", "fsl,imx50";
 
 	memory@70000000 {
+		device_type = "memory";
 		reg = <0x70000000 0x80000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-apf51.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-apf51.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-apf51.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-apf51.dts	2019-12-05 03:21:36.000000000 -0500
@@ -22,6 +22,7 @@
 	compatible = "armadeus,imx51-apf51", "fsl,imx51";
 
 	memory@90000000 {
+		device_type = "memory";
 		reg = <0x90000000 0x20000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-babbage.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-babbage.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-babbage.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-babbage.dts	2019-12-05 03:21:36.000000000 -0500
@@ -15,6 +15,7 @@
 	};
 
 	memory@90000000 {
+		device_type = "memory";
 		reg = <0x90000000 0x20000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-digi-connectcore-som.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-digi-connectcore-som.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-digi-connectcore-som.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-digi-connectcore-som.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -17,6 +17,7 @@
 	compatible = "digi,connectcore-ccxmx51-som", "fsl,imx51";
 
 	memory@90000000 {
+		device_type = "memory";
 		reg = <0x90000000 0x08000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51.dtsi	2019-12-01 03:56:41.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51.dtsi	2019-12-05 06:26:20.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-eukrea-cpuimx51.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-eukrea-cpuimx51.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-eukrea-cpuimx51.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-eukrea-cpuimx51.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -23,6 +23,7 @@
 	compatible = "eukrea,cpuimx51", "fsl,imx51";
 
 	memory@90000000 {
+		device_type = "memory";
 		reg = <0x90000000 0x10000000>; /* 256M */
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-ts4800.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-ts4800.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-ts4800.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-ts4800.dts	2019-12-05 03:21:36.000000000 -0500
@@ -18,6 +18,7 @@
 	};
 
 	memory@90000000 {
+		device_type = "memory";
 		reg = <0x90000000 0x10000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-zii-rdu1.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-zii-rdu1.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-zii-rdu1.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-zii-rdu1.dts	2019-12-05 03:21:36.000000000 -0500
@@ -53,6 +53,7 @@
 
 	/* Will be filled by the bootloader */
 	memory@90000000 {
+		device_type = "memory";
 		reg = <0x90000000 0>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-zii-scu2-mezz.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-zii-scu2-mezz.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-zii-scu2-mezz.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-zii-scu2-mezz.dts	2019-12-05 03:21:36.000000000 -0500
@@ -18,6 +18,7 @@
 
 	/* Will be filled by the bootloader */
 	memory@90000000 {
+		device_type = "memory";
 		reg = <0x90000000 0>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-zii-scu3-esb.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-zii-scu3-esb.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx51-zii-scu3-esb.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx51-zii-scu3-esb.dts	2019-12-05 03:21:36.000000000 -0500
@@ -18,6 +18,7 @@
 
 	/* Will be filled by the bootloader */
 	memory@90000000 {
+		device_type = "memory";
 		reg = <0x90000000 0>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-ard.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-ard.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-ard.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-ard.dts	2019-12-05 03:21:36.000000000 -0500
@@ -19,6 +19,7 @@
 	compatible = "fsl,imx53-ard", "fsl,imx53";
 
 	memory@70000000 {
+		device_type = "memory";
 		reg = <0x70000000 0x40000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-cx9020.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-cx9020.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-cx9020.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-cx9020.dts	2019-12-05 03:21:36.000000000 -0500
@@ -22,6 +22,7 @@
 	};
 
 	memory@70000000 {
+		device_type = "memory";
 		reg = <0x70000000 0x20000000>,
 		      <0xb0000000 0x20000000>;
 	};
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53.dtsi	2019-12-01 03:56:44.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53.dtsi	2019-12-05 06:26:24.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-m53.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-m53.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-m53.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-m53.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -16,6 +16,7 @@
 	compatible = "aries,imx53-m53", "denx,imx53-m53", "fsl,imx53";
 
 	memory@70000000 {
+		device_type = "memory";
 		reg = <0x70000000 0x20000000>,
 		      <0xb0000000 0x20000000>;
 	};
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-qsb-common.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-qsb-common.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-qsb-common.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-qsb-common.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -11,6 +11,7 @@
 	};
 
 	memory@70000000 {
+		device_type = "memory";
 		reg = <0x70000000 0x20000000>,
 		      <0xb0000000 0x20000000>;
 	};
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-smd.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-smd.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-smd.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-smd.dts	2019-12-05 03:21:36.000000000 -0500
@@ -12,6 +12,7 @@
 	compatible = "fsl,imx53-smd", "fsl,imx53";
 
 	memory@70000000 {
+		device_type = "memory";
 		reg = <0x70000000 0x40000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-tqma53.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-tqma53.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-tqma53.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-tqma53.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -17,6 +17,7 @@
 	compatible = "tq,tqma53", "fsl,imx53";
 
 	memory@70000000 {
+		device_type = "memory";
 		reg = <0x70000000 0x40000000>; /* Up to 1GiB */
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-tx53.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-tx53.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-tx53.dtsi	2019-12-01 03:56:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-tx53.dtsi	2019-12-05 06:26:28.000000000 -0500
@@ -51,6 +51,7 @@
 
 	/* Will be filled by the bootloader */
 	memory@70000000 {
+		device_type = "memory";
 		reg = <0x70000000 0>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-usbarmory.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-usbarmory.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-usbarmory.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-usbarmory.dts	2019-12-05 03:21:36.000000000 -0500
@@ -58,6 +58,7 @@
 	};
 
 	memory@70000000 {
+		device_type = "memory";
 		reg = <0x70000000 0x20000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-voipac-dmm-668.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-voipac-dmm-668.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx53-voipac-dmm-668.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx53-voipac-dmm-668.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sl.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sl.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sl.dtsi	2019-12-01 03:56:53.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sl.dtsi	2019-12-05 06:26:37.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sl-evk.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sl-evk.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sl-evk.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sl-evk.dts	2019-12-05 03:21:36.000000000 -0500
@@ -17,6 +17,7 @@
 	};
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x40000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sll-evk.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sll-evk.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sll-evk.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sll-evk.dts	2019-12-05 03:21:36.000000000 -0500
@@ -20,6 +20,7 @@
 	};
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x80000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sl-warp.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sl-warp.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sl-warp.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sl-warp.dts	2019-12-05 03:21:36.000000000 -0500
@@ -55,6 +55,7 @@
 	compatible = "warp,imx6sl-warp", "fsl,imx6sl";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x20000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx.dtsi	2019-12-01 03:56:59.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx.dtsi	2019-12-05 06:26:46.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-nitrogen6sx.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-nitrogen6sx.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-nitrogen6sx.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-nitrogen6sx.dts	2019-12-05 03:21:36.000000000 -0500
@@ -12,6 +12,7 @@
 	compatible = "boundary,imx6sx-nitrogen6sx", "fsl,imx6sx";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x40000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-sabreauto.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-sabreauto.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-sabreauto.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-sabreauto.dts	2019-12-05 03:21:36.000000000 -0500
@@ -11,6 +11,7 @@
 	compatible = "fsl,imx6sx-sabreauto", "fsl,imx6sx";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x80000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-sdb.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-sdb.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-sdb.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-sdb.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -21,6 +21,7 @@
 	};
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x40000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-softing-vining-2000.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-softing-vining-2000.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-softing-vining-2000.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-softing-vining-2000.dts	2019-12-05 03:21:36.000000000 -0500
@@ -21,6 +21,7 @@
 	};
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x40000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-basic.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-basic.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-basic.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-basic.dts	2019-12-05 03:21:36.000000000 -0500
@@ -49,6 +49,7 @@
 	compatible = "udoo,neobasic", "fsl,imx6sx";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x20000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-extended.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-extended.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-extended.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-extended.dts	2019-12-05 03:21:36.000000000 -0500
@@ -49,6 +49,7 @@
 	compatible = "udoo,neoextended", "fsl,imx6sx";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x40000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-full.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-full.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-full.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6sx-udoo-neo-full.dts	2019-12-05 03:21:36.000000000 -0500
@@ -49,6 +49,7 @@
 	compatible = "udoo,neofull", "fsl,imx6sx";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x40000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-14x14-evk.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -12,6 +12,7 @@
 	};
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x20000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul.dtsi	2019-12-01 03:57:03.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul.dtsi	2019-12-05 06:26:51.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-geam.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-geam.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-geam.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-geam.dts	2019-12-05 03:21:36.000000000 -0500
@@ -51,6 +51,7 @@
 	compatible = "engicam,imx6ul-geam", "fsl,imx6ul";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x08000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-isiot.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-isiot.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-isiot.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-isiot.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -46,6 +46,7 @@
 
 / {
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x20000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ull-colibri-nonwifi.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ull-colibri-nonwifi.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ull-colibri-nonwifi.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ull-colibri-nonwifi.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -7,6 +7,7 @@
 
 / {
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x10000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ull-colibri-wifi.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -7,6 +7,7 @@
 
 / {
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x20000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-litesom.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-litesom.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-litesom.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-litesom.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -48,6 +48,7 @@
 	compatible = "grinn,imx6ul-litesom", "fsl,imx6ul";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x20000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-opos6ul.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-opos6ul.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-opos6ul.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-opos6ul.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -49,6 +49,7 @@
 
 / {
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0>; /* will be filled by U-Boot */
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-pico-hobbit.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-pico-hobbit.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-pico-hobbit.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-pico-hobbit.dts	2019-12-05 03:21:36.000000000 -0500
@@ -53,6 +53,7 @@
 
 	/* Will be filled by the bootloader */
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-tx6ul.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-tx6ul.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx6ul-tx6ul.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx6ul-tx6ul.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -71,6 +71,7 @@
 	};
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0>; /* will be filled by U-Boot */
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-cl-som-imx7.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-cl-som-imx7.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-cl-som-imx7.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-cl-som-imx7.dts	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-colibri.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-colibri.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-colibri.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-colibri.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -45,6 +45,7 @@
 
 / {
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x20000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-colibri-emmc.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -8,6 +8,7 @@
 
 / {
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x40000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-nitrogen7.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-nitrogen7.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-nitrogen7.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-nitrogen7.dts	2019-12-05 03:21:36.000000000 -0500
@@ -12,6 +12,7 @@
 	compatible = "boundary,imx7d-nitrogen7", "fsl,imx7d";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x40000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-pico.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-pico.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-pico.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-pico.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -49,6 +49,7 @@
 	compatible = "technexion,imx7d-pico", "fsl,imx7d";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x80000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-sdb.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-sdb.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7d-sdb.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7d-sdb.dts	2019-12-05 03:21:36.000000000 -0500
@@ -15,6 +15,7 @@
 	};
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x80000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7s-colibri.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7s-colibri.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7s-colibri.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7s-colibri.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -45,6 +45,7 @@
 
 / {
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x10000000>;
 	};
 };
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7s.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7s.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7s.dtsi	2019-12-01 03:57:06.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7s.dtsi	2019-12-05 06:26:56.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7s-warp.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7s-warp.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/imx7s-warp.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/imx7s-warp.dts	2019-12-05 03:21:36.000000000 -0500
@@ -51,6 +51,7 @@
 	compatible = "warp,imx7s-warp", "fsl,imx7s";
 
 	memory@80000000 {
+		device_type = "memory";
 		reg = <0x80000000 0x20000000>;
 	};
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/omap4-l4.dtsi linux-libre-4.19.88-gnu/arch/arm/boot/dts/omap4-l4.dtsi
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/omap4-l4.dtsi	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/omap4-l4.dtsi	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts
--- linux-libre-4.19.87-gnu/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts	2019-12-05 03:21:36.000000000 -0500
@@ -171,6 +171,7 @@
 	vqmmc-supply = <&reg_dldo1>;
 	non-removable;
 	wakeup-source;
+	keep-power-in-suspend;
 	status = "okay";
 
 	brcmf: wifi@1 {
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/Kconfig.debug linux-libre-4.19.88-gnu/arch/arm/Kconfig.debug
--- linux-libre-4.19.87-gnu/arch/arm/Kconfig.debug	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/Kconfig.debug	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/mach-ks8695/board-acs5k.c linux-libre-4.19.88-gnu/arch/arm/mach-ks8695/board-acs5k.c
--- linux-libre-4.19.87-gnu/arch/arm/mach-ks8695/board-acs5k.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/mach-ks8695/board-acs5k.c	2019-12-05 03:21:36.000000000 -0500
@@ -100,7 +100,7 @@ static struct i2c_board_info acs5k_i2c_d
 	},
 };
 
-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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/mach-omap1/include/mach/usb.h linux-libre-4.19.88-gnu/arch/arm/mach-omap1/include/mach/usb.h
--- linux-libre-4.19.87-gnu/arch/arm/mach-omap1/include/mach/usb.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/mach-omap1/include/mach/usb.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm/mach-omap1/Makefile linux-libre-4.19.88-gnu/arch/arm/mach-omap1/Makefile
--- linux-libre-4.19.87-gnu/arch/arm/mach-omap1/Makefile	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm/mach-omap1/Makefile	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm64/boot/dts/renesas/r8a77995-draak.dts linux-libre-4.19.88-gnu/arch/arm64/boot/dts/renesas/r8a77995-draak.dts
--- linux-libre-4.19.87-gnu/arch/arm64/boot/dts/renesas/r8a77995-draak.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm64/boot/dts/renesas/r8a77995-draak.dts	2019-12-05 03:21:36.000000000 -0500
@@ -188,7 +188,7 @@
 		compatible = "adi,adv7180cp";
 		reg = <0x20>;
 
-		port {
+		ports {
 			#address-cells = <1>;
 			#size-cells = <0>;
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm64/include/asm/assembler.h linux-libre-4.19.88-gnu/arch/arm64/include/asm/assembler.h
--- linux-libre-4.19.87-gnu/arch/arm64/include/asm/assembler.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm64/include/asm/assembler.h	2019-12-05 03:21:36.000000000 -0500
@@ -683,11 +683,9 @@ USER(\label, ic	ivau, \tmp2)			// invali
 	.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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm64/kernel/entry.S linux-libre-4.19.88-gnu/arch/arm64/kernel/entry.S
--- linux-libre-4.19.87-gnu/arch/arm64/kernel/entry.S	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm64/kernel/entry.S	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm64/kernel/head.S linux-libre-4.19.88-gnu/arch/arm64/kernel/head.S
--- linux-libre-4.19.87-gnu/arch/arm64/kernel/head.S	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm64/kernel/head.S	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/arm64/kernel/smp.c linux-libre-4.19.88-gnu/arch/arm64/kernel/smp.c
--- linux-libre-4.19.87-gnu/arch/arm64/kernel/smp.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/arm64/kernel/smp.c	2019-12-05 03:21:36.000000000 -0500
@@ -108,6 +108,7 @@ static int boot_secondary(unsigned int c
 }
 
 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 ta
 
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/microblaze/boot/Makefile linux-libre-4.19.88-gnu/arch/microblaze/boot/Makefile
--- linux-libre-4.19.87-gnu/arch/microblaze/boot/Makefile	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/microblaze/boot/Makefile	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/microblaze/Makefile linux-libre-4.19.88-gnu/arch/microblaze/Makefile
--- linux-libre-4.19.87-gnu/arch/microblaze/Makefile	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/microblaze/Makefile	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/openrisc/kernel/entry.S linux-libre-4.19.88-gnu/arch/openrisc/kernel/entry.S
--- linux-libre-4.19.87-gnu/arch/openrisc/kernel/entry.S	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/openrisc/kernel/entry.S	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/openrisc/kernel/head.S linux-libre-4.19.88-gnu/arch/openrisc/kernel/head.S
--- linux-libre-4.19.87-gnu/arch/openrisc/kernel/head.S	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/openrisc/kernel/head.S	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/boot/dts/bamboo.dts linux-libre-4.19.88-gnu/arch/powerpc/boot/dts/bamboo.dts
--- linux-libre-4.19.87-gnu/arch/powerpc/boot/dts/bamboo.dts	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/boot/dts/bamboo.dts	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/include/asm/cputable.h linux-libre-4.19.88-gnu/arch/powerpc/include/asm/cputable.h
--- linux-libre-4.19.87-gnu/arch/powerpc/include/asm/cputable.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/include/asm/cputable.h	2019-12-05 03:21:36.000000000 -0500
@@ -44,6 +44,7 @@ extern int machine_check_e500(struct pt_
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/include/asm/reg.h linux-libre-4.19.88-gnu/arch/powerpc/include/asm/reg.h
--- linux-libre-4.19.87-gnu/arch/powerpc/include/asm/reg.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/include/asm/reg.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/kernel/cputable.c linux-libre-4.19.88-gnu/arch/powerpc/kernel/cputable.c
--- linux-libre-4.19.87-gnu/arch/powerpc/kernel/cputable.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/kernel/cputable.c	2019-12-05 03:21:36.000000000 -0500
@@ -1141,6 +1141,7 @@ static struct cpu_spec __initdata cpu_sp
 		.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_sp
 		.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_sp
 		.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_sp
 		.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_sp
 		.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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/kernel/exceptions-64s.S linux-libre-4.19.88-gnu/arch/powerpc/kernel/exceptions-64s.S
--- linux-libre-4.19.87-gnu/arch/powerpc/kernel/exceptions-64s.S	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/kernel/exceptions-64s.S	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/kernel/prom.c linux-libre-4.19.88-gnu/arch/powerpc/kernel/prom.c
--- linux-libre-4.19.87-gnu/arch/powerpc/kernel/prom.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/kernel/prom.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 *par
 {
 	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 *par
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/Makefile linux-libre-4.19.88-gnu/arch/powerpc/Makefile
--- linux-libre-4.19.87-gnu/arch/powerpc/Makefile	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/Makefile	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/mm/fault.c linux-libre-4.19.88-gnu/arch/powerpc/mm/fault.c
--- linux-libre-4.19.87-gnu/arch/powerpc/mm/fault.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/mm/fault.c	2019-12-05 03:21:36.000000000 -0500
@@ -633,21 +633,22 @@ void bad_page_fault(struct pt_regs *regs
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/mm/ppc_mmu_32.c linux-libre-4.19.88-gnu/arch/powerpc/mm/ppc_mmu_32.c
--- linux-libre-4.19.87-gnu/arch/powerpc/mm/ppc_mmu_32.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/mm/ppc_mmu_32.c	2019-12-05 03:21:36.000000000 -0500
@@ -52,7 +52,7 @@ struct batrange {		/* stores address ran
 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
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/net/bpf_jit_comp64.c linux-libre-4.19.88-gnu/arch/powerpc/net/bpf_jit_comp64.c
--- linux-libre-4.19.87-gnu/arch/powerpc/net/bpf_jit_comp64.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/net/bpf_jit_comp64.c	2019-12-05 03:21:36.000000000 -0500
@@ -950,6 +950,19 @@ struct bpf_prog *bpf_int_jit_compile(str
 	}
 
 	/*
+	 * 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
 	 * calculate total size from idx.
diff -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/perf/isa207-common.c linux-libre-4.19.88-gnu/arch/powerpc/perf/isa207-common.c
--- linux-libre-4.19.87-gnu/arch/powerpc/perf/isa207-common.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/perf/isa207-common.c	2019-12-05 03:21:36.000000000 -0500
@@ -148,6 +148,14 @@ static bool is_thresh_cmp_valid(u64 even
 	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, uns
 		 * 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
 		/* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/perf/isa207-common.h linux-libre-4.19.88-gnu/arch/powerpc/perf/isa207-common.h
--- linux-libre-4.19.87-gnu/arch/powerpc/perf/isa207-common.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/perf/isa207-common.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/platforms/83xx/misc.c linux-libre-4.19.88-gnu/arch/powerpc/platforms/83xx/misc.c
--- linux-libre-4.19.87-gnu/arch/powerpc/platforms/83xx/misc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/platforms/83xx/misc.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/platforms/powernv/eeh-powernv.c linux-libre-4.19.88-gnu/arch/powerpc/platforms/powernv/eeh-powernv.c
--- linux-libre-4.19.87-gnu/arch/powerpc/platforms/powernv/eeh-powernv.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/platforms/powernv/eeh-powernv.c	2019-12-05 03:21:36.000000000 -0500
@@ -578,8 +578,8 @@ static void pnv_eeh_get_phb_diag(struct
 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
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/platforms/powernv/pci.c linux-libre-4.19.88-gnu/arch/powerpc/platforms/powernv/pci.c
--- linux-libre-4.19.87-gnu/arch/powerpc/platforms/powernv/pci.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/platforms/powernv/pci.c	2019-12-05 03:21:36.000000000 -0500
@@ -602,8 +602,8 @@ static void pnv_pci_handle_eeh_config(st
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/platforms/powernv/pci-ioda.c linux-libre-4.19.88-gnu/arch/powerpc/platforms/powernv/pci-ioda.c
--- linux-libre-4.19.87-gnu/arch/powerpc/platforms/powernv/pci-ioda.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/platforms/powernv/pci-ioda.c	2019-12-05 03:21:36.000000000 -0500
@@ -605,8 +605,8 @@ static int pnv_ioda_unfreeze_pe(struct p
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/platforms/pseries/dlpar.c linux-libre-4.19.88-gnu/arch/powerpc/platforms/pseries/dlpar.c
--- linux-libre-4.19.87-gnu/arch/powerpc/platforms/pseries/dlpar.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/platforms/pseries/dlpar.c	2019-12-05 03:21:36.000000000 -0500
@@ -63,6 +63,10 @@ static struct property *dlpar_parse_cc_p
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/platforms/pseries/hotplug-memory.c linux-libre-4.19.88-gnu/arch/powerpc/platforms/pseries/hotplug-memory.c
--- linux-libre-4.19.87-gnu/arch/powerpc/platforms/pseries/hotplug-memory.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/platforms/pseries/hotplug-memory.c	2019-12-05 03:21:36.000000000 -0500
@@ -202,6 +202,7 @@ static int update_lmb_associativity_inde
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/powerpc/xmon/xmon.c linux-libre-4.19.88-gnu/arch/powerpc/xmon/xmon.c
--- linux-libre-4.19.87-gnu/arch/powerpc/xmon/xmon.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/powerpc/xmon/xmon.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/s390/kvm/kvm-s390.c linux-libre-4.19.88-gnu/arch/s390/kvm/kvm-s390.c
--- linux-libre-4.19.87-gnu/arch/s390/kvm/kvm-s390.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/s390/kvm/kvm-s390.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/s390/mm/gup.c linux-libre-4.19.88-gnu/arch/s390/mm/gup.c
--- linux-libre-4.19.87-gnu/arch/s390/mm/gup.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/s390/mm/gup.c	2019-12-05 03:21:36.000000000 -0500
@@ -39,7 +39,8 @@ static inline int gup_pte_range(pmd_t *p
 		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 *pm
 		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
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/um/drivers/vector_user.c linux-libre-4.19.88-gnu/arch/um/drivers/vector_user.c
--- linux-libre-4.19.87-gnu/arch/um/drivers/vector_user.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/um/drivers/vector_user.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/um/Kconfig.debug linux-libre-4.19.88-gnu/arch/um/Kconfig.debug
--- linux-libre-4.19.87-gnu/arch/um/Kconfig.debug	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/um/Kconfig.debug	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c linux-libre-4.19.88-gnu/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c
--- linux-libre-4.19.87-gnu/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/x86/kernel/cpu/intel_rdt_ctrlmondata.c	2019-12-05 03:21:36.000000000 -0500
@@ -459,6 +459,10 @@ int rdtgroup_mondata_show(struct seq_fil
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/x86/kernel/kprobes/core.c linux-libre-4.19.88-gnu/arch/x86/kernel/kprobes/core.c
--- linux-libre-4.19.87-gnu/arch/x86/kernel/kprobes/core.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/x86/kernel/kprobes/core.c	2019-12-05 03:21:36.000000000 -0500
@@ -1140,6 +1140,12 @@ bool arch_within_kprobe_blacklist(unsign
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/x86/kvm/vmx.c linux-libre-4.19.88-gnu/arch/x86/kvm/vmx.c
--- linux-libre-4.19.87-gnu/arch/x86/kvm/vmx.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/x86/kvm/vmx.c	2019-12-05 03:21:36.000000000 -0500
@@ -3404,9 +3404,6 @@ static void setup_msrs(struct vcpu_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 *
 	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_v
 	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(struc
 	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(struc
 		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_vcp
 	 */
 	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
 	}
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/arch/x86/xen/xen-asm_64.S linux-libre-4.19.88-gnu/arch/x86/xen/xen-asm_64.S
--- linux-libre-4.19.87-gnu/arch/x86/xen/xen-asm_64.S	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/arch/x86/xen/xen-asm_64.S	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/crypto/crypto_user.c linux-libre-4.19.88-gnu/crypto/crypto_user.c
--- linux-libre-4.19.87-gnu/crypto/crypto_user.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/crypto/crypto_user.c	2019-12-05 03:21:36.000000000 -0500
@@ -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
 	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
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/Documentation/hid/uhid.txt linux-libre-4.19.88-gnu/Documentation/hid/uhid.txt
--- linux-libre-4.19.87-gnu/Documentation/hid/uhid.txt	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/Documentation/hid/uhid.txt	2019-12-05 03:21:36.000000000 -0500
@@ -160,7 +160,7 @@ them but you should handle them accordin
   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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/acpi/acpi_lpss.c linux-libre-4.19.88-gnu/drivers/acpi/acpi_lpss.c
--- linux-libre-4.19.87-gnu/drivers/acpi/acpi_lpss.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/acpi/acpi_lpss.c	2019-12-05 03:21:36.000000000 -0500
@@ -665,12 +665,7 @@ static int acpi_lpss_create_device(struc
 	 * 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/acpi/apei/ghes.c linux-libre-4.19.88-gnu/drivers/acpi/apei/ghes.c
--- linux-libre-4.19.87-gnu/drivers/acpi/apei/ghes.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/acpi/apei/ghes.c	2019-12-05 03:21:36.000000000 -0500
@@ -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
 
 		sev = ghes_severity(ghes->estatus->error_severity);
 		if (sev >= GHES_SEV_PANIC) {
-			oops_begin();
 			ghes_print_queued_estatus();
 			__ghes_panic(ghes);
 		}
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/ata/ahci_mvebu.c linux-libre-4.19.88-gnu/drivers/ata/ahci_mvebu.c
--- linux-libre-4.19.87-gnu/drivers/ata/ahci_mvebu.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/ata/ahci_mvebu.c	2019-12-05 03:21:36.000000000 -0500
@@ -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(str
 	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 plat
 {
 	struct ata_host *host = platform_get_drvdata(pdev);
 	struct ahci_host_priv *hpriv = host->private_data;
-	const struct mbus_dram_target_info *dram;
-
-	dram = mv_mbus_dram_info();
-	if (dram)
-		ahci_mvebu_mbus_config(hpriv, dram);
+	const struct ahci_mvebu_plat_data *pdata = hpriv->plat_data;
 
-	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_pl
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/base/platform.c linux-libre-4.19.88-gnu/drivers/base/platform.c
--- linux-libre-4.19.87-gnu/drivers/base/platform.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/base/platform.c	2019-12-05 03:21:36.000000000 -0500
@@ -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_
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/block/drbd/drbd_main.c linux-libre-4.19.88-gnu/drivers/block/drbd/drbd_main.c
--- linux-libre-4.19.87-gnu/drivers/block/drbd/drbd_main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/block/drbd/drbd_main.c	2019-12-05 03:21:36.000000000 -0500
@@ -796,7 +796,6 @@ int __drbd_send_protocol(struct drbd_con
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/block/drbd/drbd_nl.c linux-libre-4.19.88-gnu/drivers/block/drbd/drbd_nl.c
--- linux-libre-4.19.87-gnu/drivers/block/drbd/drbd_nl.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/block/drbd/drbd_nl.c	2019-12-05 03:21:36.000000000 -0500
@@ -1515,6 +1515,30 @@ static void sanitize_disk_conf(struct dr
 	}
 }
 
+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 *s
 		}
 	}
 
-	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,
 		}
 	}
 
-	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/block/drbd/drbd_receiver.c linux-libre-4.19.88-gnu/drivers/block/drbd/drbd_receiver.c
--- linux-libre-4.19.87-gnu/drivers/block/drbd/drbd_receiver.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/block/drbd/drbd_receiver.c	2019-12-05 03:21:36.000000000 -0500
@@ -3980,6 +3980,7 @@ static int receive_sizes(struct drbd_con
 	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_con
 	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_con
 	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_con
 		/* 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_con
 		 *
 		 * 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_con
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/block/drbd/drbd_state.h linux-libre-4.19.88-gnu/drivers/block/drbd/drbd_state.h
--- linux-libre-4.19.87-gnu/drivers/block/drbd/drbd_state.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/block/drbd/drbd_state.h	2019-12-05 03:21:36.000000000 -0500
@@ -131,7 +131,7 @@ extern enum drbd_state_rv _drbd_set_stat
 					  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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/bluetooth/hci_bcm.c linux-libre-4.19.88-gnu/drivers/bluetooth/hci_bcm.c
--- linux-libre-4.19.87-gnu/drivers/bluetooth/hci_bcm.c	2019-12-01 04:13:06.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/bluetooth/hci_bcm.c	2019-12-05 06:45:29.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/bus/ti-sysc.c linux-libre-4.19.88-gnu/drivers/bus/ti-sysc.c
--- linux-libre-4.19.87-gnu/drivers/bus/ti-sysc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/bus/ti-sysc.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 s
 		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_
 	  .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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/char/hw_random/stm32-rng.c linux-libre-4.19.88-gnu/drivers/char/hw_random/stm32-rng.c
--- linux-libre-4.19.87-gnu/drivers/char/hw_random/stm32-rng.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/char/hw_random/stm32-rng.c	2019-12-05 03:21:36.000000000 -0500
@@ -169,6 +169,13 @@ static int stm32_rng_probe(struct platfo
 	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_
 		.of_match_table = stm32_rng_match,
 	},
 	.probe = stm32_rng_probe,
+	.remove = stm32_rng_remove,
 };
 
 module_platform_driver(stm32_rng_driver);
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clk/at91/clk-generated.c linux-libre-4.19.88-gnu/drivers/clk/at91/clk-generated.c
--- linux-libre-4.19.87-gnu/drivers/clk/at91/clk-generated.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clk/at91/clk-generated.c	2019-12-05 03:21:36.000000000 -0500
@@ -284,7 +284,7 @@ static void clk_generated_startup(struct
 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 regma
 	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_genera
 	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_genera
 		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_genera
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clk/at91/clk-main.c linux-libre-4.19.88-gnu/drivers/clk/at91/clk-main.c
--- linux-libre-4.19.87-gnu/drivers/clk/at91/clk-main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clk/at91/clk-main.c	2019-12-05 03:21:36.000000000 -0500
@@ -162,7 +162,7 @@ at91_clk_register_main_osc(struct 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(stru
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clk/at91/sckc.c linux-libre-4.19.88-gnu/drivers/clk/at91/sckc.c
--- linux-libre-4.19.87-gnu/drivers/clk/at91/sckc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clk/at91/sckc.c	2019-12-05 03:21:36.000000000 -0500
@@ -74,7 +74,10 @@ static int clk_slow_osc_prepare(struct c
 
 	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(struc
 
 	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(st
 
 	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(
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clk/clk-stm32mp1.c linux-libre-4.19.88-gnu/drivers/clk/clk-stm32mp1.c
--- linux-libre-4.19.87-gnu/drivers/clk/clk-stm32mp1.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clk/clk-stm32mp1.c	2019-12-05 03:21:36.000000000 -0500
@@ -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_di
 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 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_mu
 
 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 stm32mp
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clk/meson/gxbb.c linux-libre-4.19.88-gnu/drivers/clk/meson/gxbb.c
--- linux-libre-4.19.87-gnu/drivers/clk/meson/gxbb.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clk/meson/gxbb.c	2019-12-05 03:21:36.000000000 -0500
@@ -836,6 +836,7 @@ static struct clk_regmap gxbb_sar_adc_cl
 		.ops = &clk_regmap_divider_ops,
 		.parent_names = (const char *[]){ "sar_adc_clk_sel" },
 		.num_parents = 1,
+		.flags = CLK_SET_RATE_PARENT,
 	},
 };
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clk/samsung/clk-exynos5420.c linux-libre-4.19.88-gnu/drivers/clk/samsung/clk-exynos5420.c
--- linux-libre-4.19.87-gnu/drivers/clk/samsung/clk-exynos5420.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clk/samsung/clk-exynos5420.c	2019-12-05 03:21:36.000000000 -0500
@@ -171,12 +171,18 @@ static const unsigned long exynos5x_clk_
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clk/samsung/clk-exynos5433.c linux-libre-4.19.88-gnu/drivers/clk/samsung/clk-exynos5433.c
--- linux-libre-4.19.87-gnu/drivers/clk/samsung/clk-exynos5433.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clk/samsung/clk-exynos5433.c	2019-12-05 03:21:36.000000000 -0500
@@ -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(s
 
 	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(s
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clk/sunxi/clk-sunxi.c linux-libre-4.19.88-gnu/drivers/clk/sunxi/clk-sunxi.c
--- linux-libre-4.19.87-gnu/drivers/clk/sunxi/clk-sunxi.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clk/sunxi/clk-sunxi.c	2019-12-05 03:21:36.000000000 -0500
@@ -1086,8 +1086,8 @@ static struct clk ** __init sunxi_divs_c
 						 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clk/sunxi-ng/ccu-sun9i-a80.c linux-libre-4.19.88-gnu/drivers/clk/sunxi-ng/ccu-sun9i-a80.c
--- linux-libre-4.19.87-gnu/drivers/clk/sunxi-ng/ccu-sun9i-a80.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clk/sunxi-ng/ccu-sun9i-a80.c	2019-12-05 03:21:36.000000000 -0500
@@ -1231,7 +1231,7 @@ static int sun9i_a80_ccu_probe(struct pl
 
 	/* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clk/ti/clkctrl.c linux-libre-4.19.88-gnu/drivers/clk/ti/clkctrl.c
--- linux-libre-4.19.87-gnu/drivers/clk/ti/clkctrl.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clk/ti/clkctrl.c	2019-12-05 03:21:36.000000000 -0500
@@ -100,11 +100,12 @@ static bool _omap4_is_timeout(union omap
 	 * 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clk/ti/clk-dra7-atl.c linux-libre-4.19.88-gnu/drivers/clk/ti/clk-dra7-atl.c
--- linux-libre-4.19.87-gnu/drivers/clk/ti/clk-dra7-atl.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clk/ti/clk-dra7-atl.c	2019-12-05 03:21:36.000000000 -0500
@@ -174,7 +174,6 @@ static void __init of_dra7_atl_clock_set
 	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_set
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clocksource/timer-fttmr010.c linux-libre-4.19.88-gnu/drivers/clocksource/timer-fttmr010.c
--- linux-libre-4.19.87-gnu/drivers/clocksource/timer-fttmr010.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clocksource/timer-fttmr010.c	2019-12-05 03:21:36.000000000 -0500
@@ -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
 	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(st
 
 	/* 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(s
 	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(s
 	}
 
 	/*
-	 * 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(s
 	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(s
 	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(s
 
 #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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/clocksource/timer-mediatek.c linux-libre-4.19.88-gnu/drivers/clocksource/timer-mediatek.c
--- linux-libre-4.19.87-gnu/drivers/clocksource/timer-mediatek.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/clocksource/timer-mediatek.c	2019-12-05 03:21:36.000000000 -0500
@@ -277,15 +277,12 @@ static int __init mtk_syst_init(struct d
 
 	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 de
 
 	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 de
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/crypto/chelsio/chtls/chtls.h linux-libre-4.19.88-gnu/drivers/crypto/chelsio/chtls/chtls.h
--- linux-libre-4.19.87-gnu/drivers/crypto/chelsio/chtls/chtls.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/crypto/chelsio/chtls/chtls.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/crypto/chelsio/chtls/chtls_main.c linux-libre-4.19.88-gnu/drivers/crypto/chelsio/chtls/chtls_main.c
--- linux-libre-4.19.87-gnu/drivers/crypto/chelsio/chtls/chtls_main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/crypto/chelsio/chtls/chtls_main.c	2019-12-05 03:21:36.000000000 -0500
@@ -55,24 +55,19 @@ static void unregister_listen_notifier(s
 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 soc
 	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 soc
 		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(&notify_mutex);
 	err = raw_notifier_call_chain(&listen_notify_list,
-				      CHTLS_LISTEN_START, sk);
+				      CHTLS_LISTEN_START, clisten);
 	mutex_unlock(&notify_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(&notify_mutex);
 	raw_notifier_call_chain(&listen_notify_list,
-				CHTLS_LISTEN_STOP, sk);
+				CHTLS_LISTEN_STOP, clisten);
 	mutex_unlock(&notify_mutex);
 }
 
@@ -138,15 +146,19 @@ static int chtls_inline_feature(struct t
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/crypto/mxc-scc.c linux-libre-4.19.88-gnu/drivers/crypto/mxc-scc.c
--- linux-libre-4.19.87-gnu/drivers/crypto/mxc-scc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/crypto/mxc-scc.c	2019-12-05 03:21:36.000000000 -0500
@@ -178,12 +178,12 @@ static int mxc_scc_get_data(struct mxc_s
 	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_s
 	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(stru
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/crypto/stm32/stm32-hash.c linux-libre-4.19.88-gnu/drivers/crypto/stm32/stm32-hash.c
--- linux-libre-4.19.87-gnu/drivers/crypto/stm32/stm32-hash.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/crypto/stm32/stm32-hash.c	2019-12-05 03:21:36.000000000 -0500
@@ -365,7 +365,7 @@ static int stm32_hash_xmit_cpu(struct st
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/dma/stm32-dma.c linux-libre-4.19.88-gnu/drivers/dma/stm32-dma.c
--- linux-libre-4.19.87-gnu/drivers/dma/stm32-dma.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/dma/stm32-dma.c	2019-12-05 03:21:36.000000000 -0500
@@ -308,20 +308,12 @@ static bool stm32_dma_fifo_threshold_is_
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/firmware/arm_sdei.c linux-libre-4.19.88-gnu/drivers/firmware/arm_sdei.c
--- linux-libre-4.19.87-gnu/drivers/firmware/arm_sdei.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/firmware/arm_sdei.c	2019-12-05 03:21:36.000000000 -0500
@@ -1009,7 +1009,6 @@ static struct platform_driver sdei_drive
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/gpio/gpio-pca953x.c linux-libre-4.19.88-gnu/drivers/gpio/gpio-pca953x.c
--- linux-libre-4.19.87-gnu/drivers/gpio/gpio-pca953x.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/gpio/gpio-pca953x.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/gpio/gpio-raspberrypi-exp.c linux-libre-4.19.88-gnu/drivers/gpio/gpio-raspberrypi-exp.c
--- linux-libre-4.19.87-gnu/drivers/gpio/gpio-raspberrypi-exp.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/gpio/gpio-raspberrypi-exp.c	2019-12-05 03:21:36.000000000 -0500
@@ -206,6 +206,7 @@ static int rpi_exp_gpio_probe(struct pla
 	}
 
 	fw = rpi_firmware_get(fw_node);
+	of_node_put(fw_node);
 	if (!fw)
 		return -EPROBE_DEFER;
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c linux-libre-4.19.88-gnu/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c
--- linux-libre-4.19.87-gnu/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c	2019-12-05 03:21:36.000000000 -0500
@@ -382,7 +382,7 @@ atmel_hlcdc_plane_update_general_setting
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/gpu/ipu-v3/ipu-pre.c linux-libre-4.19.88-gnu/drivers/gpu/ipu-v3/ipu-pre.c
--- linux-libre-4.19.87-gnu/drivers/gpu/ipu-v3/ipu-pre.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/gpu/ipu-v3/ipu-pre.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 *p
 
 	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 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/hid/hid-core.c linux-libre-4.19.88-gnu/drivers/hid/hid-core.c
--- linux-libre-4.19.87-gnu/drivers/hid/hid-core.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/hid/hid-core.c	2019-12-05 03:21:36.000000000 -0500
@@ -212,6 +212,18 @@ static unsigned hid_lookup_collection(st
 }
 
 /*
+ * 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_pars
 		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_p
  * 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_pa
 	__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_pars
 	__u32 data;
 	int i;
 
-	hid_concatenate_usage_page(parser);
+	hid_concatenate_last_usage_page(parser);
 
 	data = item_udata(item);
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/hid/intel-ish-hid/ishtp-hid.c linux-libre-4.19.88-gnu/drivers/hid/intel-ish-hid/ishtp-hid.c
--- linux-libre-4.19.87-gnu/drivers/hid/intel-ish-hid/ishtp-hid.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/hid/intel-ish-hid/ishtp-hid.c	2019-12-05 03:21:36.000000000 -0500
@@ -222,7 +222,7 @@ int ishtp_hid_probe(unsigned int cur_hid
 err_hid_device:
 	kfree(hid_data);
 err_hid_data:
-	kfree(hid);
+	hid_destroy_device(hid);
 	return rv;
 }
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/infiniband/hw/bnxt_re/qplib_sp.c linux-libre-4.19.88-gnu/drivers/infiniband/hw/bnxt_re/qplib_sp.c
--- linux-libre-4.19.87-gnu/drivers/infiniband/hw/bnxt_re/qplib_sp.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/infiniband/hw/bnxt_re/qplib_sp.c	2019-12-05 03:21:36.000000000 -0500
@@ -775,9 +775,8 @@ int bnxt_qplib_map_tc2cos(struct bnxt_qp
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/infiniband/hw/hns/hns_roce_hw_v2.c linux-libre-4.19.88-gnu/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
--- linux-libre-4.19.87-gnu/drivers/infiniband/hw/hns/hns_roce_hw_v2.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/infiniband/hw/hns/hns_roce_hw_v2.c	2019-12-05 03:21:36.000000000 -0500
@@ -1776,6 +1776,9 @@ static int hns_roce_v2_rereg_write_mtpt(
 	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
 	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
 		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(stru
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/infiniband/hw/hns/hns_roce_mr.c linux-libre-4.19.88-gnu/drivers/infiniband/hw/hns/hns_roce_mr.c
--- linux-libre-4.19.87-gnu/drivers/infiniband/hw/hns/hns_roce_mr.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/infiniband/hw/hns/hns_roce_mr.c	2019-12-05 03:21:36.000000000 -0500
@@ -1017,14 +1017,14 @@ struct ib_mr *hns_roce_reg_user_mr(struc
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/infiniband/hw/hns/hns_roce_qp.c linux-libre-4.19.88-gnu/drivers/infiniband/hw/hns/hns_roce_qp.c
--- linux-libre-4.19.87-gnu/drivers/infiniband/hw/hns/hns_roce_qp.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/infiniband/hw/hns/hns_roce_qp.c	2019-12-05 03:21:36.000000000 -0500
@@ -522,7 +522,8 @@ static int hns_roce_qp_has_sq(struct ib_
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/infiniband/hw/qedr/qedr_iw_cm.c linux-libre-4.19.88-gnu/drivers/infiniband/hw/qedr/qedr_iw_cm.c
--- linux-libre-4.19.87-gnu/drivers/infiniband/hw/qedr/qedr_iw_cm.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/infiniband/hw/qedr/qedr_iw_cm.c	2019-12-05 03:21:36.000000000 -0500
@@ -492,6 +492,8 @@ int qedr_iw_connect(struct iw_cm_id *cm_
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/infiniband/hw/qib/qib_sdma.c linux-libre-4.19.88-gnu/drivers/infiniband/hw/qib/qib_sdma.c
--- linux-libre-4.19.87-gnu/drivers/infiniband/hw/qib/qib_sdma.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/infiniband/hw/qib/qib_sdma.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c linux-libre-4.19.88-gnu/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c
--- linux-libre-4.19.87-gnu/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/infiniband/hw/vmw_pvrdma/pvrdma_verbs.c	2019-12-05 03:21:36.000000000 -0500
@@ -555,7 +555,7 @@ struct ib_ah *pvrdma_create_ah(struct ib
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/infiniband/sw/rxe/rxe_hw_counters.c linux-libre-4.19.88-gnu/drivers/infiniband/sw/rxe/rxe_hw_counters.c
--- linux-libre-4.19.87-gnu/drivers/infiniband/sw/rxe/rxe_hw_counters.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/infiniband/sw/rxe/rxe_hw_counters.c	2019-12-05 03:21:36.000000000 -0500
@@ -59,7 +59,7 @@ int rxe_ib_get_hw_stats(struct ib_device
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/infiniband/sw/rxe/rxe_verbs.h linux-libre-4.19.88-gnu/drivers/infiniband/sw/rxe/rxe_verbs.h
--- linux-libre-4.19.87-gnu/drivers/infiniband/sw/rxe/rxe_verbs.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/infiniband/sw/rxe/rxe_verbs.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/infiniband/ulp/srp/ib_srp.c linux-libre-4.19.88-gnu/drivers/infiniband/ulp/srp/ib_srp.c
--- linux-libre-4.19.87-gnu/drivers/infiniband/ulp/srp/ib_srp.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/infiniband/ulp/srp/ib_srp.c	2019-12-05 03:21:36.000000000 -0500
@@ -2357,6 +2357,7 @@ static int srp_queuecommand(struct Scsi_
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/input/serio/gscps2.c linux-libre-4.19.88-gnu/drivers/input/serio/gscps2.c
--- linux-libre-4.19.87-gnu/drivers/input/serio/gscps2.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/input/serio/gscps2.c	2019-12-05 03:21:36.000000000 -0500
@@ -381,9 +381,9 @@ static int __init gscps2_probe(struct pa
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/input/serio/hp_sdc.c linux-libre-4.19.88-gnu/drivers/input/serio/hp_sdc.c
--- linux-libre-4.19.87-gnu/drivers/input/serio/hp_sdc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/input/serio/hp_sdc.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/iommu/amd_iommu.c linux-libre-4.19.88-gnu/drivers/iommu/amd_iommu.c
--- linux-libre-4.19.87-gnu/drivers/iommu/amd_iommu.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/iommu/amd_iommu.c	2019-12-05 03:21:36.000000000 -0500
@@ -139,10 +139,14 @@ static struct lock_class_key reserved_rb
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mailbox/mailbox-test.c linux-libre-4.19.88-gnu/drivers/mailbox/mailbox-test.c
--- linux-libre-4.19.87-gnu/drivers/mailbox/mailbox-test.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mailbox/mailbox-test.c	2019-12-05 03:21:36.000000000 -0500
@@ -363,22 +363,24 @@ static int mbox_test_probe(struct platfo
 
 	/* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mailbox/stm32-ipcc.c linux-libre-4.19.88-gnu/drivers/mailbox/stm32-ipcc.c
--- linux-libre-4.19.87-gnu/drivers/mailbox/stm32-ipcc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mailbox/stm32-ipcc.c	2019-12-05 03:21:36.000000000 -0500
@@ -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
 
 		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
 		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 m
 	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 mbo
 	}
 
 	/* 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 m
 					       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 platf
 	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 platf
 	}
 
 	/* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/md/bcache/debug.c linux-libre-4.19.88-gnu/drivers/md/bcache/debug.c
--- linux-libre-4.19.87-gnu/drivers/md/bcache/debug.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/md/bcache/debug.c	2019-12-05 03:21:36.000000000 -0500
@@ -249,8 +249,7 @@ void bch_debug_init_cache_set(struct cac
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/md/bcache/super.c linux-libre-4.19.88-gnu/drivers/md/bcache/super.c
--- linux-libre-4.19.87-gnu/drivers/md/bcache/super.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/md/bcache/super.c	2019-12-05 03:21:36.000000000 -0500
@@ -1491,8 +1491,7 @@ static void cache_set_free(struct closur
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/md/bcache/writeback.c linux-libre-4.19.88-gnu/drivers/md/bcache/writeback.c
--- linux-libre-4.19.87-gnu/drivers/md/bcache/writeback.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/md/bcache/writeback.c	2019-12-05 03:21:36.000000000 -0500
@@ -781,7 +781,7 @@ void bch_cached_dev_writeback_init(struc
 	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(struc
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/md/dm-flakey.c linux-libre-4.19.88-gnu/drivers/md/dm-flakey.c
--- linux-libre-4.19.87-gnu/drivers/md/dm-flakey.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/md/dm-flakey.c	2019-12-05 03:21:36.000000000 -0500
@@ -287,20 +287,31 @@ static void flakey_map_bio(struct dm_tar
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/md/dm-raid.c linux-libre-4.19.88-gnu/drivers/md/dm-raid.c
--- linux-libre-4.19.87-gnu/drivers/md/dm-raid.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/md/dm-raid.c	2019-12-05 03:21:36.000000000 -0500
@@ -3690,8 +3690,7 @@ static int raid_message(struct dm_target
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/media/platform/atmel/atmel-isc.c linux-libre-4.19.88-gnu/drivers/media/platform/atmel/atmel-isc.c
--- linux-libre-4.19.87-gnu/drivers/media/platform/atmel/atmel-isc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/media/platform/atmel/atmel-isc.c	2019-12-05 03:21:36.000000000 -0500
@@ -1895,6 +1895,8 @@ static int isc_async_complete(struct v4l
 	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 v4l
 		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 *d
 			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 platfo
 						   &subdev_entity->notifier);
 		if (ret) {
 			dev_err(dev, "fail to register async notifier\n");
+			kfree(subdev_entity->asd);
 			goto cleanup_subdev;
 		}
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/media/platform/stm32/stm32-dcmi.c linux-libre-4.19.88-gnu/drivers/media/platform/stm32/stm32-dcmi.c
--- linux-libre-4.19.87-gnu/drivers/media/platform/stm32/stm32-dcmi.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/media/platform/stm32/stm32-dcmi.c	2019-12-05 03:21:36.000000000 -0500
@@ -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_d
 		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_d
 	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_d
 	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 v
 	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 v
 	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_de
 
 	spin_lock_init(&dcmi->irqlock);
 	mutex_init(&dcmi->lock);
+	mutex_init(&dcmi->dma_lock);
 	init_completion(&dcmi->complete);
 	INIT_LIST_HEAD(&dcmi->buffers);
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/media/v4l2-core/v4l2-ctrls.c linux-libre-4.19.88-gnu/drivers/media/v4l2-core/v4l2-ctrls.c
--- linux-libre-4.19.87-gnu/drivers/media/v4l2-core/v4l2-ctrls.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/media/v4l2-core/v4l2-ctrls.c	2019-12-05 03:21:36.000000000 -0500
@@ -1145,6 +1145,7 @@ void v4l2_ctrl_fill(u32 id, const char *
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/memory/omap-gpmc.c linux-libre-4.19.88-gnu/drivers/memory/omap-gpmc.c
--- linux-libre-4.19.87-gnu/drivers/memory/omap-gpmc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/memory/omap-gpmc.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/misc/mei/bus.c linux-libre-4.19.88-gnu/drivers/misc/mei/bus.c
--- linux-libre-4.19.87-gnu/drivers/misc/mei/bus.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/misc/mei/bus.c	2019-12-05 03:21:36.000000000 -0500
@@ -883,15 +883,16 @@ static const struct device_type mei_cl_d
 
 /**
  * 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/misc/mei/hw-me-regs.h linux-libre-4.19.88-gnu/drivers/misc/mei/hw-me-regs.h
--- linux-libre-4.19.87-gnu/drivers/misc/mei/hw-me-regs.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/misc/mei/hw-me-regs.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/misc/mei/pci-me.c linux-libre-4.19.88-gnu/drivers/misc/mei/pci-me.c
--- linux-libre-4.19.87-gnu/drivers/misc/mei/pci-me.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/misc/mei/pci-me.c	2019-12-05 03:21:36.000000000 -0500
@@ -107,6 +107,7 @@ static const struct pci_device_id mei_me
 
 	{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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mmc/core/block.c linux-libre-4.19.88-gnu/drivers/mmc/core/block.c
--- linux-libre-4.19.87-gnu/drivers/mmc/core/block.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mmc/core/block.c	2019-12-05 03:21:36.000000000 -0500
@@ -2384,12 +2384,6 @@ static struct mmc_blk_data *mmc_blk_allo
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mmc/core/queue.c linux-libre-4.19.88-gnu/drivers/mmc/core/queue.c
--- linux-libre-4.19.87-gnu/drivers/mmc/core/queue.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mmc/core/queue.c	2019-12-05 03:21:36.000000000 -0500
@@ -355,6 +355,7 @@ static void mmc_setup_queue(struct mmc_q
 {
 	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_q
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mmc/host/meson-gx-mmc.c linux-libre-4.19.88-gnu/drivers/mmc/host/meson-gx-mmc.c
--- linux-libre-4.19.87-gnu/drivers/mmc/host/meson-gx-mmc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mmc/host/meson-gx-mmc.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 m
 
 	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
 	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
 
 	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(
 	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 me
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mtd/mtdcore.h linux-libre-4.19.88-gnu/drivers/mtd/mtdcore.h
--- linux-libre-4.19.87-gnu/drivers/mtd/mtdcore.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mtd/mtdcore.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mtd/mtdpart.c linux-libre-4.19.88-gnu/drivers/mtd/mtdpart.c
--- linux-libre-4.19.87-gnu/drivers/mtd/mtdpart.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mtd/mtdpart.c	2019-12-05 03:21:36.000000000 -0500
@@ -612,10 +612,21 @@ int mtd_add_partition(struct mtd_info *p
 	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 *
 {
 	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 *
 	}
 
 	return 0;
+
+err_del_partitions:
+	del_mtd_partitions(master);
+
+	return ret;
 }
 
 static DEFINE_SPINLOCK(part_parser_lock);
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mtd/nand/raw/atmel/nand-controller.c linux-libre-4.19.88-gnu/drivers/mtd/nand/raw/atmel/nand-controller.c
--- linux-libre-4.19.87-gnu/drivers/mtd/nand/raw/atmel/nand-controller.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mtd/nand/raw/atmel/nand-controller.c	2019-12-05 03:21:36.000000000 -0500
@@ -1826,7 +1826,7 @@ static int atmel_nand_controller_add_nan
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mtd/nand/raw/atmel/pmecc.c linux-libre-4.19.88-gnu/drivers/mtd/nand/raw/atmel/pmecc.c
--- linux-libre-4.19.87-gnu/drivers/mtd/nand/raw/atmel/pmecc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mtd/nand/raw/atmel/pmecc.c	2019-12-05 03:21:36.000000000 -0500
@@ -876,23 +876,32 @@ static struct atmel_pmecc *atmel_pmecc_g
 {
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mtd/nand/raw/sunxi_nand.c linux-libre-4.19.88-gnu/drivers/mtd/nand/raw/sunxi_nand.c
--- linux-libre-4.19.87-gnu/drivers/mtd/nand/raw/sunxi_nand.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mtd/nand/raw/sunxi_nand.c	2019-12-05 03:21:36.000000000 -0500
@@ -1397,7 +1397,7 @@ static int sunxi_nfc_hw_ecc_write_page_d
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mtd/spi-nor/spi-nor.c linux-libre-4.19.88-gnu/drivers/mtd/spi-nor/spi-nor.c
--- linux-libre-4.19.87-gnu/drivers/mtd/spi-nor/spi-nor.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mtd/spi-nor/spi-nor.c	2019-12-05 03:21:36.000000000 -0500
@@ -2459,7 +2459,7 @@ static int spi_nor_init_params(struct sp
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mtd/ubi/build.c linux-libre-4.19.88-gnu/drivers/mtd/ubi/build.c
--- linux-libre-4.19.87-gnu/drivers/mtd/ubi/build.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mtd/ubi/build.c	2019-12-05 03:21:36.000000000 -0500
@@ -1101,10 +1101,10 @@ int ubi_detach_mtd_dev(int ubi_num, int
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/mtd/ubi/kapi.c linux-libre-4.19.88-gnu/drivers/mtd/ubi/kapi.c
--- linux-libre-4.19.87-gnu/drivers/mtd/ubi/kapi.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/mtd/ubi/kapi.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/can/c_can/c_can.c linux-libre-4.19.88-gnu/drivers/net/can/c_can/c_can.c
--- linux-libre-4.19.87-gnu/drivers/net/can/c_can/c_can.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/can/c_can/c_can.c	2019-12-05 03:21:36.000000000 -0500
@@ -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(
 				   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(
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/can/flexcan.c linux-libre-4.19.88-gnu/drivers/net/can/flexcan.c
--- linux-libre-4.19.87-gnu/drivers/net/can/flexcan.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/can/flexcan.c	2019-12-05 03:21:36.000000000 -0500
@@ -566,6 +566,7 @@ static void flexcan_irq_bus_err(struct n
 	struct can_frame *cf;
 	bool rx_errors = false, tx_errors = false;
 	u32 timestamp;
+	int err;
 
 	timestamp = priv->read(&regs->timer) << 16;
 
@@ -614,7 +615,9 @@ static void flexcan_irq_bus_err(struct n
 	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
 	int flt;
 	struct can_berr_counter bec;
 	u32 timestamp;
+	int err;
 
 	timestamp = priv->read(&regs->timer) << 16;
 
@@ -658,7 +662,9 @@ static void flexcan_irq_state(struct net
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/can/rx-offload.c linux-libre-4.19.88-gnu/drivers/net/can/rx-offload.c
--- linux-libre-4.19.87-gnu/drivers/net/can/rx-offload.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/can/rx-offload.c	2019-12-05 03:21:36.000000000 -0500
@@ -116,37 +116,95 @@ static int can_rx_offload_compare(struct
 	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,
 					    &timestamp, 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
 			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(stru
 	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
 			      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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/can/spi/mcp251x.c linux-libre-4.19.88-gnu/drivers/net/can/spi/mcp251x.c
--- linux-libre-4.19.87-gnu/drivers/net/can/spi/mcp251x.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/can/spi/mcp251x.c	2019-12-05 03:21:36.000000000 -0500
@@ -773,6 +773,7 @@ static void mcp251x_restart_work_handler
 	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
 			mcp251x_hw_sleep(spi);
 		}
 		priv->after_suspend = 0;
-		priv->force_quit = 0;
 	}
 
 	if (priv->restart_tx) {
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/can/usb/peak_usb/pcan_usb.c linux-libre-4.19.88-gnu/drivers/net/can/usb/peak_usb/pcan_usb.c
--- linux-libre-4.19.87-gnu/drivers/net/can/usb/peak_usb/pcan_usb.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/can/usb/peak_usb/pcan_usb.c	2019-12-05 03:21:36.000000000 -0500
@@ -444,8 +444,8 @@ static int pcan_usb_decode_error(struct
 		}
 		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
 		}
 
 		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
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/dsa/bcm_sf2.c linux-libre-4.19.88-gnu/drivers/net/dsa/bcm_sf2.c
--- linux-libre-4.19.87-gnu/drivers/net/dsa/bcm_sf2.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/dsa/bcm_sf2.c	2019-12-05 03:21:36.000000000 -0500
@@ -309,11 +309,10 @@ static int bcm_sf2_sw_mdio_write(struct
 	 * 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/atheros/atl1e/atl1e_main.c linux-libre-4.19.88-gnu/drivers/net/ethernet/atheros/atl1e/atl1e_main.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/atheros/atl1e/atl1e_main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/atheros/atl1e/atl1e_main.c	2019-12-05 03:21:36.000000000 -0500
@@ -473,7 +473,9 @@ static void atl1e_mdio_write(struct net_
 {
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.c linux-libre-4.19.88-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.c	2019-12-05 03:21:36.000000000 -0500
@@ -7148,6 +7148,9 @@ static bool bnxt_drv_busy(struct bnxt *b
 		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
 	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
 	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,
 
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c linux-libre-4.19.88-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c	2019-12-05 03:21:36.000000000 -0500
@@ -1444,14 +1444,22 @@ static int bnxt_flash_nvram(struct net_d
 	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 ne
 		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 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(
 			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(
 	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(
 		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(
 	}
 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
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.h linux-libre-4.19.88-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.h
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/broadcom/bnxt/bnxt.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/broadcom/genet/bcmgenet.c linux-libre-4.19.88-gnu/drivers/net/ethernet/broadcom/genet/bcmgenet.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/broadcom/genet/bcmgenet.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/broadcom/genet/bcmgenet.c	2019-12-05 03:21:36.000000000 -0500
@@ -1998,8 +1998,6 @@ static void reset_umac(struct bcmgenet_p
 
 	/* 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 wor
 	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
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/broadcom/genet/bcmmii.c linux-libre-4.19.88-gnu/drivers/net/ethernet/broadcom/genet/bcmmii.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/broadcom/genet/bcmmii.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/broadcom/genet/bcmmii.c	2019-12-05 03:21:36.000000000 -0500
@@ -184,8 +184,38 @@ int bcmgenet_mii_config(struct net_devic
 	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_devic
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/cadence/macb.h linux-libre-4.19.88-gnu/drivers/net/ethernet/cadence/macb.h
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/cadence/macb.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/cadence/macb.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/cadence/macb_main.c linux-libre-4.19.88-gnu/drivers/net/ethernet/cadence/macb_main.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/cadence/macb_main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/cadence/macb_main.c	2019-12-05 03:21:36.000000000 -0500
@@ -860,7 +860,9 @@ static void macb_tx_interrupt(struct mac
 
 			/* 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
 		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
 		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
 
 	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 pla
 
 	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_d
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/cadence/macb_ptp.c linux-libre-4.19.88-gnu/drivers/net/ethernet/cadence/macb_ptp.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/cadence/macb_ptp.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/cadence/macb_ptp.c	2019-12-05 03:21:36.000000000 -0500
@@ -115,7 +115,10 @@ static int gem_tsu_incr_set(struct macb
 	 * 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/freescale/fec_main.c linux-libre-4.19.88-gnu/drivers/net/ethernet/freescale/fec_main.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/freescale/fec_main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/freescale/fec_main.c	2019-12-05 03:21:36.000000000 -0500
@@ -3597,6 +3597,11 @@ fec_drv_remove(struct platform_device *p
 	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 *p
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3_enet.c	2019-12-05 03:21:36.000000000 -0500
@@ -2366,7 +2366,7 @@ static bool hns3_get_new_int_gl(struct h
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.c	2019-12-05 03:21:36.000000000 -0500
@@ -260,6 +260,8 @@ int hclge_cmd_send(struct hclge_hw *hw,
 
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_cmd.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_dcb.c	2019-12-05 03:21:36.000000000 -0500
@@ -245,6 +245,9 @@ static int hclge_ieee_setpfc(struct hnae
 	    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 hnae
 		}
 	}
 
-	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_tm.c	2019-12-05 03:21:36.000000000 -0500
@@ -1162,7 +1162,7 @@ static int hclge_pfc_setup_hw(struct hcl
 				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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/hisilicon/hns3/hns3vf/hclgevf_main.c	2019-12-05 03:21:36.000000000 -0500
@@ -26,7 +26,12 @@ MODULE_DEVICE_TABLE(pci, ae_algovf_pci_t
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c linux-libre-4.19.88-gnu/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c	2019-12-05 03:21:36.000000000 -0500
@@ -5132,6 +5132,8 @@ static int mvpp2_probe(struct platform_d
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/mellanox/mlx5/core/main.c linux-libre-4.19.88-gnu/drivers/net/ethernet/mellanox/mlx5/core/main.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/mellanox/mlx5/core/main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/mellanox/mlx5/core/main.c	2019-12-05 03:21:36.000000000 -0500
@@ -859,11 +859,9 @@ static int mlx5_pci_init(struct mlx5_cor
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/mscc/ocelot.h linux-libre-4.19.88-gnu/drivers/net/ethernet/mscc/ocelot.h
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/mscc/ocelot.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/mscc/ocelot.h	2019-12-05 03:21:36.000000000 -0500
@@ -541,7 +541,7 @@ void __ocelot_write_ix(struct ocelot *oc
 #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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/sfc/ef10.c linux-libre-4.19.88-gnu/drivers/net/ethernet/sfc/ef10.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/sfc/ef10.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/sfc/ef10.c	2019-12-05 03:21:36.000000000 -0500
@@ -6042,22 +6042,25 @@ static const struct efx_ef10_nvram_type_
 	{ 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(
 	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(
 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
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c linux-libre-4.19.88-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac-sunxi.c	2019-12-05 03:21:36.000000000 -0500
@@ -59,7 +59,9 @@ static int sun7i_gmac_init(struct platfo
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/ethernet/ti/cpts.c linux-libre-4.19.88-gnu/drivers/net/ethernet/ti/cpts.c
--- linux-libre-4.19.87-gnu/drivers/net/ethernet/ti/cpts.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/ethernet/ti/cpts.c	2019-12-05 03:21:36.000000000 -0500
@@ -572,7 +572,9 @@ struct cpts *cpts_create(struct device *
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/Kconfig linux-libre-4.19.88-gnu/drivers/net/Kconfig
--- linux-libre-4.19.87-gnu/drivers/net/Kconfig	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/Kconfig	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/macvlan.c linux-libre-4.19.88-gnu/drivers/net/macvlan.c
--- linux-libre-4.19.87-gnu/drivers/net/macvlan.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/macvlan.c	2019-12-05 03:21:36.000000000 -0500
@@ -363,10 +363,11 @@ static void macvlan_broadcast_enqueue(st
 	}
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/slip/slip.c linux-libre-4.19.88-gnu/drivers/net/slip/slip.c
--- linux-libre-4.19.87-gnu/drivers/net/slip/slip.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/slip/slip.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/vxlan.c linux-libre-4.19.88-gnu/drivers/net/vxlan.c
--- linux-libre-4.19.87-gnu/drivers/net/vxlan.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/vxlan.c	2019-12-05 03:21:36.000000000 -0500
@@ -3213,6 +3213,7 @@ static int __vxlan_dev_create(struct net
 	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
 	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
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wan/fsl_ucc_hdlc.c linux-libre-4.19.88-gnu/drivers/net/wan/fsl_ucc_hdlc.c
--- linux-libre-4.19.87-gnu/drivers/net/wan/fsl_ucc_hdlc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wan/fsl_ucc_hdlc.c	2019-12-05 03:21:36.000000000 -0500
@@ -1113,7 +1113,6 @@ static int ucc_hdlc_probe(struct platfor
 	if (register_hdlc_device(dev)) {
 		ret = -ENOBUFS;
 		pr_err("ucc_hdlc: unable to register hdlc device\n");
-		free_netdev(dev);
 		goto free_dev;
 	}
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/ath/ath6kl/cfg80211.c linux-libre-4.19.88-gnu/drivers/net/wireless/ath/ath6kl/cfg80211.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/ath/ath6kl/cfg80211.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/ath/ath6kl/cfg80211.c	2019-12-05 03:21:36.000000000 -0500
@@ -939,7 +939,7 @@ static int ath6kl_set_probed_ssids(struc
 		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
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c linux-libre-4.19.88-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c linux-libre-4.19.88-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c	2019-12-01 04:06:46.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c	2019-12-05 06:39:03.000000000 -0500
@@ -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
 	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
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h linux-libre-4.19.88-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
--- linux-libre-4.19.87-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/dvm/main.c linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/dvm/main.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/dvm/main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/dvm/main.c	2019-12-05 03:21:36.000000000 -0500
@@ -1227,6 +1227,23 @@ static int iwl_eeprom_init_hw_params(str
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.c	2019-12-05 03:21:36.000000000 -0500
@@ -928,22 +928,3 @@ iwl_parse_eeprom_data(struct device *dev
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h
--- linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/iwl-eeprom-parse.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/mvm/fw.c linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/mvm/fw.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/mvm/fw.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/mvm/fw.c	2019-12-05 03:21:36.000000000 -0500
@@ -547,7 +547,9 @@ int iwl_run_init_mvm_ucode(struct iwl_mv
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/mvm/utils.c linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/mvm/utils.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/mvm/utils.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/mvm/utils.c	2019-12-05 03:21:36.000000000 -0500
@@ -1804,6 +1804,7 @@ void iwl_mvm_pause_tcm(struct iwl_mvm *m
 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 *
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx.c linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx.c	2019-12-05 03:21:36.000000000 -0500
@@ -1247,11 +1247,11 @@ static void iwl_pcie_cmdq_reclaim(struct
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/intel/iwlwifi/pcie/tx-gen2.c	2019-12-05 03:21:36.000000000 -0500
@@ -560,18 +560,6 @@ int iwl_trans_pcie_gen2_tx(struct iwl_tr
 
 	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_tr
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/marvell/mwifiex/debugfs.c linux-libre-4.19.88-gnu/drivers/net/wireless/marvell/mwifiex/debugfs.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/marvell/mwifiex/debugfs.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/marvell/mwifiex/debugfs.c	2019-12-05 03:21:36.000000000 -0500
@@ -273,15 +273,13 @@ mwifiex_histogram_read(struct file *file
 		     "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
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/marvell/mwifiex/scan.c linux-libre-4.19.88-gnu/drivers/net/wireless/marvell/mwifiex/scan.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/marvell/mwifiex/scan.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/marvell/mwifiex/scan.c	2019-12-05 03:21:36.000000000 -0500
@@ -1906,15 +1906,17 @@ mwifiex_parse_single_response_buf(struct
 					    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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c linux-libre-4.19.88-gnu/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c
--- linux-libre-4.19.87-gnu/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/net/wireless/realtek/rtl818x/rtl8187/dev.c	2019-12-05 03:21:36.000000000 -0500
@@ -444,12 +444,13 @@ static int rtl8187_init_urbs(struct ieee
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/nvme/host/core.c linux-libre-4.19.88-gnu/drivers/nvme/host/core.c
--- linux-libre-4.19.87-gnu/drivers/nvme/host/core.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/nvme/host/core.c	2019-12-05 03:21:36.000000000 -0500
@@ -551,9 +551,19 @@ static blk_status_t nvme_setup_discard(s
 	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(s
 	}
 
 	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 *re
 				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
 	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 *ctr
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/nvme/host/nvme.h linux-libre-4.19.88-gnu/drivers/nvme/host/nvme.h
--- linux-libre-4.19.87-gnu/drivers/nvme/host/nvme.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/nvme/host/nvme.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pci/msi.c linux-libre-4.19.88-gnu/drivers/pci/msi.c
--- linux-libre-4.19.87-gnu/drivers/pci/msi.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pci/msi.c	2019-12-05 03:21:36.000000000 -0500
@@ -1155,7 +1155,8 @@ int pci_alloc_irq_vectors_affinity(struc
 				   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(struc
 	}
 
 	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(struc
 		}
 	}
 
-	return vecs;
+	if (msix_vecs == -ENOSPC)
+		return -ENOSPC;
+	return msi_vecs;
 }
 EXPORT_SYMBOL(pci_alloc_irq_vectors_affinity);
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pinctrl/intel/pinctrl-cherryview.c linux-libre-4.19.88-gnu/drivers/pinctrl/intel/pinctrl-cherryview.c
--- linux-libre-4.19.87-gnu/drivers/pinctrl/intel/pinctrl-cherryview.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pinctrl/intel/pinctrl-cherryview.c	2019-12-05 03:21:36.000000000 -0500
@@ -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_
 	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_pin
 		}
 	}
 
-	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_pin
 		}
 	}
 
-	gpiochip_set_chained_irqchip(chip, &chv_gpio_irqchip, irq,
+	gpiochip_set_chained_irqchip(chip, &pctrl->irqchip, irq,
 				     chv_gpio_irq_handler);
 	return 0;
 }
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pinctrl/pinctrl-xway.c linux-libre-4.19.88-gnu/drivers/pinctrl/pinctrl-xway.c
--- linux-libre-4.19.87-gnu/drivers/pinctrl/pinctrl-xway.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pinctrl/pinctrl-xway.c	2019-12-05 03:21:36.000000000 -0500
@@ -1746,14 +1746,6 @@ static int pinmux_xway_probe(struct plat
 	}
 	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 plat
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pinctrl/sh-pfc/pfc-r8a77990.c linux-libre-4.19.88-gnu/drivers/pinctrl/sh-pfc/pfc-r8a77990.c
--- linux-libre-4.19.87-gnu/drivers/pinctrl/sh-pfc/pfc-r8a77990.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pinctrl/sh-pfc/pfc-r8a77990.c	2019-12-05 03:21:36.000000000 -0500
@@ -395,7 +395,7 @@ FM(IP12_31_28)	IP12_31_28	FM(IP13_31_28)
 #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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pinctrl/sh-pfc/pfc-sh7264.c linux-libre-4.19.88-gnu/drivers/pinctrl/sh-pfc/pfc-sh7264.c
--- linux-libre-4.19.87-gnu/drivers/pinctrl/sh-pfc/pfc-sh7264.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pinctrl/sh-pfc/pfc-sh7264.c	2019-12-05 03:21:36.000000000 -0500
@@ -1716,6 +1716,9 @@ static const struct pinmux_cfg_reg pinmu
 	},
 
 	{ 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 pinmu
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pinctrl/sh-pfc/pfc-sh7734.c linux-libre-4.19.88-gnu/drivers/pinctrl/sh-pfc/pfc-sh7734.c
--- linux-libre-4.19.87-gnu/drivers/pinctrl/sh-pfc/pfc-sh7734.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pinctrl/sh-pfc/pfc-sh7734.c	2019-12-05 03:21:36.000000000 -0500
@@ -2213,22 +2213,22 @@ static const struct pinmux_cfg_reg pinmu
 	    /* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pinctrl/stm32/pinctrl-stm32.c linux-libre-4.19.88-gnu/drivers/pinctrl/stm32/pinctrl-stm32.c
--- linux-libre-4.19.87-gnu/drivers/pinctrl/stm32/pinctrl-stm32.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pinctrl/stm32/pinctrl-stm32.c	2019-12-05 03:21:36.000000000 -0500
@@ -410,7 +410,7 @@ static int stm32_pctrl_dt_subnode_to_map
 	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
 	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
 					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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/platform/x86/hp-wmi.c linux-libre-4.19.88-gnu/drivers/platform/x86/hp-wmi.c
--- linux-libre-4.19.87-gnu/drivers/platform/x86/hp-wmi.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/platform/x86/hp-wmi.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 quer
 		.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 quer
 
 	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(s
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/platform/x86/mlx-platform.c linux-libre-4.19.88-gnu/drivers/platform/x86/mlx-platform.c
--- linux-libre-4.19.87-gnu/drivers/platform/x86/mlx-platform.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/platform/x86/mlx-platform.c	2019-12-05 03:21:36.000000000 -0500
@@ -1421,7 +1421,7 @@ static int __init mlxplat_dmi_msn201x_ma
 	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_mat
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/power/avs/smartreflex.c linux-libre-4.19.88-gnu/drivers/power/avs/smartreflex.c
--- linux-libre-4.19.87-gnu/drivers/power/avs/smartreflex.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/power/avs/smartreflex.c	2019-12-05 03:21:36.000000000 -0500
@@ -1010,8 +1010,7 @@ static int omap_sr_remove(struct platfor
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pwm/core.c linux-libre-4.19.88-gnu/drivers/pwm/core.c
--- linux-libre-4.19.87-gnu/drivers/pwm/core.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pwm/core.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pwm/pwm-bcm-iproc.c linux-libre-4.19.88-gnu/drivers/pwm/pwm-bcm-iproc.c
--- linux-libre-4.19.87-gnu/drivers/pwm/pwm-bcm-iproc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pwm/pwm-bcm-iproc.c	2019-12-05 03:21:36.000000000 -0500
@@ -187,6 +187,7 @@ static int iproc_pwmc_apply(struct pwm_c
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pwm/pwm-berlin.c linux-libre-4.19.88-gnu/drivers/pwm/pwm-berlin.c
--- linux-libre-4.19.87-gnu/drivers/pwm/pwm-berlin.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pwm/pwm-berlin.c	2019-12-05 03:21:36.000000000 -0500
@@ -84,7 +84,6 @@ static void berlin_pwm_free(struct pwm_c
 {
 	struct berlin_pwm_channel *channel = pwm_get_chip_data(pwm);
 
-	pwm_set_chip_data(pwm, NULL);
 	kfree(channel);
 }
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pwm/pwm-clps711x.c linux-libre-4.19.88-gnu/drivers/pwm/pwm-clps711x.c
--- linux-libre-4.19.87-gnu/drivers/pwm/pwm-clps711x.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pwm/pwm-clps711x.c	2019-12-05 03:21:36.000000000 -0500
@@ -48,7 +48,7 @@ static void clps711x_pwm_update_val(stru
 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 pw
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pwm/pwm-pca9685.c linux-libre-4.19.88-gnu/drivers/pwm/pwm-pca9685.c
--- linux-libre-4.19.87-gnu/drivers/pwm/pwm-pca9685.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pwm/pwm-pca9685.c	2019-12-05 03:21:36.000000000 -0500
@@ -176,7 +176,6 @@ static void pca9685_pwm_gpio_free(struct
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/pwm/pwm-samsung.c linux-libre-4.19.88-gnu/drivers/pwm/pwm-samsung.c
--- linux-libre-4.19.87-gnu/drivers/pwm/pwm-samsung.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/pwm/pwm-samsung.c	2019-12-05 03:21:36.000000000 -0500
@@ -238,7 +238,6 @@ static int pwm_samsung_request(struct pw
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/regulator/palmas-regulator.c linux-libre-4.19.88-gnu/drivers/regulator/palmas-regulator.c
--- linux-libre-4.19.87-gnu/drivers/regulator/palmas-regulator.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/regulator/palmas-regulator.c	2019-12-05 03:21:36.000000000 -0500
@@ -443,13 +443,16 @@ static int palmas_ldo_write(struct palma
 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, &reg);
+	ret = palmas_smps_read(pmic->palmas, rinfo->ctrl_addr, &reg);
+	if (ret)
+		return ret;
 
 	reg &= ~PALMAS_SMPS12_CTRL_MODE_ACTIVE_MASK;
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/regulator/tps65910-regulator.c linux-libre-4.19.88-gnu/drivers/regulator/tps65910-regulator.c
--- linux-libre-4.19.87-gnu/drivers/regulator/tps65910-regulator.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/regulator/tps65910-regulator.c	2019-12-05 03:21:36.000000000 -0500
@@ -1102,8 +1102,10 @@ static int tps65910_probe(struct platfor
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/reset/core.c linux-libre-4.19.88-gnu/drivers/reset/core.c
--- linux-libre-4.19.87-gnu/drivers/reset/core.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/reset/core.c	2019-12-05 03:21:36.000000000 -0500
@@ -607,6 +607,7 @@ static void reset_control_array_put(stru
 	for (i = 0; i < resets->num_rstcs; i++)
 		__reset_control_put_internal(resets->rstc[i]);
 	mutex_unlock(&reset_list_mutex);
+	kfree(resets);
 }
 
 /**
diff -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/s390/crypto/ap_queue.c linux-libre-4.19.88-gnu/drivers/s390/crypto/ap_queue.c
--- linux-libre-4.19.87-gnu/drivers/s390/crypto/ap_queue.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/s390/crypto/ap_queue.c	2019-12-05 03:21:36.000000000 -0500
@@ -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
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/csiostor/csio_init.c linux-libre-4.19.88-gnu/drivers/scsi/csiostor/csio_init.c
--- linux-libre-4.19.87-gnu/drivers/scsi/csiostor/csio_init.c	2019-12-01 04:16:12.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/csiostor/csio_init.c	2019-12-05 06:48:43.000000000 -0500
@@ -649,7 +649,7 @@ csio_shost_init(struct csio_hw *hw, stru
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c linux-libre-4.19.88-gnu/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
--- linux-libre-4.19.87-gnu/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c	2019-12-05 03:21:36.000000000 -0500
@@ -1520,6 +1520,7 @@ static irqreturn_t fatal_axi_int_v3_hw(i
 	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(i
 				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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/libsas/sas_expander.c linux-libre-4.19.88-gnu/drivers/scsi/libsas/sas_expander.c
--- linux-libre-4.19.87-gnu/drivers/scsi/libsas/sas_expander.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/libsas/sas_expander.c	2019-12-05 03:21:36.000000000 -0500
@@ -614,7 +614,14 @@ int sas_smp_phy_control(struct domain_de
 	}
 
 	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_disc
 
 #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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_attr.c linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_attr.c
--- linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_attr.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_attr.c	2019-12-05 03:21:36.000000000 -0500
@@ -1332,7 +1332,7 @@ lpfc_sli4_pdev_reg_request(struct lpfc_h
 		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
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_bsg.c linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_bsg.c
--- linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_bsg.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_bsg.c	2019-12-05 03:21:36.000000000 -0500
@@ -2221,7 +2221,7 @@ lpfc_bsg_diag_loopback_mode(struct bsg_j
 
 	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_j
 
 	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_
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_els.c linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_els.c
--- linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_els.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_els.c	2019-12-05 03:21:36.000000000 -0500
@@ -1343,6 +1343,8 @@ lpfc_els_abort_flogi(struct lpfc_hba *ph
 			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 *vpor
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc.h linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc.h
--- linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_hbadisc.c linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_hbadisc.c
--- linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_hbadisc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_hbadisc.c	2019-12-05 03:21:36.000000000 -0500
@@ -4780,7 +4780,7 @@ lpfc_unreg_rpi(struct lpfc_vport *vport,
 				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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_init.c linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_init.c
--- linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_init.c	2019-12-01 04:16:12.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_init.c	2019-12-05 06:48:43.000000000 -0500
@@ -1801,7 +1801,12 @@ lpfc_sli4_port_sta_fn_reset(struct lpfc_
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_scsi.c linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_scsi.c
--- linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_scsi.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_scsi.c	2019-12-05 03:21:36.000000000 -0500
@@ -2732,6 +2732,7 @@ lpfc_bg_scsi_prep_dma_buf_s3(struct lpfc
 	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
 	 */
 	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
 	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
@@ -3517,6 +3527,14 @@ lpfc_bg_scsi_prep_dma_buf_s4(struct lpfc
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_sli.c linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_sli.c
--- linux-libre-4.19.87-gnu/drivers/scsi/lpfc/lpfc_sli.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/lpfc/lpfc_sli.c	2019-12-05 03:21:36.000000000 -0500
@@ -4640,6 +4640,8 @@ lpfc_sli_brdrestart_s4(struct lpfc_hba *
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/qla_attr.c linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/qla_attr.c
--- linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/qla_attr.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/qla_attr.c	2019-12-05 03:21:36.000000000 -0500
@@ -2161,6 +2161,8 @@ qla24xx_vport_delete(struct fc_vport *fc
 	    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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/qla_init.c linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/qla_init.c
--- linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/qla_init.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/qla_init.c	2019-12-05 03:21:36.000000000 -0500
@@ -242,15 +242,13 @@ qla2x00_async_login(struct scsi_qla_host
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/qla_nvme.c linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/qla_nvme.c
--- linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/qla_nvme.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/qla_nvme.c	2019-12-05 03:21:36.000000000 -0500
@@ -474,21 +474,10 @@ static int qla_nvme_post_cmd(struct nvme
 	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
 	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(s
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/qla_os.c linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/qla_os.c
--- linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/qla_os.c	2019-12-01 04:16:19.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/qla_os.c	2019-12-05 06:48:50.000000000 -0500
@@ -3538,6 +3538,8 @@ qla2x00_delete_all_vps(struct qla_hw_dat
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/tcm_qla2xxx.c linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/tcm_qla2xxx.c
--- linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/tcm_qla2xxx.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/tcm_qla2xxx.c	2019-12-05 03:21:36.000000000 -0500
@@ -926,38 +926,14 @@ static ssize_t tcm_qla2xxx_tpg_enable_sh
 			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_st
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/tcm_qla2xxx.h linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/tcm_qla2xxx.h
--- linux-libre-4.19.87-gnu/drivers/scsi/qla2xxx/tcm_qla2xxx.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/scsi/qla2xxx/tcm_qla2xxx.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/staging/rtl8192e/rtl8192e/rtl_core.c linux-libre-4.19.88-gnu/drivers/staging/rtl8192e/rtl8192e/rtl_core.c
--- linux-libre-4.19.87-gnu/drivers/staging/rtl8192e/rtl8192e/rtl_core.c	2019-12-01 04:11:44.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/staging/rtl8192e/rtl8192e/rtl_core.c	2019-12-05 06:44:05.000000000 -0500
@@ -1627,14 +1627,15 @@ static void _rtl92e_hard_data_xmit(struc
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/staging/rtl8723bs/os_dep/sdio_intf.c linux-libre-4.19.88-gnu/drivers/staging/rtl8723bs/os_dep/sdio_intf.c
--- linux-libre-4.19.87-gnu/drivers/staging/rtl8723bs/os_dep/sdio_intf.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/staging/rtl8723bs/os_dep/sdio_intf.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/target/target_core_user.c linux-libre-4.19.88-gnu/drivers/target/target_core_user.c
--- linux-libre-4.19.87-gnu/drivers/target/target_core_user.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/target/target_core_user.c	2019-12-05 03:21:36.000000000 -0500
@@ -962,7 +962,7 @@ static int add_to_qfull_queue(struct tcm
  *  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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/thunderbolt/switch.c linux-libre-4.19.88-gnu/drivers/thunderbolt/switch.c
--- linux-libre-4.19.87-gnu/drivers/thunderbolt/switch.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/thunderbolt/switch.c	2019-12-05 03:21:36.000000000 -0500
@@ -167,7 +167,7 @@ static int nvm_validate_and_write(struct
 
 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
 	 * 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
 		 * 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
 	 * 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(struc
 	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(st
 			 */
 			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
 	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:
@@ -1359,6 +1379,19 @@ static int tb_switch_add_dma_port(struct
 		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
 	 * it functional again.
@@ -1373,9 +1406,6 @@ static int tb_switch_add_dma_port(struct
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/tty/serial/8250/8250_core.c linux-libre-4.19.88-gnu/drivers/tty/serial/8250/8250_core.c
--- linux-libre-4.19.87-gnu/drivers/tty/serial/8250/8250_core.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/tty/serial/8250/8250_core.c	2019-12-05 03:21:36.000000000 -0500
@@ -946,6 +946,21 @@ static struct uart_8250_port *serial8250
 	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
 
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/tty/serial/8250/8250_fsl.c linux-libre-4.19.88-gnu/drivers/tty/serial/8250/8250_fsl.c
--- linux-libre-4.19.87-gnu/drivers/tty/serial/8250/8250_fsl.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/tty/serial/8250/8250_fsl.c	2019-12-05 03:21:36.000000000 -0500
@@ -45,8 +45,29 @@ int fsl8250_handle_irq(struct uart_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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/tty/serial/8250/8250_of.c linux-libre-4.19.88-gnu/drivers/tty/serial/8250/8250_of.c
--- linux-libre-4.19.87-gnu/drivers/tty/serial/8250/8250_of.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/tty/serial/8250/8250_of.c	2019-12-05 03:21:36.000000000 -0500
@@ -244,6 +244,11 @@ static int of_platform_serial_probe(stru
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/tty/serial/max310x.c linux-libre-4.19.88-gnu/drivers/tty/serial/max310x.c
--- linux-libre-4.19.87-gnu/drivers/tty/serial/max310x.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/tty/serial/max310x.c	2019-12-05 03:21:36.000000000 -0500
@@ -844,12 +844,9 @@ static void max310x_wq_proc(struct work_
 
 static unsigned int max310x_tx_empty(struct uart_port *port)
 {
-	unsigned int lvl, sts;
-
-	lvl = max310x_port_read(port, MAX310X_TXFIFOLVL_REG);
-	sts = max310x_port_read(port, MAX310X_IRQSTS_REG);
+	u8 lvl = max310x_port_read(port, MAX310X_TXFIFOLVL_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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/tty/serial/sh-sci.c linux-libre-4.19.88-gnu/drivers/tty/serial/sh-sci.c
--- linux-libre-4.19.87-gnu/drivers/tty/serial/sh-sci.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/tty/serial/sh-sci.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/usb/dwc2/core.c linux-libre-4.19.88-gnu/drivers/usb/dwc2/core.c
--- linux-libre-4.19.87-gnu/drivers/usb/dwc2/core.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/usb/dwc2/core.c	2019-12-05 03:21:36.000000000 -0500
@@ -524,7 +524,7 @@ int dwc2_core_reset(struct dwc2_hsotg *h
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/usb/host/ehci-omap.c linux-libre-4.19.88-gnu/drivers/usb/host/ehci-omap.c
--- linux-libre-4.19.87-gnu/drivers/usb/host/ehci-omap.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/usb/host/ehci-omap.c	2019-12-05 03:21:36.000000000 -0500
@@ -159,11 +159,12 @@ static int ehci_hcd_omap_probe(struct pl
 		/* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/usb/serial/ftdi_sio.c linux-libre-4.19.88-gnu/drivers/usb/serial/ftdi_sio.c
--- linux-libre-4.19.87-gnu/drivers/usb/serial/ftdi_sio.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/usb/serial/ftdi_sio.c	2019-12-05 03:21:36.000000000 -0500
@@ -1023,6 +1023,9 @@ static const struct usb_device_id id_tab
 	/* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/usb/serial/ftdi_sio_ids.h linux-libre-4.19.88-gnu/drivers/usb/serial/ftdi_sio_ids.h
--- linux-libre-4.19.87-gnu/drivers/usb/serial/ftdi_sio_ids.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/usb/serial/ftdi_sio_ids.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/vfio/vfio_iommu_spapr_tce.c linux-libre-4.19.88-gnu/drivers/vfio/vfio_iommu_spapr_tce.c
--- linux-libre-4.19.87-gnu/drivers/vfio/vfio_iommu_spapr_tce.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/vfio/vfio_iommu_spapr_tce.c	2019-12-05 03:21:36.000000000 -0500
@@ -371,6 +371,7 @@ static void tce_iommu_release(void *iomm
 {
 	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 *iomm
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/watchdog/meson_gxbb_wdt.c linux-libre-4.19.88-gnu/drivers/watchdog/meson_gxbb_wdt.c
--- linux-libre-4.19.87-gnu/drivers/watchdog/meson_gxbb_wdt.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/watchdog/meson_gxbb_wdt.c	2019-12-05 03:21:36.000000000 -0500
@@ -89,8 +89,8 @@ static unsigned int meson_gxbb_wdt_get_t
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/watchdog/sama5d4_wdt.c linux-libre-4.19.88-gnu/drivers/watchdog/sama5d4_wdt.c
--- linux-libre-4.19.87-gnu/drivers/watchdog/sama5d4_wdt.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/watchdog/sama5d4_wdt.c	2019-12-05 03:21:36.000000000 -0500
@@ -111,9 +111,7 @@ static int sama5d4_wdt_set_timeout(struc
 	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 plat
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/drivers/xen/xen-pciback/pci_stub.c linux-libre-4.19.88-gnu/drivers/xen/xen-pciback/pci_stub.c
--- linux-libre-4.19.87-gnu/drivers/xen/xen-pciback/pci_stub.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/drivers/xen/xen-pciback/pci_stub.c	2019-12-05 03:21:36.000000000 -0500
@@ -106,7 +106,8 @@ static void pcistub_device_release(struc
 	 * 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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/btrfs/delayed-ref.c linux-libre-4.19.88-gnu/fs/btrfs/delayed-ref.c
--- linux-libre-4.19.87-gnu/fs/btrfs/delayed-ref.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/btrfs/delayed-ref.c	2019-12-05 03:21:36.000000000 -0500
@@ -234,8 +234,6 @@ static inline void drop_delayed_ref(stru
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/btrfs/dev-replace.c linux-libre-4.19.88-gnu/fs/btrfs/dev-replace.c
--- linux-libre-4.19.87-gnu/fs/btrfs/dev-replace.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/btrfs/dev-replace.c	2019-12-05 03:21:36.000000000 -0500
@@ -810,16 +810,23 @@ int btrfs_dev_replace_cancel(struct btrf
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/btrfs/disk-io.c linux-libre-4.19.88-gnu/fs/btrfs/disk-io.c
--- linux-libre-4.19.87-gnu/fs/btrfs/disk-io.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/btrfs/disk-io.c	2019-12-05 03:21:36.000000000 -0500
@@ -4350,6 +4350,8 @@ static int btrfs_destroy_pinned_extent(s
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/btrfs/extent_io.h linux-libre-4.19.88-gnu/fs/btrfs/extent_io.h
--- linux-libre-4.19.87-gnu/fs/btrfs/extent_io.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/btrfs/extent_io.h	2019-12-05 03:21:36.000000000 -0500
@@ -348,11 +348,11 @@ static inline int set_extent_dirty(struc
 }
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/btrfs/extent-tree.c linux-libre-4.19.88-gnu/fs/btrfs/extent-tree.c
--- linux-libre-4.19.87-gnu/fs/btrfs/extent-tree.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/btrfs/extent-tree.c	2019-12-05 03:21:36.000000000 -0500
@@ -6618,9 +6618,11 @@ int btrfs_finish_extent_commit(struct bt
 		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 bt
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/btrfs/volumes.c linux-libre-4.19.88-gnu/fs/btrfs/volumes.c
--- linux-libre-4.19.87-gnu/fs/btrfs/volumes.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/btrfs/volumes.c	2019-12-05 03:21:36.000000000 -0500
@@ -96,7 +96,7 @@ const struct btrfs_raid_attr btrfs_raid_
 		.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_
 		.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(
 	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_
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/ceph/super.c linux-libre-4.19.88-gnu/fs/ceph/super.c
--- linux-libre-4.19.87-gnu/fs/ceph/super.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/ceph/super.c	2019-12-05 03:21:36.000000000 -0500
@@ -248,6 +248,7 @@ static int parse_fsopt_token(char *c, vo
 			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, vo
 			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, vo
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/exofs/super.c linux-libre-4.19.88-gnu/fs/exofs/super.c
--- linux-libre-4.19.87-gnu/fs/exofs/super.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/exofs/super.c	2019-12-05 03:21:36.000000000 -0500
@@ -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
 			  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
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/ext4/inode.c linux-libre-4.19.88-gnu/fs/ext4/inode.c
--- linux-libre-4.19.87-gnu/fs/ext4/inode.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/ext4/inode.c	2019-12-05 03:21:36.000000000 -0500
@@ -5904,8 +5904,23 @@ static int __ext4_expand_extra_isize(str
 {
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/ext4/super.c linux-libre-4.19.88-gnu/fs/ext4/super.c
--- linux-libre-4.19.87-gnu/fs/ext4/super.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/ext4/super.c	2019-12-05 03:21:36.000000000 -0500
@@ -3517,12 +3517,15 @@ static void ext4_clamp_want_extra_isize(
 {
 	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(
 		}
 	}
 	/* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/f2fs/file.c linux-libre-4.19.88-gnu/fs/f2fs/file.c
--- linux-libre-4.19.87-gnu/fs/f2fs/file.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/f2fs/file.c	2019-12-05 03:21:36.000000000 -0500
@@ -1667,7 +1667,7 @@ static int __f2fs_ioc_setflags(struct in
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/f2fs/segment.c linux-libre-4.19.88-gnu/fs/f2fs/segment.c
--- linux-libre-4.19.87-gnu/fs/f2fs/segment.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/f2fs/segment.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/gfs2/bmap.c linux-libre-4.19.88-gnu/fs/gfs2/bmap.c
--- linux-libre-4.19.87-gnu/fs/gfs2/bmap.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/gfs2/bmap.c	2019-12-05 03:21:36.000000000 -0500
@@ -2122,6 +2122,8 @@ static int do_grow(struct inode *inode,
 	}
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/ocfs2/journal.c linux-libre-4.19.88-gnu/fs/ocfs2/journal.c
--- linux-libre-4.19.87-gnu/fs/ocfs2/journal.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/ocfs2/journal.c	2019-12-05 03:21:36.000000000 -0500
@@ -1018,7 +1018,8 @@ void ocfs2_journal_shutdown(struct ocfs2
 			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
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/ubifs/sb.c linux-libre-4.19.88-gnu/fs/ubifs/sb.c
--- linux-libre-4.19.87-gnu/fs/ubifs/sb.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/ubifs/sb.c	2019-12-05 03:21:36.000000000 -0500
@@ -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(str
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/xfs/libxfs/xfs_symlink_remote.c linux-libre-4.19.88-gnu/fs/xfs/libxfs/xfs_symlink_remote.c
--- linux-libre-4.19.87-gnu/fs/xfs/libxfs/xfs_symlink_remote.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/xfs/libxfs/xfs_symlink_remote.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/xfs/xfs_buf.c linux-libre-4.19.88-gnu/fs/xfs/xfs_buf.c
--- linux-libre-4.19.87-gnu/fs/xfs/xfs_buf.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/xfs/xfs_buf.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/xfs/xfs_ioctl32.c linux-libre-4.19.88-gnu/fs/xfs/xfs_ioctl32.c
--- linux-libre-4.19.87-gnu/fs/xfs/xfs_ioctl32.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/xfs/xfs_ioctl32.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/xfs/xfs_rtalloc.c linux-libre-4.19.88-gnu/fs/xfs/xfs_rtalloc.c
--- linux-libre-4.19.87-gnu/fs/xfs/xfs_rtalloc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/xfs/xfs_rtalloc.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/fs/xfs/xfs_symlink.c linux-libre-4.19.88-gnu/fs/xfs/xfs_symlink.c
--- linux-libre-4.19.87-gnu/fs/xfs/xfs_symlink.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/fs/xfs/xfs_symlink.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/blktrace_api.h linux-libre-4.19.88-gnu/include/linux/blktrace_api.h
--- linux-libre-4.19.87-gnu/include/linux/blktrace_api.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/blktrace_api.h	2019-12-05 03:21:36.000000000 -0500
@@ -116,7 +116,13 @@ extern void blk_fill_rwbs(char *rwbs, un
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/genalloc.h linux-libre-4.19.88-gnu/include/linux/genalloc.h
--- linux-libre-4.19.87-gnu/include/linux/genalloc.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/genalloc.h	2019-12-05 03:21:36.000000000 -0500
@@ -51,7 +51,8 @@ typedef unsigned long (*genpool_algo_t)(
 			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
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/gpio/consumer.h linux-libre-4.19.88-gnu/include/linux/gpio/consumer.h
--- linux-libre-4.19.87-gnu/include/linux/gpio/consumer.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/gpio/consumer.h	2019-12-05 03:21:36.000000000 -0500
@@ -475,7 +475,7 @@ static inline int gpiod_set_consumer_nam
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/idr.h linux-libre-4.19.88-gnu/include/linux/idr.h
--- linux-libre-4.19.87-gnu/include/linux/idr.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/idr.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/kprobes.h linux-libre-4.19.88-gnu/include/linux/kprobes.h
--- linux-libre-4.19.87-gnu/include/linux/kprobes.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/kprobes.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/memory_hotplug.h linux-libre-4.19.88-gnu/include/linux/memory_hotplug.h
--- linux-libre-4.19.87-gnu/include/linux/memory_hotplug.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/memory_hotplug.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/netdevice.h linux-libre-4.19.88-gnu/include/linux/netdevice.h
--- linux-libre-4.19.87-gnu/include/linux/netdevice.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/netdevice.h	2019-12-05 03:21:36.000000000 -0500
@@ -3790,7 +3790,7 @@ static inline u32 netif_msg_init(int deb
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/reset-controller.h linux-libre-4.19.88-gnu/include/linux/reset-controller.h
--- linux-libre-4.19.87-gnu/include/linux/reset-controller.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/reset-controller.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/sched/task.h linux-libre-4.19.88-gnu/include/linux/sched/task.h
--- linux-libre-4.19.87-gnu/include/linux/sched/task.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/sched/task.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/serial_8250.h linux-libre-4.19.88-gnu/include/linux/serial_8250.h
--- linux-libre-4.19.87-gnu/include/linux/serial_8250.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/serial_8250.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/swap.h linux-libre-4.19.88-gnu/include/linux/swap.h
--- linux-libre-4.19.87-gnu/include/linux/swap.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/swap.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/linux/trace_events.h linux-libre-4.19.88-gnu/include/linux/trace_events.h
--- linux-libre-4.19.87-gnu/include/linux/trace_events.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/linux/trace_events.h	2019-12-05 03:21:36.000000000 -0500
@@ -529,6 +529,8 @@ extern int trace_event_raw_init(struct t
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/net/fq_impl.h linux-libre-4.19.88-gnu/include/net/fq_impl.h
--- linux-libre-4.19.87-gnu/include/net/fq_impl.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/net/fq_impl.h	2019-12-05 03:21:36.000000000 -0500
@@ -312,7 +312,7 @@ static int fq_init(struct fq *fq, int fl
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/net/sctp/structs.h linux-libre-4.19.88-gnu/include/net/sctp/structs.h
--- linux-libre-4.19.87-gnu/include/net/sctp/structs.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/net/sctp/structs.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/net/sock.h linux-libre-4.19.88-gnu/include/net/sock.h
--- linux-libre-4.19.87-gnu/include/net/sock.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/net/sock.h	2019-12-05 03:21:36.000000000 -0500
@@ -1272,7 +1272,7 @@ static inline void sk_sockets_allocated_
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/include/trace/events/rpcrdma.h linux-libre-4.19.88-gnu/include/trace/events/rpcrdma.h
--- linux-libre-4.19.87-gnu/include/trace/events/rpcrdma.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/include/trace/events/rpcrdma.h	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/init/main.c linux-libre-4.19.88-gnu/init/main.c
--- linux-libre-4.19.87-gnu/init/main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/init/main.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/kernel/bpf/cpumap.c linux-libre-4.19.88-gnu/kernel/bpf/cpumap.c
--- linux-libre-4.19.87-gnu/kernel/bpf/cpumap.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/kernel/bpf/cpumap.c	2019-12-05 03:21:36.000000000 -0500
@@ -162,10 +162,14 @@ static void cpu_map_kthread_stop(struct
 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
 	 * 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
 	 * - 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 -druNp --no-dereference linux-libre-4.19.87-gnu/kernel/bpf/syscall.c linux-libre-4.19.88-gnu/kernel/bpf/syscall.c
--- linux-libre-4.19.87-gnu/kernel/bpf/syscall.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/kernel/bpf/syscall.c	2019-12-05 03:21:36.000000000 -0500
@@ -559,12 +559,12 @@ static int map_create(union bpf_attr *at
 	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 un
 
 	fd = bpf_map_new_fd(map, f_flags);
 	if (fd < 0)
-		bpf_map_put(map);
+		bpf_map_put_with_uref(map);
 
 	return fd;
 }
diff -druNp --no-dereference linux-libre-4.19.87-gnu/kernel/fork.c linux-libre-4.19.88-gnu/kernel/fork.c
--- linux-libre-4.19.87-gnu/kernel/fork.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/kernel/fork.c	2019-12-05 03:21:36.000000000 -0500
@@ -163,10 +163,6 @@ static inline void free_task_struct(stru
 }
 #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 ta
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/kernel/kprobes.c linux-libre-4.19.88-gnu/kernel/kprobes.c
--- linux-libre-4.19.87-gnu/kernel/kprobes.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/kernel/kprobes.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/kernel/trace/trace_events.c linux-libre-4.19.88-gnu/kernel/trace/trace_events.c
--- linux-libre-4.19.87-gnu/kernel/trace/trace_events.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/kernel/trace/trace_events.c	2019-12-05 03:21:36.000000000 -0500
@@ -2302,11 +2302,11 @@ __trace_early_add_new_event(struct trace
 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_ev
 		__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(struc
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/kernel/trace/trace_events_hist.c linux-libre-4.19.88-gnu/kernel/trace/trace_events_hist.c
--- linux-libre-4.19.87-gnu/kernel/trace/trace_events_hist.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/kernel/trace/trace_events_hist.c	2019-12-05 03:21:36.000000000 -0500
@@ -914,7 +914,7 @@ static int register_synth_event(struct s
 	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
 	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(st
 	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,
 	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,
 		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,
 			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,
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/lib/genalloc.c linux-libre-4.19.88-gnu/lib/genalloc.c
--- linux-libre-4.19.87-gnu/lib/genalloc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/lib/genalloc.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 *p
 	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 *p
 		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
 		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_a
  */
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/lib/radix-tree.c linux-libre-4.19.88-gnu/lib/radix-tree.c
--- linux-libre-4.19.87-gnu/lib/radix-tree.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/lib/radix-tree.c	2019-12-05 03:21:36.000000000 -0500
@@ -2172,7 +2172,7 @@ void __rcu **idr_get_free(struct radix_t
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/Makefile linux-libre-4.19.88-gnu/Makefile
--- linux-libre-4.19.87-gnu/Makefile	2019-12-01 03:50:52.000000000 -0500
+++ linux-libre-4.19.88-gnu/Makefile	2019-12-05 06:17:29.000000000 -0500
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 4
 PATCHLEVEL = 19
-SUBLEVEL = 87
+SUBLEVEL = 88
 EXTRAVERSION = -gnu
 NAME = "People's Front"
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/mm/internal.h linux-libre-4.19.88-gnu/mm/internal.h
--- linux-libre-4.19.87-gnu/mm/internal.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/mm/internal.h	2019-12-05 03:21:36.000000000 -0500
@@ -444,6 +444,16 @@ static inline void mminit_validate_memmo
 #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 -druNp --no-dereference linux-libre-4.19.87-gnu/mm/memblock.c linux-libre-4.19.88-gnu/mm/memblock.c
--- linux-libre-4.19.87-gnu/mm/memblock.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/mm/memblock.c	2019-12-05 03:21:36.000000000 -0500
@@ -1537,12 +1537,7 @@ void * __init memblock_virt_alloc_try_ni
  */
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/mm/page_alloc.c linux-libre-4.19.88-gnu/mm/page_alloc.c
--- linux-libre-4.19.87-gnu/mm/page_alloc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/mm/page_alloc.c	2019-12-05 03:21:36.000000000 -0500
@@ -4451,16 +4451,19 @@ unsigned long get_zeroed_page(gfp_t gfp_
 }
 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
 {
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/bridge/netfilter/ebt_dnat.c linux-libre-4.19.88-gnu/net/bridge/netfilter/ebt_dnat.c
--- linux-libre-4.19.87-gnu/net/bridge/netfilter/ebt_dnat.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/bridge/netfilter/ebt_dnat.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 s
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/core/neighbour.c linux-libre-4.19.88-gnu/net/core/neighbour.c
--- linux-libre-4.19.87-gnu/net/core/neighbour.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/core/neighbour.c	2019-12-05 03:21:36.000000000 -0500
@@ -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_ha
 	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 r
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/core/net_namespace.c linux-libre-4.19.88-gnu/net/core/net_namespace.c
--- linux-libre-4.19.87-gnu/net/core/net_namespace.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/core/net_namespace.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/core/sock.c linux-libre-4.19.88-gnu/net/core/sock.c
--- linux-libre-4.19.87-gnu/net/core/sock.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/core/sock.c	2019-12-05 03:21:36.000000000 -0500
@@ -2435,7 +2435,7 @@ int __sk_mem_raise_allocated(struct sock
 	}
 
 	if (sk_has_memory_pressure(sk)) {
-		int alloc;
+		u64 alloc;
 
 		if (!sk_under_memory_pressure(sk))
 			return 1;
diff -druNp --no-dereference linux-libre-4.19.87-gnu/net/decnet/dn_dev.c linux-libre-4.19.88-gnu/net/decnet/dn_dev.c
--- linux-libre-4.19.87-gnu/net/decnet/dn_dev.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/decnet/dn_dev.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/ipv4/ip_gre.c linux-libre-4.19.88-gnu/net/ipv4/ip_gre.c
--- linux-libre-4.19.87-gnu/net/ipv4/ip_gre.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/ipv4/ip_gre.c	2019-12-05 03:21:36.000000000 -0500
@@ -1466,9 +1466,23 @@ static int ipgre_fill_info(struct sk_buf
 	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_buf
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/ipv4/ip_tunnel.c linux-libre-4.19.88-gnu/net/ipv4/ip_tunnel.c
--- linux-libre-4.19.87-gnu/net/ipv4/ip_tunnel.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/ipv4/ip_tunnel.c	2019-12-05 03:21:36.000000000 -0500
@@ -644,13 +644,19 @@ void ip_tunnel_xmit(struct sk_buff *skb,
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/ipv4/tcp_timer.c linux-libre-4.19.88-gnu/net/ipv4/tcp_timer.c
--- linux-libre-4.19.87-gnu/net/ipv4/tcp_timer.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/ipv4/tcp_timer.c	2019-12-05 03:21:36.000000000 -0500
@@ -443,10 +443,8 @@ void tcp_retransmit_timer(struct sock *s
 		 */
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/ipv6/ip6_gre.c linux-libre-4.19.88-gnu/net/ipv6/ip6_gre.c
--- linux-libre-4.19.87-gnu/net/ipv6/ip6_gre.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/ipv6/ip6_gre.c	2019-12-05 03:21:36.000000000 -0500
@@ -2135,9 +2135,23 @@ static int ip6gre_fill_info(struct sk_bu
 	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_bu
 	    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_bu
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/mac80211/sta_info.c linux-libre-4.19.88-gnu/net/mac80211/sta_info.c
--- linux-libre-4.19.87-gnu/net/mac80211/sta_info.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/mac80211/sta_info.c	2019-12-05 03:21:36.000000000 -0500
@@ -2356,7 +2356,8 @@ unsigned long ieee80211_sta_last_active(
 {
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/netfilter/nf_nat_sip.c linux-libre-4.19.88-gnu/net/netfilter/nf_nat_sip.c
--- linux-libre-4.19.87-gnu/net/netfilter/nf_nat_sip.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/netfilter/nf_nat_sip.c	2019-12-05 03:21:36.000000000 -0500
@@ -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
 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 n
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/netfilter/nf_tables_api.c linux-libre-4.19.88-gnu/net/netfilter/nf_tables_api.c
--- linux-libre-4.19.87-gnu/net/netfilter/nf_tables_api.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/netfilter/nf_tables_api.c	2019-12-05 03:21:36.000000000 -0500
@@ -5737,6 +5737,8 @@ static int nf_tables_fill_flowtable_info
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/openvswitch/datapath.c linux-libre-4.19.88-gnu/net/openvswitch/datapath.c
--- linux-libre-4.19.87-gnu/net/openvswitch/datapath.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/openvswitch/datapath.c	2019-12-05 03:21:36.000000000 -0500
@@ -697,9 +697,13 @@ static size_t ovs_flow_cmd_msg_size(cons
 {
 	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_buil
 	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_bu
 						     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_bu
 		}
 	}
 
+out_free:
 	ovs_flow_free(flow, true);
 	return 0;
 unlock:
diff -druNp --no-dereference linux-libre-4.19.87-gnu/net/psample/psample.c linux-libre-4.19.88-gnu/net/psample/psample.c
--- linux-libre-4.19.87-gnu/net/psample/psample.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/psample/psample.c	2019-12-05 03:21:36.000000000 -0500
@@ -223,7 +223,7 @@ void psample_sample_packet(struct psampl
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/sched/sch_mq.c linux-libre-4.19.88-gnu/net/sched/sch_mq.c
--- linux-libre-4.19.87-gnu/net/sched/sch_mq.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/sched/sch_mq.c	2019-12-05 03:21:36.000000000 -0500
@@ -242,7 +242,8 @@ static int mq_dump_class_stats(struct Qd
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/sched/sch_mqprio.c linux-libre-4.19.88-gnu/net/sched/sch_mqprio.c
--- linux-libre-4.19.87-gnu/net/sched/sch_mqprio.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/sched/sch_mqprio.c	2019-12-05 03:21:36.000000000 -0500
@@ -559,8 +559,8 @@ static int mqprio_dump_class_stats(struc
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/sched/sch_multiq.c linux-libre-4.19.88-gnu/net/sched/sch_multiq.c
--- linux-libre-4.19.87-gnu/net/sched/sch_multiq.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/sched/sch_multiq.c	2019-12-05 03:21:36.000000000 -0500
@@ -343,7 +343,7 @@ static int multiq_dump_class_stats(struc
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/sched/sch_prio.c linux-libre-4.19.88-gnu/net/sched/sch_prio.c
--- linux-libre-4.19.87-gnu/net/sched/sch_prio.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/sched/sch_prio.c	2019-12-05 03:21:36.000000000 -0500
@@ -396,7 +396,7 @@ static int prio_dump_class_stats(struct
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/sctp/associola.c linux-libre-4.19.88-gnu/net/sctp/associola.c
--- linux-libre-4.19.87-gnu/net/sctp/associola.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/sctp/associola.c	2019-12-05 03:21:36.000000000 -0500
@@ -80,6 +80,7 @@ static struct sctp_association *sctp_ass
 	/* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/sctp/endpointola.c linux-libre-4.19.88-gnu/net/sctp/endpointola.c
--- linux-libre-4.19.87-gnu/net/sctp/endpointola.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/sctp/endpointola.c	2019-12-05 03:21:36.000000000 -0500
@@ -165,6 +165,7 @@ static struct sctp_endpoint *sctp_endpoi
 
 	/* Remember who we are attached to.  */
 	ep->base.sk = sk;
+	ep->base.net = sock_net(sk);
 	sock_hold(ep->base.sk);
 
 	return ep;
diff -druNp --no-dereference linux-libre-4.19.87-gnu/net/sctp/input.c linux-libre-4.19.88-gnu/net/sctp/input.c
--- linux-libre-4.19.87-gnu/net/sctp/input.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/sctp/input.c	2019-12-05 03:21:36.000000000 -0500
@@ -815,7 +815,7 @@ static inline int sctp_hash_cmp(struct r
 	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
 {
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/sctp/sm_statefuns.c linux-libre-4.19.88-gnu/net/sctp/sm_statefuns.c
--- linux-libre-4.19.87-gnu/net/sctp/sm_statefuns.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/sctp/sm_statefuns.c	2019-12-05 03:21:36.000000000 -0500
@@ -2175,8 +2175,10 @@ enum sctp_disposition sctp_sf_do_5_2_4_d
 
 	/* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/sctp/transport.c linux-libre-4.19.88-gnu/net/sctp/transport.c
--- linux-libre-4.19.87-gnu/net/sctp/transport.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/sctp/transport.c	2019-12-05 03:21:36.000000000 -0500
@@ -207,7 +207,8 @@ void sctp_transport_reset_hb_timer(struc
 
 	/* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/smc/smc_cdc.c linux-libre-4.19.88-gnu/net/smc/smc_cdc.c
--- linux-libre-4.19.87-gnu/net/smc/smc_cdc.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/smc/smc_cdc.c	2019-12-05 03:21:36.000000000 -0500
@@ -96,6 +96,7 @@ int smc_cdc_msg_send(struct smc_connecti
 		     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_connecti
 
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/smc/smc_cdc.h linux-libre-4.19.88-gnu/net/smc/smc_cdc.h
--- linux-libre-4.19.87-gnu/net/smc/smc_cdc.h	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/smc/smc_cdc.h	2019-12-05 03:21:36.000000000 -0500
@@ -135,7 +135,9 @@ static inline void smc_curs_copy_net(uni
 #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
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/smc/smc_core.c linux-libre-4.19.88-gnu/net/smc/smc_core.c
--- linux-libre-4.19.87-gnu/net/smc/smc_core.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/smc/smc_core.c	2019-12-05 03:21:36.000000000 -0500
@@ -128,6 +128,8 @@ static void smc_lgr_unregister_conn(stru
 {
 	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
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/smc/smc_tx.c linux-libre-4.19.88-gnu/net/smc/smc_tx.c
--- linux-libre-4.19.87-gnu/net/smc/smc_tx.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/smc/smc_tx.c	2019-12-05 03:21:36.000000000 -0500
@@ -163,12 +163,11 @@ int smc_tx_sendmsg(struct smc_sock *smc,
 			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_c
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/sunrpc/xprtrdma/rpc_rdma.c linux-libre-4.19.88-gnu/net/sunrpc/xprtrdma/rpc_rdma.c
--- linux-libre-4.19.87-gnu/net/sunrpc/xprtrdma/rpc_rdma.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/sunrpc/xprtrdma/rpc_rdma.c	2019-12-05 03:21:36.000000000 -0500
@@ -1360,6 +1360,10 @@ void rpcrdma_reply_handler(struct rpcrdm
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/tipc/link.c linux-libre-4.19.88-gnu/net/tipc/link.c
--- linux-libre-4.19.87-gnu/net/tipc/link.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/tipc/link.c	2019-12-05 03:21:36.000000000 -0500
@@ -1114,7 +1114,7 @@ static bool tipc_data_input(struct tipc_
 	default:
 		pr_warn("Dropping received illegal msg type\n");
 		kfree_skb(skb);
-		return false;
+		return true;
 	};
 }
 
diff -druNp --no-dereference linux-libre-4.19.87-gnu/net/tipc/netlink_compat.c linux-libre-4.19.88-gnu/net/tipc/netlink_compat.c
--- linux-libre-4.19.87-gnu/net/tipc/netlink_compat.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/tipc/netlink_compat.c	2019-12-05 03:21:36.000000000 -0500
@@ -548,7 +548,7 @@ static int tipc_nl_compat_link_stat_dump
 	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_sta
 	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(stru
 
 	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
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/vmw_vsock/af_vsock.c linux-libre-4.19.88-gnu/net/vmw_vsock/af_vsock.c
--- linux-libre-4.19.87-gnu/net/vmw_vsock/af_vsock.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/vmw_vsock/af_vsock.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/net/xfrm/xfrm_state.c linux-libre-4.19.88-gnu/net/xfrm/xfrm_state.c
--- linux-libre-4.19.87-gnu/net/xfrm/xfrm_state.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/net/xfrm/xfrm_state.c	2019-12-05 03:21:36.000000000 -0500
@@ -456,6 +456,8 @@ static void ___xfrm_state_destroy(struct
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/samples/bpf/Makefile linux-libre-4.19.88-gnu/samples/bpf/Makefile
--- linux-libre-4.19.87-gnu/samples/bpf/Makefile	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/samples/bpf/Makefile	2019-12-05 03:21:36.000000000 -0500
@@ -172,6 +172,7 @@ KBUILD_HOSTCFLAGS += -I$(srctree)/tools/
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/samples/vfio-mdev/mtty.c linux-libre-4.19.88-gnu/samples/vfio-mdev/mtty.c
--- linux-libre-4.19.87-gnu/samples/vfio-mdev/mtty.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/samples/vfio-mdev/mtty.c	2019-12-05 03:21:36.000000000 -0500
@@ -171,7 +171,7 @@ static struct mdev_state *find_mdev_stat
 	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(str
 }
 
 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
 }
 
 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 in
 }
 
 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_s
 	}
 }
 
-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_d
 #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_d
 #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 *md
 		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 *md
 		} 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 *md
 		} 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 *m
 			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 *m
 			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 *m
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/scripts/gdb/linux/symbols.py linux-libre-4.19.88-gnu/scripts/gdb/linux/symbols.py
--- linux-libre-4.19.87-gnu/scripts/gdb/linux/symbols.py	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/scripts/gdb/linux/symbols.py	2019-12-05 03:21:36.000000000 -0500
@@ -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 -druNp --no-dereference linux-libre-4.19.87-gnu/security/apparmor/apparmorfs.c linux-libre-4.19.88-gnu/security/apparmor/apparmorfs.c
--- linux-libre-4.19.87-gnu/security/apparmor/apparmorfs.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/security/apparmor/apparmorfs.c	2019-12-05 03:21:36.000000000 -0500
@@ -361,6 +361,7 @@ static void aafs_remove(struct dentry *d
 			simple_rmdir(dir, dentry);
 		else
 			simple_unlink(dir, dentry);
+		d_delete(dentry);
 		dput(dentry);
 	}
 	inode_unlock(dir);
diff -druNp --no-dereference linux-libre-4.19.87-gnu/sound/core/compress_offload.c linux-libre-4.19.88-gnu/sound/core/compress_offload.c
--- linux-libre-4.19.87-gnu/sound/core/compress_offload.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/sound/core/compress_offload.c	2019-12-05 03:21:36.000000000 -0500
@@ -529,7 +529,7 @@ static int snd_compress_check_input(stru
 {
 	/* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/sound/soc/codecs/msm8916-wcd-analog.c linux-libre-4.19.88-gnu/sound/soc/codecs/msm8916-wcd-analog.c
--- linux-libre-4.19.87-gnu/sound/soc/codecs/msm8916-wcd-analog.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/sound/soc/codecs/msm8916-wcd-analog.c	2019-12-05 03:21:36.000000000 -0500
@@ -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 =
 
 /* 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 -druNp --no-dereference linux-libre-4.19.87-gnu/sound/soc/codecs/rt5645.c linux-libre-4.19.88-gnu/sound/soc/codecs/rt5645.c
--- linux-libre-4.19.87-gnu/sound/soc/codecs/rt5645.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/sound/soc/codecs/rt5645.c	2019-12-05 03:21:36.000000000 -0500
@@ -3662,6 +3662,11 @@ static const struct rt5645_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_pl
 		},
 		.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 -druNp --no-dereference linux-libre-4.19.87-gnu/sound/soc/kirkwood/kirkwood-i2s.c linux-libre-4.19.88-gnu/sound/soc/kirkwood/kirkwood-i2s.c
--- linux-libre-4.19.87-gnu/sound/soc/kirkwood/kirkwood-i2s.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/sound/soc/kirkwood/kirkwood-i2s.c	2019-12-05 03:21:36.000000000 -0500
@@ -563,10 +563,6 @@ static int kirkwood_i2s_dev_probe(struct
 		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
 		}
 	}
 
+	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
 		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(struc
 {
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/sound/soc/samsung/i2s.c linux-libre-4.19.88-gnu/sound/soc/samsung/i2s.c
--- linux-libre-4.19.87-gnu/sound/soc/samsung/i2s.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/sound/soc/samsung/i2s.c	2019-12-05 03:21:36.000000000 -0500
@@ -604,6 +604,7 @@ static int i2s_set_fmt(struct snd_soc_da
 	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_da
 		 * 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_
 	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_
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/sound/soc/stm/stm32_i2s.c linux-libre-4.19.88-gnu/sound/soc/stm/stm32_i2s.c
--- linux-libre-4.19.87-gnu/sound/soc/stm/stm32_i2s.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/sound/soc/stm/stm32_i2s.c	2019-12-05 03:21:36.000000000 -0500
@@ -246,8 +246,8 @@ static irqreturn_t stm32_i2s_isr(int irq
 		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(struc
 	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 sn
 {
 	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 sn
 	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 sn
 	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_
 	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_
 		/* 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_
 			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 -druNp --no-dereference linux-libre-4.19.87-gnu/sound/soc/stm/stm32_sai.c linux-libre-4.19.88-gnu/sound/soc/stm/stm32_sai.c
--- linux-libre-4.19.87-gnu/sound/soc/stm/stm32_sai.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/sound/soc/stm/stm32_sai.c	2019-12-05 03:21:36.000000000 -0500
@@ -112,16 +112,21 @@ static int stm32_sai_set_sync(struct stm
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/sound/soc/stm/stm32_sai_sub.c linux-libre-4.19.88-gnu/sound/soc/stm/stm32_sai_sub.c
--- linux-libre-4.19.87-gnu/sound/soc/stm/stm32_sai_sub.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/sound/soc/stm/stm32_sai_sub.c	2019-12-05 03:21:36.000000000 -0500
@@ -994,6 +994,16 @@ static int stm32_sai_pcm_process_spdif(s
 	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_co
 };
 
 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 -druNp --no-dereference linux-libre-4.19.87-gnu/tools/testing/selftests/bpf/test_sockmap.c linux-libre-4.19.88-gnu/tools/testing/selftests/bpf/test_sockmap.c
--- linux-libre-4.19.87-gnu/tools/testing/selftests/bpf/test_sockmap.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/tools/testing/selftests/bpf/test_sockmap.c	2019-12-05 03:21:36.000000000 -0500
@@ -248,6 +248,10 @@ static int msg_loop_sendpage(int fd, int
 	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
 	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 -druNp --no-dereference linux-libre-4.19.87-gnu/tools/vm/page-types.c linux-libre-4.19.88-gnu/tools/vm/page-types.c
--- linux-libre-4.19.87-gnu/tools/vm/page-types.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/tools/vm/page-types.c	2019-12-05 03:21:36.000000000 -0500
@@ -701,7 +701,7 @@ static void walk_pfn(unsigned long voffs
 		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 -druNp --no-dereference linux-libre-4.19.87-gnu/virt/kvm/kvm_main.c linux-libre-4.19.88-gnu/virt/kvm/kvm_main.c
--- linux-libre-4.19.87-gnu/virt/kvm/kvm_main.c	2019-12-01 03:17:47.000000000 -0500
+++ linux-libre-4.19.88-gnu/virt/kvm/kvm_main.c	2019-12-05 03:21:36.000000000 -0500
@@ -3990,7 +3990,7 @@ static void kvm_uevent_notify_change(uns
 	}
 	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) {
