diff -druNp --no-dereference linux-libre-5.3.14-gnu/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi linux-libre-5.3.15-gnu/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi
--- linux-libre-5.3.14-gnu/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/arch/arm/boot/dts/imx6qdl-sabreauto.dtsi	2019-12-04 16:34:32.000000000 -0500
@@ -230,6 +230,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>;
 			};
@@ -628,6 +630,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-5.3.14-gnu/arch/arm/boot/dts/stm32mp157c.dtsi linux-libre-5.3.15-gnu/arch/arm/boot/dts/stm32mp157c.dtsi
--- linux-libre-5.3.14-gnu/arch/arm/boot/dts/stm32mp157c.dtsi	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/arch/arm/boot/dts/stm32mp157c.dtsi	2019-12-04 16:34:32.000000000 -0500
@@ -914,7 +914,7 @@
 			interrupt-names = "int0", "int1";
 			clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;
 			clock-names = "hclk", "cclk";
-			bosch,mram-cfg = <0x1400 0 0 32 0 0 2 2>;
+			bosch,mram-cfg = <0x0 0 0 32 0 0 2 2>;
 			status = "disabled";
 		};
 
@@ -927,7 +927,7 @@
 			interrupt-names = "int0", "int1";
 			clocks = <&rcc CK_HSE>, <&rcc FDCAN_K>;
 			clock-names = "hclk", "cclk";
-			bosch,mram-cfg = <0x0 0 0 32 0 0 2 2>;
+			bosch,mram-cfg = <0x1400 0 0 32 0 0 2 2>;
 			status = "disabled";
 		};
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts linux-libre-5.3.15-gnu/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts
--- linux-libre-5.3.14-gnu/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/arch/arm/boot/dts/sun8i-a83t-tbs-a711.dts	2019-12-04 16:34:32.000000000 -0500
@@ -192,6 +192,7 @@
 	vqmmc-supply = <&reg_dldo1>;
 	non-removable;
 	wakeup-source;
+	keep-power-in-suspend;
 	status = "okay";
 
 	brcmf: wifi@1 {
diff -druNp --no-dereference linux-libre-5.3.14-gnu/arch/arm64/boot/dts/freescale/fsl-ls1028a-qds.dts linux-libre-5.3.15-gnu/arch/arm64/boot/dts/freescale/fsl-ls1028a-qds.dts
--- linux-libre-5.3.14-gnu/arch/arm64/boot/dts/freescale/fsl-ls1028a-qds.dts	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/arch/arm64/boot/dts/freescale/fsl-ls1028a-qds.dts	2019-12-04 16:34:32.000000000 -0500
@@ -99,7 +99,7 @@
 	status = "okay";
 
 	i2c-mux@77 {
-		compatible = "nxp,pca9847";
+		compatible = "nxp,pca9547";
 		reg = <0x77>;
 		#address-cells = <1>;
 		#size-cells = <0>;
diff -druNp --no-dereference linux-libre-5.3.14-gnu/arch/arm64/boot/dts/freescale/imx8mm.dtsi linux-libre-5.3.15-gnu/arch/arm64/boot/dts/freescale/imx8mm.dtsi
--- linux-libre-5.3.14-gnu/arch/arm64/boot/dts/freescale/imx8mm.dtsi	2019-11-29 07:41:35.000000000 -0500
+++ linux-libre-5.3.15-gnu/arch/arm64/boot/dts/freescale/imx8mm.dtsi	2019-12-05 05:17:26.000000000 -0500
@@ -370,7 +370,7 @@
 			};
 
 			sdma2: dma-controller@302c0000 {
-				compatible = "fsl,imx8mm-sdma", "fsl,imx7d-sdma";
+				compatible = "fsl,imx8mm-sdma", "fsl,imx8mq-sdma";
 				reg = <0x302c0000 0x10000>;
 				interrupts = <GIC_SPI 103 IRQ_TYPE_LEVEL_HIGH>;
 				clocks = <&clk IMX8MM_CLK_SDMA2_ROOT>,
@@ -381,7 +381,7 @@
 			};
 
 			sdma3: dma-controller@302b0000 {
-				compatible = "fsl,imx8mm-sdma", "fsl,imx7d-sdma";
+				compatible = "fsl,imx8mm-sdma", "fsl,imx8mq-sdma";
 				reg = <0x302b0000 0x10000>;
 				interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>;
 				clocks = <&clk IMX8MM_CLK_SDMA3_ROOT>,
@@ -693,7 +693,7 @@
 			};
 
 			sdma1: dma-controller@30bd0000 {
-				compatible = "fsl,imx8mm-sdma", "fsl,imx7d-sdma";
+				compatible = "fsl,imx8mm-sdma", "fsl,imx8mq-sdma";
 				reg = <0x30bd0000 0x10000>;
 				interrupts = <GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>;
 				clocks = <&clk IMX8MM_CLK_SDMA1_ROOT>,
diff -druNp --no-dereference linux-libre-5.3.14-gnu/arch/arm64/boot/dts/freescale/imx8mq-zii-ultra.dtsi linux-libre-5.3.15-gnu/arch/arm64/boot/dts/freescale/imx8mq-zii-ultra.dtsi
--- linux-libre-5.3.14-gnu/arch/arm64/boot/dts/freescale/imx8mq-zii-ultra.dtsi	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/arch/arm64/boot/dts/freescale/imx8mq-zii-ultra.dtsi	2019-12-04 16:34:32.000000000 -0500
@@ -100,7 +100,7 @@
 		regulator-name = "0V9_ARM";
 		regulator-min-microvolt = <900000>;
 		regulator-max-microvolt = <1000000>;
-		gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
+		gpios = <&gpio3 16 GPIO_ACTIVE_HIGH>;
 		states = <1000000 0x1
 		           900000 0x0>;
 		regulator-always-on;
diff -druNp --no-dereference linux-libre-5.3.14-gnu/arch/powerpc/net/bpf_jit_comp64.c linux-libre-5.3.15-gnu/arch/powerpc/net/bpf_jit_comp64.c
--- linux-libre-5.3.14-gnu/arch/powerpc/net/bpf_jit_comp64.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/arch/powerpc/net/bpf_jit_comp64.c	2019-12-04 16:34:32.000000000 -0500
@@ -1142,6 +1142,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-5.3.14-gnu/arch/x86/include/asm/fpu/internal.h linux-libre-5.3.15-gnu/arch/x86/include/asm/fpu/internal.h
--- linux-libre-5.3.14-gnu/arch/x86/include/asm/fpu/internal.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/arch/x86/include/asm/fpu/internal.h	2019-12-04 16:34:32.000000000 -0500
@@ -509,7 +509,7 @@ static inline void __fpu_invalidate_fpre
 
 static inline int fpregs_state_valid(struct fpu *fpu, unsigned int cpu)
 {
-	return fpu == this_cpu_read_stable(fpu_fpregs_owner_ctx) && cpu == fpu->last_cpu;
+	return fpu == this_cpu_read(fpu_fpregs_owner_ctx) && cpu == fpu->last_cpu;
 }
 
 /*
diff -druNp --no-dereference linux-libre-5.3.14-gnu/arch/x86/kernel/cpu/resctrl/ctrlmondata.c linux-libre-5.3.15-gnu/arch/x86/kernel/cpu/resctrl/ctrlmondata.c
--- linux-libre-5.3.14-gnu/arch/x86/kernel/cpu/resctrl/ctrlmondata.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/arch/x86/kernel/cpu/resctrl/ctrlmondata.c	2019-12-04 16:34:32.000000000 -0500
@@ -522,6 +522,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-5.3.14-gnu/arch/x86/kernel/tsc.c linux-libre-5.3.15-gnu/arch/x86/kernel/tsc.c
--- linux-libre-5.3.14-gnu/arch/x86/kernel/tsc.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/arch/x86/kernel/tsc.c	2019-12-04 16:34:32.000000000 -0500
@@ -1505,6 +1505,9 @@ void __init tsc_init(void)
 		return;
 	}
 
+	if (tsc_clocksource_reliable || no_tsc_watchdog)
+		clocksource_tsc_early.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
+
 	clocksource_register_khz(&clocksource_tsc_early, tsc_khz);
 	detect_art();
 }
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/block/drbd/drbd_main.c linux-libre-5.3.15-gnu/drivers/block/drbd/drbd_main.c
--- linux-libre-5.3.14-gnu/drivers/block/drbd/drbd_main.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/block/drbd/drbd_main.c	2019-12-04 16:34:32.000000000 -0500
@@ -786,7 +786,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-5.3.14-gnu/drivers/clk/at91/clk-main.c linux-libre-5.3.15-gnu/drivers/clk/at91/clk-main.c
--- linux-libre-5.3.14-gnu/drivers/clk/at91/clk-main.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/clk/at91/clk-main.c	2019-12-04 16:34:32.000000000 -0500
@@ -156,7 +156,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;
@@ -297,7 +297,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-5.3.14-gnu/drivers/clk/at91/sam9x60.c linux-libre-5.3.15-gnu/drivers/clk/at91/sam9x60.c
--- linux-libre-5.3.14-gnu/drivers/clk/at91/sam9x60.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/clk/at91/sam9x60.c	2019-12-04 16:34:32.000000000 -0500
@@ -43,6 +43,7 @@ static const struct clk_pll_characterist
 };
 
 static const struct clk_programmable_layout sam9x60_programmable_layout = {
+	.pres_mask = 0xff,
 	.pres_shift = 8,
 	.css_mask = 0x1f,
 	.have_slck_mck = 0,
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/clk/at91/sckc.c linux-libre-5.3.15-gnu/drivers/clk/at91/sckc.c
--- linux-libre-5.3.14-gnu/drivers/clk/at91/sckc.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/clk/at91/sckc.c	2019-12-04 16:34:32.000000000 -0500
@@ -76,7 +76,10 @@ static int clk_slow_osc_prepare(struct c
 
 	writel(tmp | osc->bits->cr_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;
 }
@@ -187,7 +190,10 @@ static int clk_slow_rc_osc_prepare(struc
 
 	writel(readl(sckcr) | osc->bits->cr_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;
 }
@@ -288,7 +294,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;
 }
@@ -533,7 +542,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-5.3.14-gnu/drivers/clk/meson/gxbb.c linux-libre-5.3.15-gnu/drivers/clk/meson/gxbb.c
--- linux-libre-5.3.14-gnu/drivers/clk/meson/gxbb.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/clk/meson/gxbb.c	2019-12-04 16:34:32.000000000 -0500
@@ -866,6 +866,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-5.3.14-gnu/drivers/clk/samsung/clk-exynos5420.c linux-libre-5.3.15-gnu/drivers/clk/samsung/clk-exynos5420.c
--- linux-libre-5.3.14-gnu/drivers/clk/samsung/clk-exynos5420.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/clk/samsung/clk-exynos5420.c	2019-12-04 16:34:32.000000000 -0500
@@ -165,12 +165,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,
@@ -1172,8 +1178,6 @@ static const struct samsung_gate_clock e
 	GATE(CLK_SCLK_ISP_SENSOR2, "sclk_isp_sensor2", "dout_isp_sensor2",
 			GATE_TOP_SCLK_ISP, 12, CLK_SET_RATE_PARENT, 0),
 
-	GATE(CLK_G3D, "g3d", "mout_user_aclk_g3d", GATE_IP_G3D, 9, 0, 0),
-
 	/* CDREX */
 	GATE(CLK_CLKM_PHY0, "clkm_phy0", "dout_sclk_cdrex",
 			GATE_BUS_CDREX0, 0, 0, 0),
@@ -1248,6 +1252,15 @@ static struct exynos5_subcmu_reg_dump ex
 	{ DIV2_RATIO0, 0, 0x30 },	/* DIV dout_gscl_blk_300 */
 };
 
+static const struct samsung_gate_clock exynos5x_g3d_gate_clks[] __initconst = {
+	GATE(CLK_G3D, "g3d", "mout_user_aclk_g3d", GATE_IP_G3D, 9, 0, 0),
+};
+
+static struct exynos5_subcmu_reg_dump exynos5x_g3d_suspend_regs[] = {
+	{ GATE_IP_G3D, 0x3ff, 0x3ff },	/* G3D gates */
+	{ SRC_TOP5, 0, BIT(16) },	/* MUX mout_user_aclk_g3d */
+};
+
 static const struct samsung_div_clock exynos5x_mfc_div_clks[] __initconst = {
 	DIV(0, "dout_mfc_blk", "mout_user_aclk333", DIV4_RATIO, 0, 2),
 };
@@ -1320,6 +1333,14 @@ static const struct exynos5_subcmu_info
 	.pd_name	= "GSC",
 };
 
+static const struct exynos5_subcmu_info exynos5x_g3d_subcmu = {
+	.gate_clks	= exynos5x_g3d_gate_clks,
+	.nr_gate_clks	= ARRAY_SIZE(exynos5x_g3d_gate_clks),
+	.suspend_regs	= exynos5x_g3d_suspend_regs,
+	.nr_suspend_regs = ARRAY_SIZE(exynos5x_g3d_suspend_regs),
+	.pd_name	= "G3D",
+};
+
 static const struct exynos5_subcmu_info exynos5x_mfc_subcmu = {
 	.div_clks	= exynos5x_mfc_div_clks,
 	.nr_div_clks	= ARRAY_SIZE(exynos5x_mfc_div_clks),
@@ -1351,6 +1372,7 @@ static const struct exynos5_subcmu_info
 static const struct exynos5_subcmu_info *exynos5x_subcmus[] = {
 	&exynos5x_disp_subcmu,
 	&exynos5x_gsc_subcmu,
+	&exynos5x_g3d_subcmu,
 	&exynos5x_mfc_subcmu,
 	&exynos5x_mscl_subcmu,
 };
@@ -1358,6 +1380,7 @@ static const struct exynos5_subcmu_info
 static const struct exynos5_subcmu_info *exynos5800_subcmus[] = {
 	&exynos5x_disp_subcmu,
 	&exynos5x_gsc_subcmu,
+	&exynos5x_g3d_subcmu,
 	&exynos5x_mfc_subcmu,
 	&exynos5x_mscl_subcmu,
 	&exynos5800_mau_subcmu,
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/clk/samsung/clk-exynos5433.c linux-libre-5.3.15-gnu/drivers/clk/samsung/clk-exynos5433.c
--- linux-libre-5.3.14-gnu/drivers/clk/samsung/clk-exynos5433.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/clk/samsung/clk-exynos5433.c	2019-12-04 16:34:32.000000000 -0500
@@ -13,6 +13,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>
 
@@ -5584,6 +5585,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;
@@ -5592,12 +5595,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-5.3.14-gnu/drivers/clk/sunxi/clk-sunxi.c linux-libre-5.3.15-gnu/drivers/clk/sunxi/clk-sunxi.c
--- linux-libre-5.3.14-gnu/drivers/clk/sunxi/clk-sunxi.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/clk/sunxi/clk-sunxi.c	2019-12-04 16:34:32.000000000 -0500
@@ -1080,8 +1080,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-5.3.14-gnu/drivers/clk/sunxi-ng/ccu-sun9i-a80.c linux-libre-5.3.15-gnu/drivers/clk/sunxi-ng/ccu-sun9i-a80.c
--- linux-libre-5.3.14-gnu/drivers/clk/sunxi-ng/ccu-sun9i-a80.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/clk/sunxi-ng/ccu-sun9i-a80.c	2019-12-04 16:34:32.000000000 -0500
@@ -1224,7 +1224,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-5.3.14-gnu/drivers/clk/ti/clkctrl.c linux-libre-5.3.15-gnu/drivers/clk/ti/clkctrl.c
--- linux-libre-5.3.14-gnu/drivers/clk/ti/clkctrl.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/clk/ti/clkctrl.c	2019-12-04 16:34:32.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-5.3.14-gnu/drivers/clk/ti/clk-dra7-atl.c linux-libre-5.3.15-gnu/drivers/clk/ti/clk-dra7-atl.c
--- linux-libre-5.3.14-gnu/drivers/clk/ti/clk-dra7-atl.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/clk/ti/clk-dra7-atl.c	2019-12-04 16:34:32.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-5.3.14-gnu/drivers/clocksource/timer-mediatek.c linux-libre-5.3.15-gnu/drivers/clocksource/timer-mediatek.c
--- linux-libre-5.3.14-gnu/drivers/clocksource/timer-mediatek.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/clocksource/timer-mediatek.c	2019-12-04 16:34:32.000000000 -0500
@@ -268,15 +268,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)
@@ -293,7 +290,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);
@@ -311,9 +308,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-5.3.14-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
--- linux-libre-5.3.14-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c	2019-12-04 16:34:32.000000000 -0500
@@ -597,8 +597,11 @@ void amdgpu_ctx_mgr_entity_fini(struct a
 			continue;
 		}
 
-		for (i = 0; i < num_entities; i++)
+		for (i = 0; i < num_entities; i++) {
+			mutex_lock(&ctx->adev->lock_reset);
 			drm_sched_entity_fini(&ctx->entities[0][i].entity);
+			mutex_unlock(&ctx->adev->lock_reset);
+		}
 	}
 }
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
--- linux-libre-5.3.14-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c	2019-11-29 07:36:57.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c	2019-12-05 05:12:21.000000000 -0500
@@ -2783,6 +2783,13 @@ fence_driver_init:
 			DRM_INFO("amdgpu: acceleration disabled, skipping benchmarks\n");
 	}
 
+	/*
+	 * Register gpu instance before amdgpu_device_enable_mgpu_fan_boost.
+	 * Otherwise the mgpu fan boost feature will be skipped due to the
+	 * gpu instance is counted less.
+	 */
+	amdgpu_register_gpu_instance(adev);
+
 	/* enable clockgating, etc. after ib tests, etc. since some blocks require
 	 * explicit gating rather than handling it automatically.
 	 */
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
--- linux-libre-5.3.14-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c	2019-12-04 16:34:32.000000000 -0500
@@ -190,7 +190,6 @@ int amdgpu_driver_load_kms(struct drm_de
 		pm_runtime_put_autosuspend(dev->dev);
 	}
 
-	amdgpu_register_gpu_instance(adev);
 out:
 	if (r) {
 		/* balance pm_runtime_get_sync in amdgpu_driver_unload_kms */
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
--- linux-libre-5.3.14-gnu/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c	2019-11-29 07:35:38.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c	2019-12-05 05:11:06.000000000 -0500
@@ -496,6 +496,13 @@ static void gfx_v9_0_check_fw_write_wait
 	adev->gfx.me_fw_write_wait = false;
 	adev->gfx.mec_fw_write_wait = false;
 
+	if ((adev->gfx.mec_fw_version < 0x000001a5) ||
+	    (adev->gfx.mec_feature_version < 46) ||
+	    (adev->gfx.pfp_fw_version < 0x000000b7) ||
+	    (adev->gfx.pfp_feature_version < 46))
+		DRM_WARN_ONCE("Warning: check cp_fw_version and update it to realize \
+			      GRBM requires 1-cycle delay in cp firmware\n");
+
 	switch (adev->asic_type) {
 	case CHIP_VEGA10:
 		if ((adev->gfx.me_fw_version >= 0x0000009c) &&
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/gpu/drm/amd/powerplay/navi10_ppt.c linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/powerplay/navi10_ppt.c
--- linux-libre-5.3.14-gnu/drivers/gpu/drm/amd/powerplay/navi10_ppt.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/powerplay/navi10_ppt.c	2019-12-04 16:34:32.000000000 -0500
@@ -205,7 +205,7 @@ static int navi10_workload_map[] = {
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_POWERSAVING,		WORKLOAD_PPLIB_POWER_SAVING_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_VIDEO,		WORKLOAD_PPLIB_VIDEO_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_VR,			WORKLOAD_PPLIB_VR_BIT),
-	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_COMPUTE,		WORKLOAD_PPLIB_CUSTOM_BIT),
+	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_COMPUTE,		WORKLOAD_PPLIB_COMPUTE_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_CUSTOM,		WORKLOAD_PPLIB_CUSTOM_BIT),
 };
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/gpu/drm/amd/powerplay/vega20_ppt.c linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/powerplay/vega20_ppt.c
--- linux-libre-5.3.14-gnu/drivers/gpu/drm/amd/powerplay/vega20_ppt.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/gpu/drm/amd/powerplay/vega20_ppt.c	2019-12-04 16:34:32.000000000 -0500
@@ -219,7 +219,7 @@ static int vega20_workload_map[] = {
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_POWERSAVING,		WORKLOAD_PPLIB_POWER_SAVING_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_VIDEO,		WORKLOAD_PPLIB_VIDEO_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_VR,			WORKLOAD_PPLIB_VR_BIT),
-	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_COMPUTE,		WORKLOAD_PPLIB_CUSTOM_BIT),
+	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_COMPUTE,		WORKLOAD_PPLIB_COMPUTE_BIT),
 	WORKLOAD_MAP(PP_SMC_POWER_PROFILE_CUSTOM,		WORKLOAD_PPLIB_CUSTOM_BIT),
 };
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/hid/hid-core.c linux-libre-5.3.15-gnu/drivers/hid/hid-core.c
--- linux-libre-5.3.14-gnu/drivers/hid/hid-core.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/hid/hid-core.c	2019-12-04 16:34:32.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 ?
@@ -543,13 +563,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);
+	}
 }
 
 /*
@@ -561,7 +600,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);
 
@@ -772,7 +811,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-5.3.14-gnu/drivers/misc/mei/bus.c linux-libre-5.3.15-gnu/drivers/misc/mei/bus.c
--- linux-libre-5.3.14-gnu/drivers/misc/mei/bus.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/misc/mei/bus.c	2019-12-04 16:34:32.000000000 -0500
@@ -873,15 +873,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-5.3.14-gnu/drivers/misc/mei/hw-me-regs.h linux-libre-5.3.15-gnu/drivers/misc/mei/hw-me-regs.h
--- linux-libre-5.3.14-gnu/drivers/misc/mei/hw-me-regs.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/misc/mei/hw-me-regs.h	2019-12-04 16:34:32.000000000 -0500
@@ -81,6 +81,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-5.3.14-gnu/drivers/misc/mei/pci-me.c linux-libre-5.3.15-gnu/drivers/misc/mei/pci-me.c
--- linux-libre-5.3.14-gnu/drivers/misc/mei/pci-me.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/misc/mei/pci-me.c	2019-12-04 16:34:32.000000000 -0500
@@ -98,6 +98,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-5.3.14-gnu/drivers/net/can/c_can/c_can.c linux-libre-5.3.15-gnu/drivers/net/can/c_can/c_can.c
--- linux-libre-5.3.14-gnu/drivers/net/can/c_can/c_can.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/can/c_can/c_can.c	2019-12-04 16:34:32.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-5.3.14-gnu/drivers/net/can/flexcan.c linux-libre-5.3.15-gnu/drivers/net/can/flexcan.c
--- linux-libre-5.3.14-gnu/drivers/net/can/flexcan.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/can/flexcan.c	2019-12-04 16:34:32.000000000 -0500
@@ -658,6 +658,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;
 
@@ -706,7 +707,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)
@@ -719,6 +722,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;
 
@@ -750,7 +754,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-5.3.14-gnu/drivers/net/can/rx-offload.c linux-libre-5.3.15-gnu/drivers/net/can/rx-offload.c
--- linux-libre-5.3.14-gnu/drivers/net/can/rx-offload.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/can/rx-offload.c	2019-12-04 16:34:32.000000000 -0500
@@ -107,37 +107,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;
 }
 
@@ -157,8 +215,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);
 	}
@@ -188,7 +246,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++;
 	}
@@ -252,8 +316,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-5.3.14-gnu/drivers/net/can/spi/mcp251x.c linux-libre-5.3.15-gnu/drivers/net/can/spi/mcp251x.c
--- linux-libre-5.3.14-gnu/drivers/net/can/spi/mcp251x.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/can/spi/mcp251x.c	2019-12-04 16:34:32.000000000 -0500
@@ -759,6 +759,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) {
@@ -770,7 +771,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-5.3.14-gnu/drivers/net/can/usb/peak_usb/pcan_usb.c linux-libre-5.3.15-gnu/drivers/net/can/usb/peak_usb/pcan_usb.c
--- linux-libre-5.3.14-gnu/drivers/net/can/usb/peak_usb/pcan_usb.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/can/usb/peak_usb/pcan_usb.c	2019-12-04 16:34:32.000000000 -0500
@@ -436,8 +436,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;
 
@@ -460,9 +460,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;
 
@@ -501,6 +501,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-5.3.14-gnu/drivers/net/dsa/sja1105/sja1105_main.c linux-libre-5.3.15-gnu/drivers/net/dsa/sja1105/sja1105_main.c
--- linux-libre-5.3.14-gnu/drivers/net/dsa/sja1105/sja1105_main.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/dsa/sja1105/sja1105_main.c	2019-12-04 16:34:32.000000000 -0500
@@ -591,15 +591,15 @@ static int sja1105_parse_rgmii_delays(st
 	int i;
 
 	for (i = 0; i < SJA1105_NUM_PORTS; i++) {
-		if (ports->role == XMII_MAC)
+		if (ports[i].role == XMII_MAC)
 			continue;
 
-		if (ports->phy_mode == PHY_INTERFACE_MODE_RGMII_RXID ||
-		    ports->phy_mode == PHY_INTERFACE_MODE_RGMII_ID)
+		if (ports[i].phy_mode == PHY_INTERFACE_MODE_RGMII_RXID ||
+		    ports[i].phy_mode == PHY_INTERFACE_MODE_RGMII_ID)
 			priv->rgmii_rx_delay[i] = true;
 
-		if (ports->phy_mode == PHY_INTERFACE_MODE_RGMII_TXID ||
-		    ports->phy_mode == PHY_INTERFACE_MODE_RGMII_ID)
+		if (ports[i].phy_mode == PHY_INTERFACE_MODE_RGMII_TXID ||
+		    ports[i].phy_mode == PHY_INTERFACE_MODE_RGMII_ID)
 			priv->rgmii_tx_delay[i] = true;
 
 		if ((priv->rgmii_rx_delay[i] || priv->rgmii_tx_delay[i]) &&
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/ethernet/broadcom/genet/bcmgenet.c linux-libre-5.3.15-gnu/drivers/net/ethernet/broadcom/genet/bcmgenet.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/broadcom/genet/bcmgenet.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/broadcom/genet/bcmgenet.c	2019-12-04 16:34:32.000000000 -0500
@@ -1996,8 +1996,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)
@@ -2619,8 +2617,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)
@@ -3643,6 +3643,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-5.3.14-gnu/drivers/net/ethernet/broadcom/genet/bcmmii.c linux-libre-5.3.15-gnu/drivers/net/ethernet/broadcom/genet/bcmmii.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/broadcom/genet/bcmmii.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/broadcom/genet/bcmmii.c	2019-12-04 16:34:32.000000000 -0500
@@ -181,8 +181,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);
 
@@ -214,6 +244,9 @@ int bcmgenet_mii_config(struct net_devic
 		phy_set_max_speed(phydev, SPEED_100);
 		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-5.3.14-gnu/drivers/net/ethernet/cadence/macb_main.c linux-libre-5.3.15-gnu/drivers/net/ethernet/cadence/macb_main.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/cadence/macb_main.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/cadence/macb_main.c	2019-12-04 16:34:32.000000000 -0500
@@ -4393,6 +4393,7 @@ static int macb_remove(struct platform_d
 		mdiobus_free(bp->mii_bus);
 
 		unregister_netdev(dev);
+		tasklet_kill(&bp->hresp_err_tasklet);
 		pm_runtime_disable(&pdev->dev);
 		pm_runtime_dont_use_autosuspend(&pdev->dev);
 		if (!pm_runtime_suspended(&pdev->dev)) {
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/ethernet/freescale/fec_main.c linux-libre-5.3.15-gnu/drivers/net/ethernet/freescale/fec_main.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/freescale/fec_main.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/freescale/fec_main.c	2019-12-04 16:34:32.000000000 -0500
@@ -3580,6 +3580,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);
@@ -3587,13 +3592,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-5.3.14-gnu/drivers/net/ethernet/google/gve/gve_main.c linux-libre-5.3.15-gnu/drivers/net/ethernet/google/gve/gve_main.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/google/gve/gve_main.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/google/gve/gve_main.c	2019-12-04 16:34:32.000000000 -0500
@@ -544,7 +544,7 @@ static int gve_alloc_queue_page_list(str
 	}
 
 	qpl->id = id;
-	qpl->num_entries = pages;
+	qpl->num_entries = 0;
 	qpl->pages = kvzalloc(pages * sizeof(*qpl->pages), GFP_KERNEL);
 	/* caller handles clean up */
 	if (!qpl->pages)
@@ -562,6 +562,7 @@ static int gve_alloc_queue_page_list(str
 		/* caller handles clean up */
 		if (err)
 			return -ENOMEM;
+		qpl->num_entries++;
 	}
 	priv->num_registered_pages += pages;
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/ethernet/intel/i40e/i40e_common.c linux-libre-5.3.15-gnu/drivers/net/ethernet/intel/i40e/i40e_common.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/intel/i40e/i40e_common.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/intel/i40e/i40e_common.c	2019-12-04 16:34:32.000000000 -0500
@@ -1861,7 +1861,8 @@ i40e_status i40e_aq_get_link_info(struct
 	     hw->aq.fw_min_ver < 40)) && hw_link_info->phy_type == 0xE)
 		hw_link_info->phy_type = I40E_PHY_TYPE_10GBASE_SFPP_CU;
 
-	if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE) {
+	if (hw->flags & I40E_HW_FLAG_AQ_PHY_ACCESS_CAPABLE &&
+	    hw->mac.type != I40E_MAC_X722) {
 		__le32 tmp;
 
 		memcpy(&tmp, resp->link_type, sizeof(tmp));
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/ethernet/intel/iavf/iavf_main.c linux-libre-5.3.15-gnu/drivers/net/ethernet/intel/iavf/iavf_main.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/intel/iavf/iavf_main.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/intel/iavf/iavf_main.c	2019-12-04 16:34:32.000000000 -0500
@@ -336,7 +336,7 @@ iavf_map_vector_to_rxq(struct iavf_adapt
 	q_vector->rx.target_itr = ITR_TO_REG(rx_ring->itr_setting);
 	q_vector->ring_mask |= BIT(r_idx);
 	wr32(hw, IAVF_VFINT_ITRN1(IAVF_RX_ITR, q_vector->reg_idx),
-	     q_vector->rx.current_itr);
+	     q_vector->rx.current_itr >> 1);
 	q_vector->rx.current_itr = q_vector->rx.target_itr;
 }
 
@@ -362,7 +362,7 @@ iavf_map_vector_to_txq(struct iavf_adapt
 	q_vector->tx.target_itr = ITR_TO_REG(tx_ring->itr_setting);
 	q_vector->num_ringpairs++;
 	wr32(hw, IAVF_VFINT_ITRN1(IAVF_TX_ITR, q_vector->reg_idx),
-	     q_vector->tx.target_itr);
+	     q_vector->tx.target_itr >> 1);
 	q_vector->tx.current_itr = q_vector->tx.target_itr;
 }
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/ethernet/intel/ice/ice_sched.c linux-libre-5.3.15-gnu/drivers/net/ethernet/intel/ice/ice_sched.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/intel/ice/ice_sched.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/intel/ice/ice_sched.c	2019-12-04 16:34:32.000000000 -0500
@@ -1052,7 +1052,7 @@ enum ice_status ice_sched_query_res_allo
 	struct ice_aqc_query_txsched_res_resp *buf;
 	enum ice_status status = 0;
 	__le16 max_sibl;
-	u8 i;
+	u16 i;
 
 	if (hw->layer_info)
 		return status;
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c linux-libre-5.3.15-gnu/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c	2019-12-04 16:34:32.000000000 -0500
@@ -1085,7 +1085,7 @@ static int esw_create_offloads_fdb_table
 			    MLX5_CAP_GEN(dev, max_flow_counter_15_0);
 	fdb_max = 1 << MLX5_CAP_ESW_FLOWTABLE_FDB(dev, log_max_ft_size);
 
-	esw_debug(dev, "Create offloads FDB table, min (max esw size(2^%d), max counters(%d), groups(%d), max flow table size(2^%d))\n",
+	esw_debug(dev, "Create offloads FDB table, min (max esw size(2^%d), max counters(%d), groups(%d), max flow table size(%d))\n",
 		  MLX5_CAP_ESW_FLOWTABLE_FDB(dev, log_max_ft_size),
 		  max_flow_counter, ESW_OFFLOADS_NUM_GROUPS,
 		  fdb_max);
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_termtbl.c linux-libre-5.3.15-gnu/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_termtbl.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_termtbl.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_termtbl.c	2019-12-04 16:34:32.000000000 -0500
@@ -183,7 +183,8 @@ static bool mlx5_eswitch_offload_is_upli
 	u32 port_mask, port_value;
 
 	if (MLX5_CAP_ESW_FLOWTABLE(esw->dev, flow_source))
-		return spec->flow_context.flow_source == MLX5_VPORT_UPLINK;
+		return spec->flow_context.flow_source ==
+					MLX5_FLOW_CONTEXT_FLOW_SOURCE_UPLINK;
 
 	port_mask = MLX5_GET(fte_match_param, spec->match_criteria,
 			     misc_parameters.source_port);
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/ethernet/mscc/ocelot.h linux-libre-5.3.15-gnu/drivers/net/ethernet/mscc/ocelot.h
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/mscc/ocelot.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/mscc/ocelot.h	2019-12-04 16:34:32.000000000 -0500
@@ -479,7 +479,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-5.3.14-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c linux-libre-5.3.15-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/stmicro/stmmac/dwmac4_core.c	2019-12-04 16:34:32.000000000 -0500
@@ -438,7 +438,7 @@ static void dwmac4_set_filter(struct mac
 			 * bits used depends on the hardware configuration
 			 * selected at core configuration time.
 			 */
-			int bit_nr = bitrev32(~crc32_le(~0, ha->addr,
+			u32 bit_nr = bitrev32(~crc32_le(~0, ha->addr,
 					ETH_ALEN)) >> (32 - mcbitslog2);
 			/* The most significant bit determines the register to
 			 * use (H/L) while the other 5 bits determine the bit
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c linux-libre-5.3.15-gnu/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_core.c	2019-12-04 16:34:32.000000000 -0500
@@ -196,6 +196,7 @@ static void dwxgmac2_config_cbs(struct m
 	writel(low_credit, ioaddr + XGMAC_MTL_TCx_LOCREDIT(queue));
 
 	value = readl(ioaddr + XGMAC_MTL_TCx_ETS_CONTROL(queue));
+	value &= ~XGMAC_TSA;
 	value |= XGMAC_CC | XGMAC_CBS;
 	writel(value, ioaddr + XGMAC_MTL_TCx_ETS_CONTROL(queue));
 }
@@ -361,7 +362,7 @@ static void dwxgmac2_set_filter(struct m
 		value |= XGMAC_FILTER_HMC;
 
 		netdev_for_each_mc_addr(ha, dev) {
-			int nr = (bitrev32(~crc32_le(~0, ha->addr, 6)) >>
+			u32 nr = (bitrev32(~crc32_le(~0, ha->addr, 6)) >>
 					(32 - mcbitslog2));
 			mc_filter[nr >> 5] |= (1 << (nr & 0x1F));
 		}
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c linux-libre-5.3.15-gnu/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c
--- linux-libre-5.3.14-gnu/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/ethernet/stmicro/stmmac/dwxgmac2_dma.c	2019-12-04 16:34:32.000000000 -0500
@@ -441,6 +441,7 @@ static void dwxgmac2_enable_tso(void __i
 static void dwxgmac2_qmode(void __iomem *ioaddr, u32 channel, u8 qmode)
 {
 	u32 value = readl(ioaddr + XGMAC_MTL_TXQ_OPMODE(channel));
+	u32 flow = readl(ioaddr + XGMAC_RX_FLOW_CTRL);
 
 	value &= ~XGMAC_TXQEN;
 	if (qmode != MTL_QUEUE_AVB) {
@@ -448,6 +449,7 @@ static void dwxgmac2_qmode(void __iomem
 		writel(0, ioaddr + XGMAC_MTL_TCx_ETS_CONTROL(channel));
 	} else {
 		value |= 0x1 << XGMAC_TXQEN_SHIFT;
+		writel(flow & (~XGMAC_RFE), ioaddr + XGMAC_RX_FLOW_CTRL);
 	}
 
 	writel(value, ioaddr +  XGMAC_MTL_TXQ_OPMODE(channel));
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/macvlan.c linux-libre-5.3.15-gnu/drivers/net/macvlan.c
--- linux-libre-5.3.14-gnu/drivers/net/macvlan.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/macvlan.c	2019-12-04 16:34:32.000000000 -0500
@@ -359,10 +359,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-5.3.14-gnu/drivers/net/phy/mdio_bus.c linux-libre-5.3.15-gnu/drivers/net/phy/mdio_bus.c
--- linux-libre-5.3.14-gnu/drivers/net/phy/mdio_bus.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/phy/mdio_bus.c	2019-12-04 16:34:32.000000000 -0500
@@ -66,8 +66,8 @@ static int mdiobus_register_reset(struct
 	struct reset_control *reset = NULL;
 
 	if (mdiodev->dev.of_node)
-		reset = devm_reset_control_get_exclusive(&mdiodev->dev,
-							 "phy");
+		reset = of_reset_control_get_exclusive(mdiodev->dev.of_node,
+						       "phy");
 	if (IS_ERR(reset)) {
 		if (PTR_ERR(reset) == -ENOENT || PTR_ERR(reset) == -ENOTSUPP)
 			reset = NULL;
@@ -111,6 +111,8 @@ int mdiobus_unregister_device(struct mdi
 	if (mdiodev->bus->mdio_map[mdiodev->addr] != mdiodev)
 		return -EINVAL;
 
+	reset_control_put(mdiodev->reset_ctrl);
+
 	mdiodev->bus->mdio_map[mdiodev->addr] = NULL;
 
 	return 0;
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/net/slip/slip.c linux-libre-5.3.15-gnu/drivers/net/slip/slip.c
--- linux-libre-5.3.14-gnu/drivers/net/slip/slip.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/net/slip/slip.c	2019-12-04 16:34:32.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-5.3.14-gnu/drivers/nvme/host/multipath.c linux-libre-5.3.15-gnu/drivers/nvme/host/multipath.c
--- linux-libre-5.3.14-gnu/drivers/nvme/host/multipath.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/nvme/host/multipath.c	2019-12-04 16:34:32.000000000 -0500
@@ -158,9 +158,11 @@ void nvme_mpath_clear_ctrl_paths(struct
 	struct nvme_ns *ns;
 
 	mutex_lock(&ctrl->scan_lock);
+	down_read(&ctrl->namespaces_rwsem);
 	list_for_each_entry(ns, &ctrl->namespaces, list)
 		if (nvme_mpath_clear_current_path(ns))
 			kblockd_schedule_work(&ns->head->requeue_work);
+	up_read(&ctrl->namespaces_rwsem);
 	mutex_unlock(&ctrl->scan_lock);
 }
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/nvme/host/rdma.c linux-libre-5.3.15-gnu/drivers/nvme/host/rdma.c
--- linux-libre-5.3.14-gnu/drivers/nvme/host/rdma.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/nvme/host/rdma.c	2019-12-04 16:34:32.000000000 -0500
@@ -2118,8 +2118,16 @@ err_unreg_client:
 
 static void __exit nvme_rdma_cleanup_module(void)
 {
+	struct nvme_rdma_ctrl *ctrl;
+
 	nvmf_unregister_transport(&nvme_rdma_transport);
 	ib_unregister_client(&nvme_rdma_ib_client);
+
+	mutex_lock(&nvme_rdma_ctrl_mutex);
+	list_for_each_entry(ctrl, &nvme_rdma_ctrl_list, list)
+		nvme_delete_ctrl(&ctrl->ctrl);
+	mutex_unlock(&nvme_rdma_ctrl_mutex);
+	flush_workqueue(nvme_delete_wq);
 }
 
 module_init(nvme_rdma_init_module);
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/pinctrl/intel/pinctrl-cherryview.c linux-libre-5.3.15-gnu/drivers/pinctrl/intel/pinctrl-cherryview.c
--- linux-libre-5.3.14-gnu/drivers/pinctrl/intel/pinctrl-cherryview.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/pinctrl/intel/pinctrl-cherryview.c	2019-12-04 16:34:32.000000000 -0500
@@ -147,6 +147,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)
@@ -162,6 +163,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;
@@ -1466,16 +1468,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);
@@ -1615,7 +1607,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");
@@ -1632,7 +1632,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-5.3.14-gnu/drivers/platform/x86/hp-wmi.c linux-libre-5.3.15-gnu/drivers/platform/x86/hp-wmi.c
--- linux-libre-5.3.14-gnu/drivers/platform/x86/hp-wmi.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/platform/x86/hp-wmi.c	2019-12-04 16:34:32.000000000 -0500
@@ -65,7 +65,7 @@ struct bios_args {
 	u32 command;
 	u32 commandtype;
 	u32 datasize;
-	u32 data;
+	u8 data[128];
 };
 
 enum hp_wmi_commandtype {
@@ -216,7 +216,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 };
@@ -228,7 +228,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);
 
@@ -380,7 +380,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;
 
@@ -777,7 +777,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-5.3.14-gnu/drivers/pwm/pwm-bcm-iproc.c linux-libre-5.3.15-gnu/drivers/pwm/pwm-bcm-iproc.c
--- linux-libre-5.3.14-gnu/drivers/pwm/pwm-bcm-iproc.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/pwm/pwm-bcm-iproc.c	2019-12-04 16:34:32.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-5.3.14-gnu/drivers/reset/core.c linux-libre-5.3.15-gnu/drivers/reset/core.c
--- linux-libre-5.3.14-gnu/drivers/reset/core.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/reset/core.c	2019-12-04 16:34:32.000000000 -0500
@@ -748,6 +748,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-5.3.14-gnu/drivers/soc/imx/gpc.c linux-libre-5.3.15-gnu/drivers/soc/imx/gpc.c
--- linux-libre-5.3.14-gnu/drivers/soc/imx/gpc.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/soc/imx/gpc.c	2019-12-04 16:34:32.000000000 -0500
@@ -249,13 +249,13 @@ static struct genpd_power_state imx6_pm_
 };
 
 static struct imx_pm_domain imx_gpc_domains[] = {
-	[GPC_PGC_DOMAIN_ARM] {
+	[GPC_PGC_DOMAIN_ARM] = {
 		.base = {
 			.name = "ARM",
 			.flags = GENPD_FLAG_ALWAYS_ON,
 		},
 	},
-	[GPC_PGC_DOMAIN_PU] {
+	[GPC_PGC_DOMAIN_PU] = {
 		.base = {
 			.name = "PU",
 			.power_off = imx6_pm_domain_power_off,
@@ -266,7 +266,7 @@ static struct imx_pm_domain imx_gpc_doma
 		.reg_offs = 0x260,
 		.cntr_pdn_bit = 0,
 	},
-	[GPC_PGC_DOMAIN_DISPLAY] {
+	[GPC_PGC_DOMAIN_DISPLAY] = {
 		.base = {
 			.name = "DISPLAY",
 			.power_off = imx6_pm_domain_power_off,
@@ -275,7 +275,7 @@ static struct imx_pm_domain imx_gpc_doma
 		.reg_offs = 0x240,
 		.cntr_pdn_bit = 4,
 	},
-	[GPC_PGC_DOMAIN_PCI] {
+	[GPC_PGC_DOMAIN_PCI] = {
 		.base = {
 			.name = "PCI",
 			.power_off = imx6_pm_domain_power_off,
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/soundwire/intel.c linux-libre-5.3.15-gnu/drivers/soundwire/intel.c
--- linux-libre-5.3.14-gnu/drivers/soundwire/intel.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/soundwire/intel.c	2019-12-04 16:34:32.000000000 -0500
@@ -765,7 +765,7 @@ static int intel_register_dai(struct sdw
 	/* Create PCM DAIs */
 	stream = &cdns->pcm;
 
-	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, stream->num_in,
+	ret = intel_create_dai(cdns, dais, INTEL_PDI_IN, cdns->pcm.num_in,
 			       off, stream->num_ch_in, true);
 	if (ret)
 		return ret;
@@ -796,7 +796,7 @@ static int intel_register_dai(struct sdw
 	if (ret)
 		return ret;
 
-	off += cdns->pdm.num_bd;
+	off += cdns->pdm.num_out;
 	ret = intel_create_dai(cdns, dais, INTEL_PDI_BD, cdns->pdm.num_bd,
 			       off, stream->num_ch_bd, false);
 	if (ret)
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/staging/rtl8192e/rtl8192e/rtl_core.c linux-libre-5.3.15-gnu/drivers/staging/rtl8192e/rtl8192e/rtl_core.c
--- linux-libre-5.3.14-gnu/drivers/staging/rtl8192e/rtl8192e/rtl_core.c	2019-11-29 07:58:12.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/staging/rtl8192e/rtl8192e/rtl_core.c	2019-12-05 05:39:41.000000000 -0500
@@ -1616,14 +1616,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-5.3.14-gnu/drivers/staging/rtl8723bs/os_dep/sdio_intf.c linux-libre-5.3.15-gnu/drivers/staging/rtl8723bs/os_dep/sdio_intf.c
--- linux-libre-5.3.14-gnu/drivers/staging/rtl8723bs/os_dep/sdio_intf.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/staging/rtl8723bs/os_dep/sdio_intf.c	2019-12-04 16:34:32.000000000 -0500
@@ -18,18 +18,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-5.3.14-gnu/drivers/staging/wilc1000/wilc_hif.c linux-libre-5.3.15-gnu/drivers/staging/wilc1000/wilc_hif.c
--- linux-libre-5.3.14-gnu/drivers/staging/wilc1000/wilc_hif.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/staging/wilc1000/wilc_hif.c	2019-12-04 16:34:32.000000000 -0500
@@ -477,16 +477,21 @@ void *wilc_parse_join_bss_param(struct c
 		memcpy(&param->supp_rates[1], rates_ie + 2, rates_len);
 	}
 
-	supp_rates_ie = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES, ies->data,
-					 ies->len);
-	if (supp_rates_ie) {
-		if (supp_rates_ie[1] > (WILC_MAX_RATES_SUPPORTED - rates_len))
-			param->supp_rates[0] = WILC_MAX_RATES_SUPPORTED;
-		else
-			param->supp_rates[0] += supp_rates_ie[1];
+	if (rates_len < WILC_MAX_RATES_SUPPORTED) {
+		supp_rates_ie = cfg80211_find_ie(WLAN_EID_EXT_SUPP_RATES,
+						 ies->data, ies->len);
+		if (supp_rates_ie) {
+			u8 ext_rates = supp_rates_ie[1];
 
-		memcpy(&param->supp_rates[rates_len + 1], supp_rates_ie + 2,
-		       (param->supp_rates[0] - rates_len));
+			if (ext_rates > (WILC_MAX_RATES_SUPPORTED - rates_len))
+				param->supp_rates[0] = WILC_MAX_RATES_SUPPORTED;
+			else
+				param->supp_rates[0] += ext_rates;
+
+			memcpy(&param->supp_rates[rates_len + 1],
+			       supp_rates_ie + 2,
+			       (param->supp_rates[0] - rates_len));
+		}
 	}
 
 	ht_ie = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, ies->data, ies->len);
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/thunderbolt/switch.c linux-libre-5.3.15-gnu/drivers/thunderbolt/switch.c
--- linux-libre-5.3.14-gnu/drivers/thunderbolt/switch.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/thunderbolt/switch.c	2019-12-04 16:34:32.000000000 -0500
@@ -168,7 +168,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
@@ -176,6 +176,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;
@@ -184,7 +186,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);
 	}
 
 	/*
@@ -192,7 +203,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)
@@ -200,8 +211,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
@@ -887,12 +906,13 @@ int tb_dp_port_set_hops(struct tb_port *
  */
 bool tb_dp_port_is_enabled(struct tb_port *port)
 {
-	u32 data;
+	u32 data[2];
 
-	if (tb_port_read(port, &data, TB_CFG_PORT, port->cap_adap, 1))
+	if (tb_port_read(port, data, TB_CFG_PORT, port->cap_adap,
+			 ARRAY_SIZE(data)))
 		return false;
 
-	return !!(data & (TB_DP_VIDEO_EN | TB_DP_AUX_EN));
+	return !!(data[0] & (TB_DP_VIDEO_EN | TB_DP_AUX_EN));
 }
 
 /**
@@ -905,19 +925,21 @@ bool tb_dp_port_is_enabled(struct tb_por
  */
 int tb_dp_port_enable(struct tb_port *port, bool enable)
 {
-	u32 data;
+	u32 data[2];
 	int ret;
 
-	ret = tb_port_read(port, &data, TB_CFG_PORT, port->cap_adap, 1);
+	ret = tb_port_read(port, data, TB_CFG_PORT, port->cap_adap,
+			   ARRAY_SIZE(data));
 	if (ret)
 		return ret;
 
 	if (enable)
-		data |= TB_DP_VIDEO_EN | TB_DP_AUX_EN;
+		data[0] |= TB_DP_VIDEO_EN | TB_DP_AUX_EN;
 	else
-		data &= ~(TB_DP_VIDEO_EN | TB_DP_AUX_EN);
+		data[0] &= ~(TB_DP_VIDEO_EN | TB_DP_AUX_EN);
 
-	return tb_port_write(port, &data, TB_CFG_PORT, port->cap_adap, 1);
+	return tb_port_write(port, data, TB_CFG_PORT, port->cap_adap,
+			     ARRAY_SIZE(data));
 }
 
 /* switch utility functions */
@@ -1022,13 +1044,6 @@ static int tb_switch_set_authorized(stru
 	if (sw->authorized)
 		goto unlock;
 
-	/*
-	 * Make sure there is no PCIe rescan ongoing when a new PCIe
-	 * tunnel is created. Otherwise the PCIe rescan code might find
-	 * the new tunnel too early.
-	 */
-	pci_lock_rescan_remove();
-
 	switch (val) {
 	/* Approve switch */
 	case 1:
@@ -1048,8 +1063,6 @@ static int tb_switch_set_authorized(stru
 		break;
 	}
 
-	pci_unlock_rescan_remove();
-
 	if (!ret) {
 		sw->authorized = val;
 		/* Notify status change to the userspace */
@@ -1243,8 +1256,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);
 		}
@@ -1670,13 +1681,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:
@@ -1697,6 +1711,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.
@@ -1711,9 +1738,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-5.3.14-gnu/drivers/usb/dwc2/core.c linux-libre-5.3.15-gnu/drivers/usb/dwc2/core.c
--- linux-libre-5.3.14-gnu/drivers/usb/dwc2/core.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/usb/dwc2/core.c	2019-12-04 16:34:32.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-5.3.14-gnu/drivers/usb/serial/ftdi_sio.c linux-libre-5.3.15-gnu/drivers/usb/serial/ftdi_sio.c
--- linux-libre-5.3.14-gnu/drivers/usb/serial/ftdi_sio.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/usb/serial/ftdi_sio.c	2019-12-04 16:34:32.000000000 -0500
@@ -1033,6 +1033,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-5.3.14-gnu/drivers/usb/serial/ftdi_sio_ids.h linux-libre-5.3.15-gnu/drivers/usb/serial/ftdi_sio_ids.h
--- linux-libre-5.3.14-gnu/drivers/usb/serial/ftdi_sio_ids.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/usb/serial/ftdi_sio_ids.h	2019-12-04 16:34:32.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-5.3.14-gnu/drivers/video/fbdev/c2p_core.h linux-libre-5.3.15-gnu/drivers/video/fbdev/c2p_core.h
--- linux-libre-5.3.14-gnu/drivers/video/fbdev/c2p_core.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/video/fbdev/c2p_core.h	2019-12-04 16:34:32.000000000 -0500
@@ -29,7 +29,7 @@ static inline void _transp(u32 d[], unsi
 
 extern void c2p_unsupported(void);
 
-static inline u32 get_mask(unsigned int n)
+static __always_inline u32 get_mask(unsigned int n)
 {
 	switch (n) {
 	case 1:
@@ -57,7 +57,7 @@ static inline u32 get_mask(unsigned int
      *  Transpose operations on 8 32-bit words
      */
 
-static inline void transp8(u32 d[], unsigned int n, unsigned int m)
+static __always_inline void transp8(u32 d[], unsigned int n, unsigned int m)
 {
 	u32 mask = get_mask(n);
 
@@ -99,7 +99,7 @@ static inline void transp8(u32 d[], unsi
      *  Transpose operations on 4 32-bit words
      */
 
-static inline void transp4(u32 d[], unsigned int n, unsigned int m)
+static __always_inline void transp4(u32 d[], unsigned int n, unsigned int m)
 {
 	u32 mask = get_mask(n);
 
@@ -126,7 +126,7 @@ static inline void transp4(u32 d[], unsi
      *  Transpose operations on 4 32-bit words (reverse order)
      */
 
-static inline void transp4x(u32 d[], unsigned int n, unsigned int m)
+static __always_inline void transp4x(u32 d[], unsigned int n, unsigned int m)
 {
 	u32 mask = get_mask(n);
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/watchdog/bd70528_wdt.c linux-libre-5.3.15-gnu/drivers/watchdog/bd70528_wdt.c
--- linux-libre-5.3.14-gnu/drivers/watchdog/bd70528_wdt.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/watchdog/bd70528_wdt.c	2019-12-04 16:34:32.000000000 -0500
@@ -288,3 +288,4 @@ module_platform_driver(bd70528_wdt);
 MODULE_AUTHOR("Matti Vaittinen <matti.vaittinen@fi.rohmeurope.com>");
 MODULE_DESCRIPTION("BD70528 watchdog driver");
 MODULE_LICENSE("GPL");
+MODULE_ALIAS("platform:bd70528-wdt");
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/watchdog/imx_sc_wdt.c linux-libre-5.3.15-gnu/drivers/watchdog/imx_sc_wdt.c
--- linux-libre-5.3.14-gnu/drivers/watchdog/imx_sc_wdt.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/watchdog/imx_sc_wdt.c	2019-12-04 16:34:32.000000000 -0500
@@ -99,8 +99,14 @@ static int imx_sc_wdt_set_pretimeout(str
 {
 	struct arm_smccc_res res;
 
+	/*
+	 * SCU firmware calculates pretimeout based on current time
+	 * stamp instead of watchdog timeout stamp, need to convert
+	 * the pretimeout to SCU firmware's timeout value.
+	 */
 	arm_smccc_smc(IMX_SIP_TIMER, IMX_SIP_TIMER_SET_PRETIME_WDOG,
-		      pretimeout * 1000, 0, 0, 0, 0, 0, &res);
+		      (wdog->timeout - pretimeout) * 1000, 0, 0, 0,
+		      0, 0, &res);
 	if (res.a0)
 		return -EACCES;
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/drivers/watchdog/meson_gxbb_wdt.c linux-libre-5.3.15-gnu/drivers/watchdog/meson_gxbb_wdt.c
--- linux-libre-5.3.14-gnu/drivers/watchdog/meson_gxbb_wdt.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/watchdog/meson_gxbb_wdt.c	2019-12-04 16:34:32.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-5.3.14-gnu/drivers/watchdog/pm8916_wdt.c linux-libre-5.3.15-gnu/drivers/watchdog/pm8916_wdt.c
--- linux-libre-5.3.14-gnu/drivers/watchdog/pm8916_wdt.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/drivers/watchdog/pm8916_wdt.c	2019-12-04 16:34:32.000000000 -0500
@@ -163,9 +163,17 @@ static int pm8916_wdt_probe(struct platf
 
 	irq = platform_get_irq(pdev, 0);
 	if (irq > 0) {
-		if (devm_request_irq(dev, irq, pm8916_wdt_isr, 0, "pm8916_wdt",
-				     wdt))
-			irq = 0;
+		err = devm_request_irq(dev, irq, pm8916_wdt_isr, 0,
+				       "pm8916_wdt", wdt);
+		if (err)
+			return err;
+
+		wdt->wdev.info = &pm8916_wdt_pt_ident;
+	} else {
+		if (irq == -EPROBE_DEFER)
+			return -EPROBE_DEFER;
+
+		wdt->wdev.info = &pm8916_wdt_ident;
 	}
 
 	/* Configure watchdog to hard-reset mode */
@@ -177,7 +185,6 @@ static int pm8916_wdt_probe(struct platf
 		return err;
 	}
 
-	wdt->wdev.info = (irq > 0) ? &pm8916_wdt_pt_ident : &pm8916_wdt_ident,
 	wdt->wdev.ops = &pm8916_wdt_ops,
 	wdt->wdev.parent = dev;
 	wdt->wdev.min_timeout = PM8916_WDT_MIN_TIMEOUT;
diff -druNp --no-dereference linux-libre-5.3.14-gnu/fs/ceph/super.c linux-libre-5.3.15-gnu/fs/ceph/super.c
--- linux-libre-5.3.14-gnu/fs/ceph/super.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/fs/ceph/super.c	2019-12-04 16:34:32.000000000 -0500
@@ -255,6 +255,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,
@@ -263,7 +264,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;
@@ -340,10 +344,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-5.3.14-gnu/fs/ext4/inode.c linux-libre-5.3.15-gnu/fs/ext4/inode.c
--- linux-libre-5.3.14-gnu/fs/ext4/inode.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/fs/ext4/inode.c	2019-12-04 16:34:32.000000000 -0500
@@ -5942,8 +5942,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-5.3.14-gnu/fs/ext4/super.c linux-libre-5.3.15-gnu/fs/ext4/super.c
--- linux-libre-5.3.14-gnu/fs/ext4/super.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/fs/ext4/super.c	2019-12-04 16:34:32.000000000 -0500
@@ -3544,12 +3544,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))
@@ -3562,10 +3565,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-5.3.14-gnu/fs/io_uring.c linux-libre-5.3.15-gnu/fs/io_uring.c
--- linux-libre-5.3.14-gnu/fs/io_uring.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/fs/io_uring.c	2019-12-04 16:34:32.000000000 -0500
@@ -260,6 +260,8 @@ struct io_ring_ctx {
 
 	struct user_struct	*user;
 
+	struct cred		*creds;
+
 	struct completion	ctx_done;
 
 	struct {
@@ -1633,8 +1635,11 @@ static void io_poll_complete_work(struct
 	struct io_poll_iocb *poll = &req->poll;
 	struct poll_table_struct pt = { ._key = poll->events };
 	struct io_ring_ctx *ctx = req->ctx;
+	const struct cred *old_cred;
 	__poll_t mask = 0;
 
+	old_cred = override_creds(ctx->creds);
+
 	if (!READ_ONCE(poll->canceled))
 		mask = vfs_poll(poll->file, &pt) & poll->events;
 
@@ -1649,7 +1654,7 @@ static void io_poll_complete_work(struct
 	if (!mask && !READ_ONCE(poll->canceled)) {
 		add_wait_queue(poll->head, &poll->wait);
 		spin_unlock_irq(&ctx->completion_lock);
-		return;
+		goto out;
 	}
 	list_del_init(&req->list);
 	io_poll_complete(ctx, req, mask);
@@ -1657,6 +1662,8 @@ static void io_poll_complete_work(struct
 
 	io_cqring_ev_posted(ctx);
 	io_put_req(req);
+out:
+	revert_creds(old_cred);
 }
 
 static int io_poll_wake(struct wait_queue_entry *wait, unsigned mode, int sync,
@@ -1906,10 +1913,12 @@ static void io_sq_wq_submit_work(struct
 	struct io_ring_ctx *ctx = req->ctx;
 	struct mm_struct *cur_mm = NULL;
 	struct async_list *async_list;
+	const struct cred *old_cred;
 	LIST_HEAD(req_list);
 	mm_segment_t old_fs;
 	int ret;
 
+	old_cred = override_creds(ctx->creds);
 	async_list = io_async_list_from_sqe(ctx, req->submit.sqe);
 restart:
 	do {
@@ -2017,6 +2026,7 @@ out:
 		unuse_mm(cur_mm);
 		mmput(cur_mm);
 	}
+	revert_creds(old_cred);
 }
 
 /*
@@ -2354,6 +2364,7 @@ static int io_sq_thread(void *data)
 {
 	struct io_ring_ctx *ctx = data;
 	struct mm_struct *cur_mm = NULL;
+	const struct cred *old_cred;
 	mm_segment_t old_fs;
 	DEFINE_WAIT(wait);
 	unsigned inflight;
@@ -2363,6 +2374,7 @@ static int io_sq_thread(void *data)
 
 	old_fs = get_fs();
 	set_fs(USER_DS);
+	old_cred = override_creds(ctx->creds);
 
 	timeout = inflight = 0;
 	while (!kthread_should_park()) {
@@ -2473,6 +2485,7 @@ static int io_sq_thread(void *data)
 		unuse_mm(cur_mm);
 		mmput(cur_mm);
 	}
+	revert_creds(old_cred);
 
 	kthread_parkme();
 
@@ -3142,6 +3155,8 @@ static void io_ring_ctx_free(struct io_r
 		io_unaccount_mem(ctx->user,
 				ring_pages(ctx->sq_entries, ctx->cq_entries));
 	free_uid(ctx->user);
+	if (ctx->creds)
+		put_cred(ctx->creds);
 	kfree(ctx);
 }
 
@@ -3419,6 +3434,12 @@ static int io_uring_create(unsigned entr
 	ctx->account_mem = account_mem;
 	ctx->user = user;
 
+	ctx->creds = prepare_creds();
+	if (!ctx->creds) {
+		ret = -ENOMEM;
+		goto err;
+	}
+
 	ret = io_allocate_scq_urings(ctx, p);
 	if (ret)
 		goto err;
diff -druNp --no-dereference linux-libre-5.3.14-gnu/include/linux/bpf.h linux-libre-5.3.15-gnu/include/linux/bpf.h
--- linux-libre-5.3.14-gnu/include/linux/bpf.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/include/linux/bpf.h	2019-12-04 16:34:32.000000000 -0500
@@ -651,11 +651,11 @@ void bpf_map_put_with_uref(struct bpf_ma
 void bpf_map_put(struct bpf_map *map);
 int bpf_map_charge_memlock(struct bpf_map *map, u32 pages);
 void bpf_map_uncharge_memlock(struct bpf_map *map, u32 pages);
-int bpf_map_charge_init(struct bpf_map_memory *mem, size_t size);
+int bpf_map_charge_init(struct bpf_map_memory *mem, u64 size);
 void bpf_map_charge_finish(struct bpf_map_memory *mem);
 void bpf_map_charge_move(struct bpf_map_memory *dst,
 			 struct bpf_map_memory *src);
-void *bpf_map_area_alloc(size_t size, int numa_node);
+void *bpf_map_area_alloc(u64 size, int numa_node);
 void bpf_map_area_free(void *base);
 void bpf_map_init_from_attr(struct bpf_map *map, union bpf_attr *attr);
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/include/linux/idr.h linux-libre-5.3.15-gnu/include/linux/idr.h
--- linux-libre-5.3.14-gnu/include/linux/idr.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/include/linux/idr.h	2019-12-04 16:34:32.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-5.3.14-gnu/include/linux/reset-controller.h linux-libre-5.3.15-gnu/include/linux/reset-controller.h
--- linux-libre-5.3.14-gnu/include/linux/reset-controller.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/include/linux/reset-controller.h	2019-12-04 16:34:32.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-5.3.14-gnu/include/linux/skmsg.h linux-libre-5.3.15-gnu/include/linux/skmsg.h
--- linux-libre-5.3.14-gnu/include/linux/skmsg.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/include/linux/skmsg.h	2019-12-04 16:34:32.000000000 -0500
@@ -14,6 +14,7 @@
 #include <net/strparser.h>
 
 #define MAX_MSG_FRAGS			MAX_SKB_FRAGS
+#define NR_MSG_FRAG_IDS			(MAX_MSG_FRAGS + 1)
 
 enum __sk_action {
 	__SK_DROP = 0,
@@ -29,11 +30,13 @@ struct sk_msg_sg {
 	u32				size;
 	u32				copybreak;
 	bool				copy[MAX_MSG_FRAGS];
-	/* The extra element is used for chaining the front and sections when
-	 * the list becomes partitioned (e.g. end < start). The crypto APIs
-	 * require the chaining.
+	/* The extra two elements:
+	 * 1) used for chaining the front and sections when the list becomes
+	 *    partitioned (e.g. end < start). The crypto APIs require the
+	 *    chaining;
+	 * 2) to chain tailer SG entries after the message.
 	 */
-	struct scatterlist		data[MAX_MSG_FRAGS + 1];
+	struct scatterlist		data[MAX_MSG_FRAGS + 2];
 };
 
 /* UAPI in filter.c depends on struct sk_msg_sg being first element. */
@@ -141,13 +144,13 @@ static inline void sk_msg_apply_bytes(st
 
 static inline u32 sk_msg_iter_dist(u32 start, u32 end)
 {
-	return end >= start ? end - start : end + (MAX_MSG_FRAGS - start);
+	return end >= start ? end - start : end + (NR_MSG_FRAG_IDS - start);
 }
 
 #define sk_msg_iter_var_prev(var)			\
 	do {						\
 		if (var == 0)				\
-			var = MAX_MSG_FRAGS - 1;	\
+			var = NR_MSG_FRAG_IDS - 1;	\
 		else					\
 			var--;				\
 	} while (0)
@@ -155,7 +158,7 @@ static inline u32 sk_msg_iter_dist(u32 s
 #define sk_msg_iter_var_next(var)			\
 	do {						\
 		var++;					\
-		if (var == MAX_MSG_FRAGS)		\
+		if (var == NR_MSG_FRAG_IDS)		\
 			var = 0;			\
 	} while (0)
 
@@ -172,9 +175,9 @@ static inline void sk_msg_clear_meta(str
 
 static inline void sk_msg_init(struct sk_msg *msg)
 {
-	BUILD_BUG_ON(ARRAY_SIZE(msg->sg.data) - 1 != MAX_MSG_FRAGS);
+	BUILD_BUG_ON(ARRAY_SIZE(msg->sg.data) - 1 != NR_MSG_FRAG_IDS);
 	memset(msg, 0, sizeof(*msg));
-	sg_init_marker(msg->sg.data, MAX_MSG_FRAGS);
+	sg_init_marker(msg->sg.data, NR_MSG_FRAG_IDS);
 }
 
 static inline void sk_msg_xfer(struct sk_msg *dst, struct sk_msg *src,
@@ -195,14 +198,11 @@ static inline void sk_msg_xfer_full(stru
 
 static inline bool sk_msg_full(const struct sk_msg *msg)
 {
-	return (msg->sg.end == msg->sg.start) && msg->sg.size;
+	return sk_msg_iter_dist(msg->sg.start, msg->sg.end) == MAX_MSG_FRAGS;
 }
 
 static inline u32 sk_msg_elem_used(const struct sk_msg *msg)
 {
-	if (sk_msg_full(msg))
-		return MAX_MSG_FRAGS;
-
 	return sk_msg_iter_dist(msg->sg.start, msg->sg.end);
 }
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/include/net/fq_impl.h linux-libre-5.3.15-gnu/include/net/fq_impl.h
--- linux-libre-5.3.14-gnu/include/net/fq_impl.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/include/net/fq_impl.h	2019-12-04 16:34:32.000000000 -0500
@@ -313,7 +313,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;
 
@@ -331,7 +331,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-5.3.14-gnu/include/net/sctp/structs.h linux-libre-5.3.15-gnu/include/net/sctp/structs.h
--- linux-libre-5.3.14-gnu/include/net/sctp/structs.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/include/net/sctp/structs.h	2019-12-04 16:34:32.000000000 -0500
@@ -1239,6 +1239,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-5.3.14-gnu/include/net/tls.h linux-libre-5.3.15-gnu/include/net/tls.h
--- linux-libre-5.3.14-gnu/include/net/tls.h	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/include/net/tls.h	2019-12-04 16:34:32.000000000 -0500
@@ -121,7 +121,6 @@ struct tls_rec {
 	struct list_head list;
 	int tx_ready;
 	int tx_flags;
-	int inplace_crypto;
 
 	struct sk_msg msg_plaintext;
 	struct sk_msg msg_encrypted;
@@ -408,7 +407,7 @@ int tls_push_sg(struct sock *sk, struct
 		int flags);
 int tls_push_partial_record(struct sock *sk, struct tls_context *ctx,
 			    int flags);
-bool tls_free_partial_record(struct sock *sk, struct tls_context *ctx);
+void tls_free_partial_record(struct sock *sk, struct tls_context *ctx);
 
 static inline struct tls_msg *tls_msg(struct sk_buff *skb)
 {
diff -druNp --no-dereference linux-libre-5.3.14-gnu/kernel/bpf/cgroup.c linux-libre-5.3.15-gnu/kernel/bpf/cgroup.c
--- linux-libre-5.3.14-gnu/kernel/bpf/cgroup.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/kernel/bpf/cgroup.c	2019-12-04 16:34:32.000000000 -0500
@@ -1302,12 +1302,12 @@ static bool sysctl_is_valid_access(int o
 		return false;
 
 	switch (off) {
-	case offsetof(struct bpf_sysctl, write):
+	case bpf_ctx_range(struct bpf_sysctl, write):
 		if (type != BPF_READ)
 			return false;
 		bpf_ctx_record_field_size(info, size_default);
 		return bpf_ctx_narrow_access_ok(off, size, size_default);
-	case offsetof(struct bpf_sysctl, file_pos):
+	case bpf_ctx_range(struct bpf_sysctl, file_pos):
 		if (type == BPF_READ) {
 			bpf_ctx_record_field_size(info, size_default);
 			return bpf_ctx_narrow_access_ok(off, size, size_default);
diff -druNp --no-dereference linux-libre-5.3.14-gnu/kernel/bpf/syscall.c linux-libre-5.3.15-gnu/kernel/bpf/syscall.c
--- linux-libre-5.3.14-gnu/kernel/bpf/syscall.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/kernel/bpf/syscall.c	2019-12-04 16:34:32.000000000 -0500
@@ -126,7 +126,7 @@ static struct bpf_map *find_and_alloc_ma
 	return map;
 }
 
-void *bpf_map_area_alloc(size_t size, int numa_node)
+void *bpf_map_area_alloc(u64 size, int numa_node)
 {
 	/* We really just want to fail instead of triggering OOM killer
 	 * under memory pressure, therefore we set __GFP_NORETRY to kmalloc,
@@ -141,6 +141,9 @@ void *bpf_map_area_alloc(size_t size, in
 	const gfp_t flags = __GFP_NOWARN | __GFP_ZERO;
 	void *area;
 
+	if (size >= SIZE_MAX)
+		return NULL;
+
 	if (size <= (PAGE_SIZE << PAGE_ALLOC_COSTLY_ORDER)) {
 		area = kmalloc_node(size, GFP_USER | __GFP_NORETRY | flags,
 				    numa_node);
@@ -197,7 +200,7 @@ static void bpf_uncharge_memlock(struct
 		atomic_long_sub(pages, &user->locked_vm);
 }
 
-int bpf_map_charge_init(struct bpf_map_memory *mem, size_t size)
+int bpf_map_charge_init(struct bpf_map_memory *mem, u64 size)
 {
 	u32 pages = round_up(size, PAGE_SIZE) >> PAGE_SHIFT;
 	struct user_struct *user;
diff -druNp --no-dereference linux-libre-5.3.14-gnu/kernel/stacktrace.c linux-libre-5.3.15-gnu/kernel/stacktrace.c
--- linux-libre-5.3.14-gnu/kernel/stacktrace.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/kernel/stacktrace.c	2019-12-04 16:34:32.000000000 -0500
@@ -141,7 +141,8 @@ unsigned int stack_trace_save_tsk(struct
 	struct stacktrace_cookie c = {
 		.store	= store,
 		.size	= size,
-		.skip	= skipnr + 1,
+		/* skip this function if they are tracing us */
+		.skip	= skipnr + !!(current == tsk),
 	};
 
 	if (!try_get_task_stack(tsk))
@@ -298,7 +299,8 @@ unsigned int stack_trace_save_tsk(struct
 	struct stack_trace trace = {
 		.entries	= store,
 		.max_entries	= size,
-		.skip		= skipnr + 1,
+		/* skip this function if they are tracing us */
+		.skip	= skipnr + !!(current == task),
 	};
 
 	save_stack_trace_tsk(task, &trace);
diff -druNp --no-dereference linux-libre-5.3.14-gnu/lib/idr.c linux-libre-5.3.15-gnu/lib/idr.c
--- linux-libre-5.3.14-gnu/lib/idr.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/lib/idr.c	2019-12-04 16:34:32.000000000 -0500
@@ -215,7 +215,7 @@ int idr_for_each(const struct idr *idr,
 EXPORT_SYMBOL(idr_for_each);
 
 /**
- * idr_get_next() - Find next populated entry.
+ * idr_get_next_ul() - Find next populated entry.
  * @idr: IDR handle.
  * @nextid: Pointer to an ID.
  *
@@ -224,7 +224,7 @@ EXPORT_SYMBOL(idr_for_each);
  * to the ID of the found value.  To use in a loop, the value pointed to by
  * nextid must be incremented by the user.
  */
-void *idr_get_next(struct idr *idr, int *nextid)
+void *idr_get_next_ul(struct idr *idr, unsigned long *nextid)
 {
 	struct radix_tree_iter iter;
 	void __rcu **slot;
@@ -245,18 +245,14 @@ void *idr_get_next(struct idr *idr, int
 	}
 	if (!slot)
 		return NULL;
-	id = iter.index + base;
-
-	if (WARN_ON_ONCE(id > INT_MAX))
-		return NULL;
 
-	*nextid = id;
+	*nextid = iter.index + base;
 	return entry;
 }
-EXPORT_SYMBOL(idr_get_next);
+EXPORT_SYMBOL(idr_get_next_ul);
 
 /**
- * idr_get_next_ul() - Find next populated entry.
+ * idr_get_next() - Find next populated entry.
  * @idr: IDR handle.
  * @nextid: Pointer to an ID.
  *
@@ -265,22 +261,17 @@ EXPORT_SYMBOL(idr_get_next);
  * to the ID of the found value.  To use in a loop, the value pointed to by
  * nextid must be incremented by the user.
  */
-void *idr_get_next_ul(struct idr *idr, unsigned long *nextid)
+void *idr_get_next(struct idr *idr, int *nextid)
 {
-	struct radix_tree_iter iter;
-	void __rcu **slot;
-	unsigned long base = idr->idr_base;
 	unsigned long id = *nextid;
+	void *entry = idr_get_next_ul(idr, &id);
 
-	id = (id < base) ? 0 : id - base;
-	slot = radix_tree_iter_find(&idr->idr_rt, &iter, id);
-	if (!slot)
+	if (WARN_ON_ONCE(id > INT_MAX))
 		return NULL;
-
-	*nextid = iter.index + base;
-	return rcu_dereference_raw(*slot);
+	*nextid = id;
+	return entry;
 }
-EXPORT_SYMBOL(idr_get_next_ul);
+EXPORT_SYMBOL(idr_get_next);
 
 /**
  * idr_replace() - replace pointer for given ID.
diff -druNp --no-dereference linux-libre-5.3.14-gnu/lib/radix-tree.c linux-libre-5.3.15-gnu/lib/radix-tree.c
--- linux-libre-5.3.14-gnu/lib/radix-tree.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/lib/radix-tree.c	2019-12-04 16:34:32.000000000 -0500
@@ -1529,7 +1529,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-5.3.14-gnu/lib/test_xarray.c linux-libre-5.3.15-gnu/lib/test_xarray.c
--- linux-libre-5.3.14-gnu/lib/test_xarray.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/lib/test_xarray.c	2019-12-04 16:34:32.000000000 -0500
@@ -1110,6 +1110,28 @@ static noinline void check_find_entry(st
 	XA_BUG_ON(xa, !xa_empty(xa));
 }
 
+static noinline void check_move_tiny(struct xarray *xa)
+{
+	XA_STATE(xas, xa, 0);
+
+	XA_BUG_ON(xa, !xa_empty(xa));
+	rcu_read_lock();
+	XA_BUG_ON(xa, xas_next(&xas) != NULL);
+	XA_BUG_ON(xa, xas_next(&xas) != NULL);
+	rcu_read_unlock();
+	xa_store_index(xa, 0, GFP_KERNEL);
+	rcu_read_lock();
+	xas_set(&xas, 0);
+	XA_BUG_ON(xa, xas_next(&xas) != xa_mk_index(0));
+	XA_BUG_ON(xa, xas_next(&xas) != NULL);
+	xas_set(&xas, 0);
+	XA_BUG_ON(xa, xas_prev(&xas) != xa_mk_index(0));
+	XA_BUG_ON(xa, xas_prev(&xas) != NULL);
+	rcu_read_unlock();
+	xa_erase_index(xa, 0);
+	XA_BUG_ON(xa, !xa_empty(xa));
+}
+
 static noinline void check_move_small(struct xarray *xa, unsigned long idx)
 {
 	XA_STATE(xas, xa, 0);
@@ -1217,6 +1239,8 @@ static noinline void check_move(struct x
 
 	xa_destroy(xa);
 
+	check_move_tiny(xa);
+
 	for (i = 0; i < 16; i++)
 		check_move_small(xa, 1UL << i);
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/lib/xarray.c linux-libre-5.3.15-gnu/lib/xarray.c
--- linux-libre-5.3.14-gnu/lib/xarray.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/lib/xarray.c	2019-12-04 16:34:32.000000000 -0500
@@ -994,6 +994,8 @@ void *__xas_prev(struct xa_state *xas)
 
 	if (!xas_frozen(xas->xa_node))
 		xas->xa_index--;
+	if (!xas->xa_node)
+		return set_bounds(xas);
 	if (xas_not_node(xas->xa_node))
 		return xas_load(xas);
 
@@ -1031,6 +1033,8 @@ void *__xas_next(struct xa_state *xas)
 
 	if (!xas_frozen(xas->xa_node))
 		xas->xa_index++;
+	if (!xas->xa_node)
+		return set_bounds(xas);
 	if (xas_not_node(xas->xa_node))
 		return xas_load(xas);
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/Makefile linux-libre-5.3.15-gnu/Makefile
--- linux-libre-5.3.14-gnu/Makefile	2019-11-29 07:31:27.000000000 -0500
+++ linux-libre-5.3.15-gnu/Makefile	2019-12-05 05:07:42.000000000 -0500
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 5
 PATCHLEVEL = 3
-SUBLEVEL = 14
+SUBLEVEL = 15
 EXTRAVERSION = -gnu
 NAME = Bobtail Squid
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/bridge/netfilter/ebt_dnat.c linux-libre-5.3.15-gnu/net/bridge/netfilter/ebt_dnat.c
--- linux-libre-5.3.14-gnu/net/bridge/netfilter/ebt_dnat.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/bridge/netfilter/ebt_dnat.c	2019-12-04 16:34:32.000000000 -0500
@@ -20,7 +20,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_ensure_writable(skb, ETH_ALEN))
 		return EBT_DROP;
@@ -33,10 +32,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-5.3.14-gnu/net/core/filter.c linux-libre-5.3.15-gnu/net/core/filter.c
--- linux-libre-5.3.14-gnu/net/core/filter.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/core/filter.c	2019-12-04 16:34:32.000000000 -0500
@@ -2299,7 +2299,7 @@ BPF_CALL_4(bpf_msg_pull_data, struct sk_
 	WARN_ON_ONCE(last_sge == first_sge);
 	shift = last_sge > first_sge ?
 		last_sge - first_sge - 1 :
-		MAX_SKB_FRAGS - first_sge + last_sge - 1;
+		NR_MSG_FRAG_IDS - first_sge + last_sge - 1;
 	if (!shift)
 		goto out;
 
@@ -2308,8 +2308,8 @@ BPF_CALL_4(bpf_msg_pull_data, struct sk_
 	do {
 		u32 move_from;
 
-		if (i + shift >= MAX_MSG_FRAGS)
-			move_from = i + shift - MAX_MSG_FRAGS;
+		if (i + shift >= NR_MSG_FRAG_IDS)
+			move_from = i + shift - NR_MSG_FRAG_IDS;
 		else
 			move_from = i + shift;
 		if (move_from == msg->sg.end)
@@ -2323,7 +2323,7 @@ BPF_CALL_4(bpf_msg_pull_data, struct sk_
 	} while (1);
 
 	msg->sg.end = msg->sg.end - shift > msg->sg.end ?
-		      msg->sg.end - shift + MAX_MSG_FRAGS :
+		      msg->sg.end - shift + NR_MSG_FRAG_IDS :
 		      msg->sg.end - shift;
 out:
 	msg->data = sg_virt(&msg->sg.data[first_sge]) + start - offset;
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/core/skmsg.c linux-libre-5.3.15-gnu/net/core/skmsg.c
--- linux-libre-5.3.14-gnu/net/core/skmsg.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/core/skmsg.c	2019-12-04 16:34:32.000000000 -0500
@@ -422,7 +422,7 @@ static int sk_psock_skb_ingress(struct s
 	copied = skb->len;
 	msg->sg.start = 0;
 	msg->sg.size = copied;
-	msg->sg.end = num_sge == MAX_MSG_FRAGS ? 0 : num_sge;
+	msg->sg.end = num_sge;
 	msg->skb = skb;
 
 	sk_psock_queue_msg(psock, msg);
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/ipv4/tcp_bpf.c linux-libre-5.3.15-gnu/net/ipv4/tcp_bpf.c
--- linux-libre-5.3.14-gnu/net/ipv4/tcp_bpf.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/ipv4/tcp_bpf.c	2019-12-04 16:34:32.000000000 -0500
@@ -301,7 +301,7 @@ EXPORT_SYMBOL_GPL(tcp_bpf_sendmsg_redir)
 static int tcp_bpf_send_verdict(struct sock *sk, struct sk_psock *psock,
 				struct sk_msg *msg, int *copied, int flags)
 {
-	bool cork = false, enospc = msg->sg.start == msg->sg.end;
+	bool cork = false, enospc = sk_msg_full(msg);
 	struct sock *sk_redir;
 	u32 tosend, delta = 0;
 	int ret;
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/mac80211/main.c linux-libre-5.3.15-gnu/net/mac80211/main.c
--- linux-libre-5.3.14-gnu/net/mac80211/main.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/mac80211/main.c	2019-12-04 16:34:32.000000000 -0500
@@ -1297,8 +1297,8 @@ int ieee80211_register_hw(struct ieee802
 	ieee80211_remove_interfaces(local);
  fail_rate:
 	rtnl_unlock();
-	ieee80211_led_exit(local);
  fail_flows:
+	ieee80211_led_exit(local);
 	destroy_workqueue(local->workqueue);
  fail_workqueue:
 	wiphy_unregister(local->hw.wiphy);
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/mac80211/sta_info.c linux-libre-5.3.15-gnu/net/mac80211/sta_info.c
--- linux-libre-5.3.14-gnu/net/mac80211/sta_info.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/mac80211/sta_info.c	2019-12-04 16:34:32.000000000 -0500
@@ -2455,7 +2455,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-5.3.14-gnu/net/netfilter/ipset/ip_set_core.c linux-libre-5.3.15-gnu/net/netfilter/ipset/ip_set_core.c
--- linux-libre-5.3.14-gnu/net/netfilter/ipset/ip_set_core.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/netfilter/ipset/ip_set_core.c	2019-12-04 16:34:32.000000000 -0500
@@ -296,7 +296,8 @@ ip_set_get_ipaddr4(struct nlattr *nla,
 
 	if (unlikely(!flag_nested(nla)))
 		return -IPSET_ERR_PROTOCOL;
-	if (nla_parse_nested_deprecated(tb, IPSET_ATTR_IPADDR_MAX, nla, ipaddr_policy, NULL))
+	if (nla_parse_nested(tb, IPSET_ATTR_IPADDR_MAX, nla,
+			     ipaddr_policy, NULL))
 		return -IPSET_ERR_PROTOCOL;
 	if (unlikely(!ip_set_attr_netorder(tb, IPSET_ATTR_IPADDR_IPV4)))
 		return -IPSET_ERR_PROTOCOL;
@@ -314,7 +315,8 @@ ip_set_get_ipaddr6(struct nlattr *nla, u
 	if (unlikely(!flag_nested(nla)))
 		return -IPSET_ERR_PROTOCOL;
 
-	if (nla_parse_nested_deprecated(tb, IPSET_ATTR_IPADDR_MAX, nla, ipaddr_policy, NULL))
+	if (nla_parse_nested(tb, IPSET_ATTR_IPADDR_MAX, nla,
+			     ipaddr_policy, NULL))
 		return -IPSET_ERR_PROTOCOL;
 	if (unlikely(!ip_set_attr_netorder(tb, IPSET_ATTR_IPADDR_IPV6)))
 		return -IPSET_ERR_PROTOCOL;
@@ -934,7 +936,8 @@ static int ip_set_create(struct net *net
 
 	/* Without holding any locks, create private part. */
 	if (attr[IPSET_ATTR_DATA] &&
-	    nla_parse_nested_deprecated(tb, IPSET_ATTR_CREATE_MAX, attr[IPSET_ATTR_DATA], set->type->create_policy, NULL)) {
+	    nla_parse_nested(tb, IPSET_ATTR_CREATE_MAX, attr[IPSET_ATTR_DATA],
+			     set->type->create_policy, NULL)) {
 		ret = -IPSET_ERR_PROTOCOL;
 		goto put_out;
 	}
@@ -1281,6 +1284,14 @@ dump_attrs(struct nlmsghdr *nlh)
 	}
 }
 
+static const struct nla_policy
+ip_set_dump_policy[IPSET_ATTR_CMD_MAX + 1] = {
+	[IPSET_ATTR_PROTOCOL]	= { .type = NLA_U8 },
+	[IPSET_ATTR_SETNAME]	= { .type = NLA_NUL_STRING,
+				    .len = IPSET_MAXNAMELEN - 1 },
+	[IPSET_ATTR_FLAGS]	= { .type = NLA_U32 },
+};
+
 static int
 dump_init(struct netlink_callback *cb, struct ip_set_net *inst)
 {
@@ -1292,9 +1303,9 @@ dump_init(struct netlink_callback *cb, s
 	ip_set_id_t index;
 	int ret;
 
-	ret = nla_parse_deprecated(cda, IPSET_ATTR_CMD_MAX, attr,
-				   nlh->nlmsg_len - min_len,
-				   ip_set_setname_policy, NULL);
+	ret = nla_parse(cda, IPSET_ATTR_CMD_MAX, attr,
+			nlh->nlmsg_len - min_len,
+			ip_set_dump_policy, NULL);
 	if (ret)
 		return ret;
 
@@ -1543,9 +1554,9 @@ call_ad(struct sock *ctnl, struct sk_buf
 		memcpy(&errmsg->msg, nlh, nlh->nlmsg_len);
 		cmdattr = (void *)&errmsg->msg + min_len;
 
-		ret = nla_parse_deprecated(cda, IPSET_ATTR_CMD_MAX, cmdattr,
-					   nlh->nlmsg_len - min_len,
-					   ip_set_adt_policy, NULL);
+		ret = nla_parse(cda, IPSET_ATTR_CMD_MAX, cmdattr,
+				nlh->nlmsg_len - min_len, ip_set_adt_policy,
+				NULL);
 
 		if (ret) {
 			nlmsg_free(skb2);
@@ -1596,7 +1607,9 @@ static int ip_set_ad(struct net *net, st
 
 	use_lineno = !!attr[IPSET_ATTR_LINENO];
 	if (attr[IPSET_ATTR_DATA]) {
-		if (nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, attr[IPSET_ATTR_DATA], set->type->adt_policy, NULL))
+		if (nla_parse_nested(tb, IPSET_ATTR_ADT_MAX,
+				     attr[IPSET_ATTR_DATA],
+				     set->type->adt_policy, NULL))
 			return -IPSET_ERR_PROTOCOL;
 		ret = call_ad(ctnl, skb, set, tb, adt, flags,
 			      use_lineno);
@@ -1606,7 +1619,8 @@ static int ip_set_ad(struct net *net, st
 		nla_for_each_nested(nla, attr[IPSET_ATTR_ADT], nla_rem) {
 			if (nla_type(nla) != IPSET_ATTR_DATA ||
 			    !flag_nested(nla) ||
-			    nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, nla, set->type->adt_policy, NULL))
+			    nla_parse_nested(tb, IPSET_ATTR_ADT_MAX, nla,
+					     set->type->adt_policy, NULL))
 				return -IPSET_ERR_PROTOCOL;
 			ret = call_ad(ctnl, skb, set, tb, adt,
 				      flags, use_lineno);
@@ -1655,7 +1669,8 @@ static int ip_set_utest(struct net *net,
 	if (!set)
 		return -ENOENT;
 
-	if (nla_parse_nested_deprecated(tb, IPSET_ATTR_ADT_MAX, attr[IPSET_ATTR_DATA], set->type->adt_policy, NULL))
+	if (nla_parse_nested(tb, IPSET_ATTR_ADT_MAX, attr[IPSET_ATTR_DATA],
+			     set->type->adt_policy, NULL))
 		return -IPSET_ERR_PROTOCOL;
 
 	rcu_read_lock_bh();
@@ -1961,7 +1976,7 @@ static const struct nfnl_callback ip_set
 	[IPSET_CMD_LIST]	= {
 		.call		= ip_set_dump,
 		.attr_count	= IPSET_ATTR_CMD_MAX,
-		.policy		= ip_set_setname_policy,
+		.policy		= ip_set_dump_policy,
 	},
 	[IPSET_CMD_SAVE]	= {
 		.call		= ip_set_dump,
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/netfilter/ipset/ip_set_hash_net.c linux-libre-5.3.15-gnu/net/netfilter/ipset/ip_set_hash_net.c
--- linux-libre-5.3.14-gnu/net/netfilter/ipset/ip_set_hash_net.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/netfilter/ipset/ip_set_hash_net.c	2019-12-04 16:34:32.000000000 -0500
@@ -368,6 +368,7 @@ static struct ip_set_type hash_net_type
 		[IPSET_ATTR_IP_TO]	= { .type = NLA_NESTED },
 		[IPSET_ATTR_CIDR]	= { .type = NLA_U8 },
 		[IPSET_ATTR_TIMEOUT]	= { .type = NLA_U32 },
+		[IPSET_ATTR_LINENO]	= { .type = NLA_U32 },
 		[IPSET_ATTR_CADT_FLAGS]	= { .type = NLA_U32 },
 		[IPSET_ATTR_BYTES]	= { .type = NLA_U64 },
 		[IPSET_ATTR_PACKETS]	= { .type = NLA_U64 },
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/netfilter/ipset/ip_set_hash_netnet.c linux-libre-5.3.15-gnu/net/netfilter/ipset/ip_set_hash_netnet.c
--- linux-libre-5.3.14-gnu/net/netfilter/ipset/ip_set_hash_netnet.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/netfilter/ipset/ip_set_hash_netnet.c	2019-12-04 16:34:32.000000000 -0500
@@ -476,6 +476,7 @@ static struct ip_set_type hash_netnet_ty
 		[IPSET_ATTR_CIDR]	= { .type = NLA_U8 },
 		[IPSET_ATTR_CIDR2]	= { .type = NLA_U8 },
 		[IPSET_ATTR_TIMEOUT]	= { .type = NLA_U32 },
+		[IPSET_ATTR_LINENO]	= { .type = NLA_U32 },
 		[IPSET_ATTR_CADT_FLAGS]	= { .type = NLA_U32 },
 		[IPSET_ATTR_BYTES]	= { .type = NLA_U64 },
 		[IPSET_ATTR_PACKETS]	= { .type = NLA_U64 },
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/netfilter/nf_tables_api.c linux-libre-5.3.15-gnu/net/netfilter/nf_tables_api.c
--- linux-libre-5.3.14-gnu/net/netfilter/nf_tables_api.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/netfilter/nf_tables_api.c	2019-12-04 16:34:32.000000000 -0500
@@ -1922,6 +1922,7 @@ static int nf_tables_newchain(struct net
 		if (nlh->nlmsg_flags & NLM_F_REPLACE)
 			return -EOPNOTSUPP;
 
+		flags |= chain->flags & NFT_BASE_CHAIN;
 		return nf_tables_updchain(&ctx, genmask, policy, flags);
 	}
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/netfilter/nf_tables_offload.c linux-libre-5.3.15-gnu/net/netfilter/nf_tables_offload.c
--- linux-libre-5.3.14-gnu/net/netfilter/nf_tables_offload.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/netfilter/nf_tables_offload.c	2019-12-04 16:34:32.000000000 -0500
@@ -241,7 +241,8 @@ int nft_flow_rule_offload_commit(struct
 
 		switch (trans->msg_type) {
 		case NFT_MSG_NEWCHAIN:
-			if (!(trans->ctx.chain->flags & NFT_CHAIN_HW_OFFLOAD))
+			if (!(trans->ctx.chain->flags & NFT_CHAIN_HW_OFFLOAD) ||
+			    nft_trans_chain_update(trans))
 				continue;
 
 			err = nft_flow_offload_chain(trans, FLOW_BLOCK_BIND);
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/openvswitch/datapath.c linux-libre-5.3.15-gnu/net/openvswitch/datapath.c
--- linux-libre-5.3.14-gnu/net/openvswitch/datapath.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/openvswitch/datapath.c	2019-12-04 16:34:32.000000000 -0500
@@ -701,9 +701,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))
@@ -879,7 +883,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;
 }
 
@@ -1343,7 +1350,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 {
@@ -1351,6 +1361,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-5.3.14-gnu/net/psample/psample.c linux-libre-5.3.15-gnu/net/psample/psample.c
--- linux-libre-5.3.14-gnu/net/psample/psample.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/psample/psample.c	2019-12-04 16:34:32.000000000 -0500
@@ -221,7 +221,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-5.3.14-gnu/net/sched/sch_mq.c linux-libre-5.3.15-gnu/net/sched/sch_mq.c
--- linux-libre-5.3.14-gnu/net/sched/sch_mq.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/sched/sch_mq.c	2019-12-04 16:34:32.000000000 -0500
@@ -245,7 +245,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 ||
 	    qdisc_qstats_copy(d, sch) < 0)
 		return -1;
 	return 0;
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/sched/sch_mqprio.c linux-libre-5.3.15-gnu/net/sched/sch_mqprio.c
--- linux-libre-5.3.14-gnu/net/sched/sch_mqprio.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/sched/sch_mqprio.c	2019-12-04 16:34:32.000000000 -0500
@@ -557,8 +557,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 ||
 		    qdisc_qstats_copy(d, sch) < 0)
 			return -1;
 	}
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/sched/sch_multiq.c linux-libre-5.3.15-gnu/net/sched/sch_multiq.c
--- linux-libre-5.3.14-gnu/net/sched/sch_multiq.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/sched/sch_multiq.c	2019-12-04 16:34:32.000000000 -0500
@@ -330,7 +330,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 ||
 	    qdisc_qstats_copy(d, cl_q) < 0)
 		return -1;
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/sched/sch_prio.c linux-libre-5.3.15-gnu/net/sched/sch_prio.c
--- linux-libre-5.3.14-gnu/net/sched/sch_prio.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/sched/sch_prio.c	2019-12-04 16:34:32.000000000 -0500
@@ -356,7 +356,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 ||
 	    qdisc_qstats_copy(d, cl_q) < 0)
 		return -1;
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/sctp/associola.c linux-libre-5.3.15-gnu/net/sctp/associola.c
--- linux-libre-5.3.14-gnu/net/sctp/associola.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/sctp/associola.c	2019-12-04 16:34:32.000000000 -0500
@@ -65,6 +65,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-5.3.14-gnu/net/sctp/endpointola.c linux-libre-5.3.15-gnu/net/sctp/endpointola.c
--- linux-libre-5.3.14-gnu/net/sctp/endpointola.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/sctp/endpointola.c	2019-12-04 16:34:32.000000000 -0500
@@ -152,6 +152,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-5.3.14-gnu/net/sctp/input.c linux-libre-5.3.15-gnu/net/sctp/input.c
--- linux-libre-5.3.14-gnu/net/sctp/input.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/sctp/input.c	2019-12-04 16:34:32.000000000 -0500
@@ -876,7 +876,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;
@@ -891,7 +891,7 @@ static inline __u32 sctp_hash_obj(const
 {
 	const struct sctp_transport *t = data;
 
-	return sctp_hashfn(sock_net(t->asoc->base.sk),
+	return sctp_hashfn(t->asoc->base.net,
 			   htons(t->asoc->base.bind_addr.port),
 			   &t->ipaddr, seed);
 }
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/sctp/sm_statefuns.c linux-libre-5.3.15-gnu/net/sctp/sm_statefuns.c
--- linux-libre-5.3.14-gnu/net/sctp/sm_statefuns.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/sctp/sm_statefuns.c	2019-12-04 16:34:32.000000000 -0500
@@ -2160,8 +2160,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-5.3.14-gnu/net/socket.c linux-libre-5.3.15-gnu/net/socket.c
--- linux-libre-5.3.14-gnu/net/socket.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/socket.c	2019-12-04 16:34:32.000000000 -0500
@@ -2232,15 +2232,10 @@ static int copy_msghdr_from_user(struct
 	return err < 0 ? err : 0;
 }
 
-static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg,
-			 struct msghdr *msg_sys, unsigned int flags,
-			 struct used_address *used_address,
-			 unsigned int allowed_msghdr_flags)
+static int ____sys_sendmsg(struct socket *sock, struct msghdr *msg_sys,
+			   unsigned int flags, struct used_address *used_address,
+			   unsigned int allowed_msghdr_flags)
 {
-	struct compat_msghdr __user *msg_compat =
-	    (struct compat_msghdr __user *)msg;
-	struct sockaddr_storage address;
-	struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
 	unsigned char ctl[sizeof(struct cmsghdr) + 20]
 				__aligned(sizeof(__kernel_size_t));
 	/* 20 is size of ipv6_pktinfo */
@@ -2248,19 +2243,10 @@ static int ___sys_sendmsg(struct socket
 	int ctl_len;
 	ssize_t err;
 
-	msg_sys->msg_name = &address;
-
-	if (MSG_CMSG_COMPAT & flags)
-		err = get_compat_msghdr(msg_sys, msg_compat, NULL, &iov);
-	else
-		err = copy_msghdr_from_user(msg_sys, msg, NULL, &iov);
-	if (err < 0)
-		return err;
-
 	err = -ENOBUFS;
 
 	if (msg_sys->msg_controllen > INT_MAX)
-		goto out_freeiov;
+		goto out;
 	flags |= (msg_sys->msg_flags & allowed_msghdr_flags);
 	ctl_len = msg_sys->msg_controllen;
 	if ((MSG_CMSG_COMPAT & flags) && ctl_len) {
@@ -2268,7 +2254,7 @@ static int ___sys_sendmsg(struct socket
 		    cmsghdr_from_user_compat_to_kern(msg_sys, sock->sk, ctl,
 						     sizeof(ctl));
 		if (err)
-			goto out_freeiov;
+			goto out;
 		ctl_buf = msg_sys->msg_control;
 		ctl_len = msg_sys->msg_controllen;
 	} else if (ctl_len) {
@@ -2277,7 +2263,7 @@ static int ___sys_sendmsg(struct socket
 		if (ctl_len > sizeof(ctl)) {
 			ctl_buf = sock_kmalloc(sock->sk, ctl_len, GFP_KERNEL);
 			if (ctl_buf == NULL)
-				goto out_freeiov;
+				goto out;
 		}
 		err = -EFAULT;
 		/*
@@ -2323,7 +2309,47 @@ static int ___sys_sendmsg(struct socket
 out_freectl:
 	if (ctl_buf != ctl)
 		sock_kfree_s(sock->sk, ctl_buf, ctl_len);
-out_freeiov:
+out:
+	return err;
+}
+
+static int sendmsg_copy_msghdr(struct msghdr *msg,
+			       struct user_msghdr __user *umsg, unsigned flags,
+			       struct iovec **iov)
+{
+	int err;
+
+	if (flags & MSG_CMSG_COMPAT) {
+		struct compat_msghdr __user *msg_compat;
+
+		msg_compat = (struct compat_msghdr __user *) umsg;
+		err = get_compat_msghdr(msg, msg_compat, NULL, iov);
+	} else {
+		err = copy_msghdr_from_user(msg, umsg, NULL, iov);
+	}
+	if (err < 0)
+		return err;
+
+	return 0;
+}
+
+static int ___sys_sendmsg(struct socket *sock, struct user_msghdr __user *msg,
+			 struct msghdr *msg_sys, unsigned int flags,
+			 struct used_address *used_address,
+			 unsigned int allowed_msghdr_flags)
+{
+	struct sockaddr_storage address;
+	struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
+	ssize_t err;
+
+	msg_sys->msg_name = &address;
+
+	err = sendmsg_copy_msghdr(msg_sys, msg, flags, &iov);
+	if (err < 0)
+		return err;
+
+	err = ____sys_sendmsg(sock, msg_sys, flags, used_address,
+				allowed_msghdr_flags);
 	kfree(iov);
 	return err;
 }
@@ -2331,12 +2357,27 @@ out_freeiov:
 /*
  *	BSD sendmsg interface
  */
-long __sys_sendmsg_sock(struct socket *sock, struct user_msghdr __user *msg,
+long __sys_sendmsg_sock(struct socket *sock, struct user_msghdr __user *umsg,
 			unsigned int flags)
 {
-	struct msghdr msg_sys;
+	struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
+	struct sockaddr_storage address;
+	struct msghdr msg = { .msg_name = &address };
+	ssize_t err;
 
-	return ___sys_sendmsg(sock, msg, &msg_sys, flags, NULL, 0);
+	err = sendmsg_copy_msghdr(&msg, umsg, flags, &iov);
+	if (err)
+		return err;
+	/* disallow ancillary data requests from this path */
+	if (msg.msg_control || msg.msg_controllen) {
+		err = -EINVAL;
+		goto out;
+	}
+
+	err = ____sys_sendmsg(sock, &msg, flags, NULL, 0);
+out:
+	kfree(iov);
+	return err;
 }
 
 long __sys_sendmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
@@ -2442,33 +2483,41 @@ SYSCALL_DEFINE4(sendmmsg, int, fd, struc
 	return __sys_sendmmsg(fd, mmsg, vlen, flags, true);
 }
 
-static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg,
-			 struct msghdr *msg_sys, unsigned int flags, int nosec)
+static int recvmsg_copy_msghdr(struct msghdr *msg,
+			       struct user_msghdr __user *umsg, unsigned flags,
+			       struct sockaddr __user **uaddr,
+			       struct iovec **iov)
 {
-	struct compat_msghdr __user *msg_compat =
-	    (struct compat_msghdr __user *)msg;
-	struct iovec iovstack[UIO_FASTIOV];
-	struct iovec *iov = iovstack;
-	unsigned long cmsg_ptr;
-	int len;
 	ssize_t err;
 
-	/* kernel mode address */
-	struct sockaddr_storage addr;
-
-	/* user mode address pointers */
-	struct sockaddr __user *uaddr;
-	int __user *uaddr_len = COMPAT_NAMELEN(msg);
-
-	msg_sys->msg_name = &addr;
+	if (MSG_CMSG_COMPAT & flags) {
+		struct compat_msghdr __user *msg_compat;
 
-	if (MSG_CMSG_COMPAT & flags)
-		err = get_compat_msghdr(msg_sys, msg_compat, &uaddr, &iov);
-	else
-		err = copy_msghdr_from_user(msg_sys, msg, &uaddr, &iov);
+		msg_compat = (struct compat_msghdr __user *) umsg;
+		err = get_compat_msghdr(msg, msg_compat, uaddr, iov);
+	} else {
+		err = copy_msghdr_from_user(msg, umsg, uaddr, iov);
+	}
 	if (err < 0)
 		return err;
 
+	return 0;
+}
+
+static int ____sys_recvmsg(struct socket *sock, struct msghdr *msg_sys,
+			   struct user_msghdr __user *msg,
+			   struct sockaddr __user *uaddr,
+			   unsigned int flags, int nosec)
+{
+	struct compat_msghdr __user *msg_compat =
+					(struct compat_msghdr __user *) msg;
+	int __user *uaddr_len = COMPAT_NAMELEN(msg);
+	struct sockaddr_storage addr;
+	unsigned long cmsg_ptr;
+	int len;
+	ssize_t err;
+
+	msg_sys->msg_name = &addr;
 	cmsg_ptr = (unsigned long)msg_sys->msg_control;
 	msg_sys->msg_flags = flags & (MSG_CMSG_CLOEXEC|MSG_CMSG_COMPAT);
 
@@ -2479,7 +2528,7 @@ static int ___sys_recvmsg(struct socket
 		flags |= MSG_DONTWAIT;
 	err = (nosec ? sock_recvmsg_nosec : sock_recvmsg)(sock, msg_sys, flags);
 	if (err < 0)
-		goto out_freeiov;
+		goto out;
 	len = err;
 
 	if (uaddr != NULL) {
@@ -2487,12 +2536,12 @@ static int ___sys_recvmsg(struct socket
 					msg_sys->msg_namelen, uaddr,
 					uaddr_len);
 		if (err < 0)
-			goto out_freeiov;
+			goto out;
 	}
 	err = __put_user((msg_sys->msg_flags & ~MSG_CMSG_COMPAT),
 			 COMPAT_FLAGS(msg));
 	if (err)
-		goto out_freeiov;
+		goto out;
 	if (MSG_CMSG_COMPAT & flags)
 		err = __put_user((unsigned long)msg_sys->msg_control - cmsg_ptr,
 				 &msg_compat->msg_controllen);
@@ -2500,10 +2549,25 @@ static int ___sys_recvmsg(struct socket
 		err = __put_user((unsigned long)msg_sys->msg_control - cmsg_ptr,
 				 &msg->msg_controllen);
 	if (err)
-		goto out_freeiov;
+		goto out;
 	err = len;
+out:
+	return err;
+}
 
-out_freeiov:
+static int ___sys_recvmsg(struct socket *sock, struct user_msghdr __user *msg,
+			 struct msghdr *msg_sys, unsigned int flags, int nosec)
+{
+	struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
+	/* user mode address pointers */
+	struct sockaddr __user *uaddr;
+	ssize_t err;
+
+	err = recvmsg_copy_msghdr(msg_sys, msg, flags, &uaddr, &iov);
+	if (err < 0)
+		return err;
+
+	err = ____sys_recvmsg(sock, msg_sys, msg, uaddr, flags, nosec);
 	kfree(iov);
 	return err;
 }
@@ -2512,12 +2576,28 @@ out_freeiov:
  *	BSD recvmsg interface
  */
 
-long __sys_recvmsg_sock(struct socket *sock, struct user_msghdr __user *msg,
+long __sys_recvmsg_sock(struct socket *sock, struct user_msghdr __user *umsg,
 			unsigned int flags)
 {
-	struct msghdr msg_sys;
+	struct iovec iovstack[UIO_FASTIOV], *iov = iovstack;
+	struct sockaddr_storage address;
+	struct msghdr msg = { .msg_name = &address };
+	struct sockaddr __user *uaddr;
+	ssize_t err;
 
-	return ___sys_recvmsg(sock, msg, &msg_sys, flags, 0);
+	err = recvmsg_copy_msghdr(&msg, umsg, flags, &uaddr, &iov);
+	if (err)
+		return err;
+	/* disallow ancillary data requests from this path */
+	if (msg.msg_control || msg.msg_controllen) {
+		err = -EINVAL;
+		goto out;
+	}
+
+	err = ____sys_recvmsg(sock, &msg, umsg, uaddr, flags, 0);
+out:
+	kfree(iov);
+	return err;
 }
 
 long __sys_recvmsg(int fd, struct user_msghdr __user *msg, unsigned int flags,
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/tipc/netlink_compat.c linux-libre-5.3.15-gnu/net/tipc/netlink_compat.c
--- linux-libre-5.3.14-gnu/net/tipc/netlink_compat.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/tipc/netlink_compat.c	2019-12-04 16:34:32.000000000 -0500
@@ -550,7 +550,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;
 
@@ -822,7 +822,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;
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/tls/tls_main.c linux-libre-5.3.15-gnu/net/tls/tls_main.c
--- linux-libre-5.3.14-gnu/net/tls/tls_main.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/tls/tls_main.c	2019-12-04 16:34:32.000000000 -0500
@@ -208,24 +208,15 @@ int tls_push_partial_record(struct sock
 	return tls_push_sg(sk, ctx, sg, offset, flags);
 }
 
-bool tls_free_partial_record(struct sock *sk, struct tls_context *ctx)
+void tls_free_partial_record(struct sock *sk, struct tls_context *ctx)
 {
 	struct scatterlist *sg;
 
-	sg = ctx->partially_sent_record;
-	if (!sg)
-		return false;
-
-	while (1) {
+	for (sg = ctx->partially_sent_record; sg; sg = sg_next(sg)) {
 		put_page(sg_page(sg));
 		sk_mem_uncharge(sk, sg->length);
-
-		if (sg_is_last(sg))
-			break;
-		sg++;
 	}
 	ctx->partially_sent_record = NULL;
-	return true;
 }
 
 static void tls_write_space(struct sock *sk)
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/tls/tls_sw.c linux-libre-5.3.15-gnu/net/tls/tls_sw.c
--- linux-libre-5.3.14-gnu/net/tls/tls_sw.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/tls/tls_sw.c	2019-12-04 16:34:32.000000000 -0500
@@ -705,8 +705,7 @@ static int tls_push_record(struct sock *
 	}
 
 	i = msg_pl->sg.start;
-	sg_chain(rec->sg_aead_in, 2, rec->inplace_crypto ?
-		 &msg_en->sg.data[i] : &msg_pl->sg.data[i]);
+	sg_chain(rec->sg_aead_in, 2, &msg_pl->sg.data[i]);
 
 	i = msg_en->sg.end;
 	sk_msg_iter_var_prev(i);
@@ -766,8 +765,14 @@ static int bpf_exec_tx_verdict(struct sk
 
 	policy = !(flags & MSG_SENDPAGE_NOPOLICY);
 	psock = sk_psock_get(sk);
-	if (!psock || !policy)
-		return tls_push_record(sk, flags, record_type);
+	if (!psock || !policy) {
+		err = tls_push_record(sk, flags, record_type);
+		if (err) {
+			*copied -= sk_msg_free(sk, msg);
+			tls_free_open_rec(sk);
+		}
+		return err;
+	}
 more_data:
 	enospc = sk_msg_full(msg);
 	if (psock->eval == __SK_NONE) {
@@ -965,8 +970,6 @@ alloc_encrypted:
 			if (ret)
 				goto fallback_to_reg_send;
 
-			rec->inplace_crypto = 0;
-
 			num_zc++;
 			copied += try_to_copy;
 
@@ -979,7 +982,7 @@ alloc_encrypted:
 					num_async++;
 				else if (ret == -ENOMEM)
 					goto wait_for_memory;
-				else if (ret == -ENOSPC)
+				else if (ctx->open_rec && ret == -ENOSPC)
 					goto rollback_iter;
 				else if (ret != -EAGAIN)
 					goto send_end;
@@ -1048,11 +1051,12 @@ wait_for_memory:
 		ret = sk_stream_wait_memory(sk, &timeo);
 		if (ret) {
 trim_sgl:
-			tls_trim_both_msgs(sk, orig_size);
+			if (ctx->open_rec)
+				tls_trim_both_msgs(sk, orig_size);
 			goto send_end;
 		}
 
-		if (msg_en->sg.size < required_size)
+		if (ctx->open_rec && msg_en->sg.size < required_size)
 			goto alloc_encrypted;
 	}
 
@@ -1164,7 +1168,6 @@ alloc_payload:
 
 		tls_ctx->pending_open_record_frags = true;
 		if (full_record || eor || sk_msg_full(msg_pl)) {
-			rec->inplace_crypto = 0;
 			ret = bpf_exec_tx_verdict(msg_pl, sk, full_record,
 						  record_type, &copied, flags);
 			if (ret) {
@@ -1185,11 +1188,13 @@ wait_for_sndbuf:
 wait_for_memory:
 		ret = sk_stream_wait_memory(sk, &timeo);
 		if (ret) {
-			tls_trim_both_msgs(sk, msg_pl->sg.size);
+			if (ctx->open_rec)
+				tls_trim_both_msgs(sk, msg_pl->sg.size);
 			goto sendpage_end;
 		}
 
-		goto alloc_payload;
+		if (ctx->open_rec)
+			goto alloc_payload;
 	}
 
 	if (num_async) {
@@ -2081,7 +2086,8 @@ void tls_sw_release_resources_tx(struct
 	/* Free up un-sent records in tx_list. First, free
 	 * the partially sent record if any at head of tx_list.
 	 */
-	if (tls_free_partial_record(sk, tls_ctx)) {
+	if (tls_ctx->partially_sent_record) {
+		tls_free_partial_record(sk, tls_ctx);
 		rec = list_first_entry(&ctx->tx_list,
 				       struct tls_rec, list);
 		list_del(&rec->list);
diff -druNp --no-dereference linux-libre-5.3.14-gnu/net/xfrm/xfrm_state.c linux-libre-5.3.15-gnu/net/xfrm/xfrm_state.c
--- linux-libre-5.3.14-gnu/net/xfrm/xfrm_state.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/net/xfrm/xfrm_state.c	2019-12-04 16:34:32.000000000 -0500
@@ -495,6 +495,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-5.3.14-gnu/samples/bpf/Makefile linux-libre-5.3.15-gnu/samples/bpf/Makefile
--- linux-libre-5.3.14-gnu/samples/bpf/Makefile	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/samples/bpf/Makefile	2019-12-04 16:34:32.000000000 -0500
@@ -176,6 +176,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
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/scripts/gdb/linux/symbols.py linux-libre-5.3.15-gnu/scripts/gdb/linux/symbols.py
--- linux-libre-5.3.14-gnu/scripts/gdb/linux/symbols.py	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/scripts/gdb/linux/symbols.py	2019-12-04 16:34:32.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-5.3.14-gnu/sound/core/compress_offload.c linux-libre-5.3.15-gnu/sound/core/compress_offload.c
--- linux-libre-5.3.14-gnu/sound/core/compress_offload.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/sound/core/compress_offload.c	2019-12-04 16:34:32.000000000 -0500
@@ -528,7 +528,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-5.3.14-gnu/sound/pci/hda/patch_hdmi.c linux-libre-5.3.15-gnu/sound/pci/hda/patch_hdmi.c
--- linux-libre-5.3.14-gnu/sound/pci/hda/patch_hdmi.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/sound/pci/hda/patch_hdmi.c	2019-12-04 16:34:32.000000000 -0500
@@ -2703,6 +2703,18 @@ static int patch_i915_icl_hdmi(struct hd
 	return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map));
 }
 
+static int patch_i915_tgl_hdmi(struct hda_codec *codec)
+{
+	/*
+	 * pin to port mapping table where the value indicate the pin number and
+	 * the index indicate the port number with 1 base.
+	 */
+	static const int map[] = {0x4, 0x6, 0x8, 0xa, 0xb, 0xc, 0xd, 0xe, 0xf};
+
+	return intel_hsw_common_init(codec, 0x02, map, ARRAY_SIZE(map));
+}
+
+
 /* Intel Baytrail and Braswell; with eld notifier */
 static int patch_i915_byt_hdmi(struct hda_codec *codec)
 {
@@ -3960,6 +3972,7 @@ HDA_CODEC_ENTRY(0x8086280b, "Kabylake HD
 HDA_CODEC_ENTRY(0x8086280c, "Cannonlake HDMI",	patch_i915_glk_hdmi),
 HDA_CODEC_ENTRY(0x8086280d, "Geminilake HDMI",	patch_i915_glk_hdmi),
 HDA_CODEC_ENTRY(0x8086280f, "Icelake HDMI",	patch_i915_icl_hdmi),
+HDA_CODEC_ENTRY(0x80862812, "Tigerlake HDMI",	patch_i915_tgl_hdmi),
 HDA_CODEC_ENTRY(0x80862880, "CedarTrail HDMI",	patch_generic_hdmi),
 HDA_CODEC_ENTRY(0x80862882, "Valleyview2 HDMI",	patch_i915_byt_hdmi),
 HDA_CODEC_ENTRY(0x80862883, "Braswell HDMI",	patch_i915_byt_hdmi),
diff -druNp --no-dereference linux-libre-5.3.14-gnu/sound/soc/codecs/hdac_hda.c linux-libre-5.3.15-gnu/sound/soc/codecs/hdac_hda.c
--- linux-libre-5.3.14-gnu/sound/soc/codecs/hdac_hda.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/sound/soc/codecs/hdac_hda.c	2019-12-04 16:34:32.000000000 -0500
@@ -410,8 +410,8 @@ static void hdac_hda_codec_remove(struct
 		return;
 	}
 
-	snd_hdac_ext_bus_link_put(hdev->bus, hlink);
 	pm_runtime_disable(&hdev->dev);
+	snd_hdac_ext_bus_link_put(hdev->bus, hlink);
 }
 
 static const struct snd_soc_dapm_route hdac_hda_dapm_routes[] = {
diff -druNp --no-dereference linux-libre-5.3.14-gnu/sound/soc/codecs/msm8916-wcd-analog.c linux-libre-5.3.15-gnu/sound/soc/codecs/msm8916-wcd-analog.c
--- linux-libre-5.3.14-gnu/sound/soc/codecs/msm8916-wcd-analog.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/sound/soc/codecs/msm8916-wcd-analog.c	2019-12-04 16:34:32.000000000 -0500
@@ -306,7 +306,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(
@@ -321,7 +321,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-5.3.14-gnu/sound/soc/kirkwood/kirkwood-i2s.c linux-libre-5.3.15-gnu/sound/soc/kirkwood/kirkwood-i2s.c
--- linux-libre-5.3.14-gnu/sound/soc/kirkwood/kirkwood-i2s.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/sound/soc/kirkwood/kirkwood-i2s.c	2019-12-04 16:34:32.000000000 -0500
@@ -559,10 +559,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)
@@ -578,6 +574,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;
@@ -591,7 +591,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");
@@ -614,6 +614,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-5.3.14-gnu/sound/soc/rockchip/rockchip_max98090.c linux-libre-5.3.15-gnu/sound/soc/rockchip/rockchip_max98090.c
--- linux-libre-5.3.14-gnu/sound/soc/rockchip/rockchip_max98090.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/sound/soc/rockchip/rockchip_max98090.c	2019-12-04 16:34:32.000000000 -0500
@@ -67,10 +67,13 @@ static int rk_jack_event(struct notifier
 	struct snd_soc_jack *jack = (struct snd_soc_jack *)data;
 	struct snd_soc_dapm_context *dapm = &jack->card->dapm;
 
-	if (event & SND_JACK_MICROPHONE)
+	if (event & SND_JACK_MICROPHONE) {
 		snd_soc_dapm_force_enable_pin(dapm, "MICBIAS");
-	else
+		snd_soc_dapm_force_enable_pin(dapm, "SHDN");
+	} else {
 		snd_soc_dapm_disable_pin(dapm, "MICBIAS");
+		snd_soc_dapm_disable_pin(dapm, "SHDN");
+	}
 
 	snd_soc_dapm_sync(dapm);
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/sound/soc/sof/ipc.c linux-libre-5.3.15-gnu/sound/soc/sof/ipc.c
--- linux-libre-5.3.14-gnu/sound/soc/sof/ipc.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/sound/soc/sof/ipc.c	2019-12-04 16:34:32.000000000 -0500
@@ -578,8 +578,10 @@ static int sof_set_get_large_ctrl_data(s
 	else
 		err = sof_get_ctrl_copy_params(cdata->type, partdata, cdata,
 					       sparams);
-	if (err < 0)
+	if (err < 0) {
+		kfree(partdata);
 		return err;
+	}
 
 	msg_bytes = sparams->msg_bytes;
 	pl_size = sparams->pl_size;
diff -druNp --no-dereference linux-libre-5.3.14-gnu/sound/soc/sof/topology.c linux-libre-5.3.15-gnu/sound/soc/sof/topology.c
--- linux-libre-5.3.14-gnu/sound/soc/sof/topology.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/sound/soc/sof/topology.c	2019-12-04 16:34:32.000000000 -0500
@@ -533,15 +533,16 @@ static int sof_control_load_bytes(struct
 	struct soc_bytes_ext *sbe = (struct soc_bytes_ext *)kc->private_value;
 	int max_size = sbe->max;
 
-	if (le32_to_cpu(control->priv.size) > max_size) {
+	/* init the get/put bytes data */
+	scontrol->size = sizeof(struct sof_ipc_ctrl_data) +
+		le32_to_cpu(control->priv.size);
+
+	if (scontrol->size > max_size) {
 		dev_err(sdev->dev, "err: bytes data size %d exceeds max %d.\n",
-			control->priv.size, max_size);
+			scontrol->size, max_size);
 		return -EINVAL;
 	}
 
-	/* init the get/put bytes data */
-	scontrol->size = sizeof(struct sof_ipc_ctrl_data) +
-		le32_to_cpu(control->priv.size);
 	scontrol->control_data = kzalloc(max_size, GFP_KERNEL);
 	cdata = scontrol->control_data;
 	if (!scontrol->control_data)
diff -druNp --no-dereference linux-libre-5.3.14-gnu/sound/soc/stm/stm32_sai_sub.c linux-libre-5.3.15-gnu/sound/soc/stm/stm32_sai_sub.c
--- linux-libre-5.3.14-gnu/sound/soc/stm/stm32_sai_sub.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/sound/soc/stm/stm32_sai_sub.c	2019-12-04 16:34:32.000000000 -0500
@@ -1217,6 +1217,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,
@@ -1269,7 +1279,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-5.3.14-gnu/sound/soc/ti/sdma-pcm.c linux-libre-5.3.15-gnu/sound/soc/ti/sdma-pcm.c
--- linux-libre-5.3.14-gnu/sound/soc/ti/sdma-pcm.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/sound/soc/ti/sdma-pcm.c	2019-12-04 16:34:32.000000000 -0500
@@ -62,7 +62,7 @@ int sdma_pcm_platform_register(struct de
 	config->chan_names[0] = txdmachan;
 	config->chan_names[1] = rxdmachan;
 
-	return devm_snd_dmaengine_pcm_register(dev, config, 0);
+	return devm_snd_dmaengine_pcm_register(dev, config, flags);
 }
 EXPORT_SYMBOL_GPL(sdma_pcm_platform_register);
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/tools/perf/util/scripting-engines/trace-event-perl.c linux-libre-5.3.15-gnu/tools/perf/util/scripting-engines/trace-event-perl.c
--- linux-libre-5.3.14-gnu/tools/perf/util/scripting-engines/trace-event-perl.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/tools/perf/util/scripting-engines/trace-event-perl.c	2019-12-04 16:34:32.000000000 -0500
@@ -539,10 +539,11 @@ static int perl_stop_script(void)
 
 static int perl_generate_script(struct tep_handle *pevent, const char *outfile)
 {
+	int i, not_first, count, nr_events;
+	struct tep_event **all_events;
 	struct tep_event *event = NULL;
 	struct tep_format_field *f;
 	char fname[PATH_MAX];
-	int not_first, count;
 	FILE *ofp;
 
 	sprintf(fname, "%s.pl", outfile);
@@ -603,8 +604,11 @@ sub print_backtrace\n\
 }\n\n\
 ");
 
+	nr_events = tep_get_events_count(pevent);
+	all_events = tep_list_events(pevent, TEP_EVENT_SORT_ID);
 
-	while ((event = trace_find_next_event(pevent, event))) {
+	for (i = 0; all_events && i < nr_events; i++) {
+		event = all_events[i];
 		fprintf(ofp, "sub %s::%s\n{\n", event->system, event->name);
 		fprintf(ofp, "\tmy (");
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/tools/perf/util/scripting-engines/trace-event-python.c linux-libre-5.3.15-gnu/tools/perf/util/scripting-engines/trace-event-python.c
--- linux-libre-5.3.14-gnu/tools/perf/util/scripting-engines/trace-event-python.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/tools/perf/util/scripting-engines/trace-event-python.c	2019-12-04 16:34:32.000000000 -0500
@@ -1687,10 +1687,11 @@ static int python_stop_script(void)
 
 static int python_generate_script(struct tep_handle *pevent, const char *outfile)
 {
+	int i, not_first, count, nr_events;
+	struct tep_event **all_events;
 	struct tep_event *event = NULL;
 	struct tep_format_field *f;
 	char fname[PATH_MAX];
-	int not_first, count;
 	FILE *ofp;
 
 	sprintf(fname, "%s.py", outfile);
@@ -1735,7 +1736,11 @@ static int python_generate_script(struct
 	fprintf(ofp, "def trace_end():\n");
 	fprintf(ofp, "\tprint(\"in trace_end\")\n\n");
 
-	while ((event = trace_find_next_event(pevent, event))) {
+	nr_events = tep_get_events_count(pevent);
+	all_events = tep_list_events(pevent, TEP_EVENT_SORT_ID);
+
+	for (i = 0; all_events && i < nr_events; i++) {
+		event = all_events[i];
 		fprintf(ofp, "def %s__%s(", event->system, event->name);
 		fprintf(ofp, "event_name, ");
 		fprintf(ofp, "context, ");
diff -druNp --no-dereference linux-libre-5.3.14-gnu/tools/testing/selftests/bpf/test_sockmap.c linux-libre-5.3.15-gnu/tools/testing/selftests/bpf/test_sockmap.c
--- linux-libre-5.3.14-gnu/tools/testing/selftests/bpf/test_sockmap.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/tools/testing/selftests/bpf/test_sockmap.c	2019-12-04 16:34:32.000000000 -0500
@@ -240,14 +240,14 @@ static int sockmap_init_sockets(int verb
 	addr.sin_port = htons(S1_PORT);
 	err = bind(s1, (struct sockaddr *)&addr, sizeof(addr));
 	if (err < 0) {
-		perror("bind s1 failed()\n");
+		perror("bind s1 failed()");
 		return errno;
 	}
 
 	addr.sin_port = htons(S2_PORT);
 	err = bind(s2, (struct sockaddr *)&addr, sizeof(addr));
 	if (err < 0) {
-		perror("bind s2 failed()\n");
+		perror("bind s2 failed()");
 		return errno;
 	}
 
@@ -255,14 +255,14 @@ static int sockmap_init_sockets(int verb
 	addr.sin_port = htons(S1_PORT);
 	err = listen(s1, 32);
 	if (err < 0) {
-		perror("listen s1 failed()\n");
+		perror("listen s1 failed()");
 		return errno;
 	}
 
 	addr.sin_port = htons(S2_PORT);
 	err = listen(s2, 32);
 	if (err < 0) {
-		perror("listen s1 failed()\n");
+		perror("listen s1 failed()");
 		return errno;
 	}
 
@@ -270,14 +270,14 @@ static int sockmap_init_sockets(int verb
 	addr.sin_port = htons(S1_PORT);
 	err = connect(c1, (struct sockaddr *)&addr, sizeof(addr));
 	if (err < 0 && errno != EINPROGRESS) {
-		perror("connect c1 failed()\n");
+		perror("connect c1 failed()");
 		return errno;
 	}
 
 	addr.sin_port = htons(S2_PORT);
 	err = connect(c2, (struct sockaddr *)&addr, sizeof(addr));
 	if (err < 0 && errno != EINPROGRESS) {
-		perror("connect c2 failed()\n");
+		perror("connect c2 failed()");
 		return errno;
 	} else if (err < 0) {
 		err = 0;
@@ -286,13 +286,13 @@ static int sockmap_init_sockets(int verb
 	/* Accept Connecrtions */
 	p1 = accept(s1, NULL, NULL);
 	if (p1 < 0) {
-		perror("accept s1 failed()\n");
+		perror("accept s1 failed()");
 		return errno;
 	}
 
 	p2 = accept(s2, NULL, NULL);
 	if (p2 < 0) {
-		perror("accept s1 failed()\n");
+		perror("accept s1 failed()");
 		return errno;
 	}
 
@@ -332,6 +332,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);
@@ -339,12 +343,17 @@ 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);
 
 		if (!drop && sent < 0) {
-			perror("send loop error:");
+			perror("send loop error");
 			close(fp);
 			return sent;
 		} else if (drop && sent >= 0) {
@@ -463,7 +472,7 @@ static int msg_loop(int fd, int iov_coun
 			int sent = sendmsg(fd, &msg, flags);
 
 			if (!drop && sent < 0) {
-				perror("send loop error:");
+				perror("send loop error");
 				goto out_errno;
 			} else if (drop && sent >= 0) {
 				printf("send loop error expected: %i\n", sent);
@@ -499,7 +508,7 @@ static int msg_loop(int fd, int iov_coun
 		total_bytes -= txmsg_pop_total;
 		err = clock_gettime(CLOCK_MONOTONIC, &s->start);
 		if (err < 0)
-			perror("recv start time: ");
+			perror("recv start time");
 		while (s->bytes_recvd < total_bytes) {
 			if (txmsg_cork) {
 				timeout.tv_sec = 0;
@@ -543,7 +552,7 @@ static int msg_loop(int fd, int iov_coun
 			if (recv < 0) {
 				if (errno != EWOULDBLOCK) {
 					clock_gettime(CLOCK_MONOTONIC, &s->end);
-					perror("recv failed()\n");
+					perror("recv failed()");
 					goto out_errno;
 				}
 			}
@@ -557,7 +566,7 @@ static int msg_loop(int fd, int iov_coun
 
 				errno = msg_verify_data(&msg, recv, chunk_sz);
 				if (errno) {
-					perror("data verify msg failed\n");
+					perror("data verify msg failed");
 					goto out_errno;
 				}
 				if (recvp) {
@@ -565,7 +574,7 @@ static int msg_loop(int fd, int iov_coun
 								recvp,
 								chunk_sz);
 					if (errno) {
-						perror("data verify msg_peek failed\n");
+						perror("data verify msg_peek failed");
 						goto out_errno;
 					}
 				}
@@ -654,7 +663,7 @@ static int sendmsg_test(struct sockmap_o
 			err = 0;
 		exit(err ? 1 : 0);
 	} else if (rxpid == -1) {
-		perror("msg_loop_rx: ");
+		perror("msg_loop_rx");
 		return errno;
 	}
 
@@ -681,7 +690,7 @@ static int sendmsg_test(struct sockmap_o
 				s.bytes_recvd, recvd_Bps, recvd_Bps/giga);
 		exit(err ? 1 : 0);
 	} else if (txpid == -1) {
-		perror("msg_loop_tx: ");
+		perror("msg_loop_tx");
 		return errno;
 	}
 
@@ -715,7 +724,7 @@ static int forever_ping_pong(int rate, s
 	/* Ping/Pong data from client to server */
 	sc = send(c1, buf, sizeof(buf), 0);
 	if (sc < 0) {
-		perror("send failed()\n");
+		perror("send failed()");
 		return sc;
 	}
 
@@ -748,7 +757,7 @@ static int forever_ping_pong(int rate, s
 			rc = recv(i, buf, sizeof(buf), 0);
 			if (rc < 0) {
 				if (errno != EWOULDBLOCK) {
-					perror("recv failed()\n");
+					perror("recv failed()");
 					return rc;
 				}
 			}
@@ -760,7 +769,7 @@ static int forever_ping_pong(int rate, s
 
 			sc = send(i, buf, rc, 0);
 			if (sc < 0) {
-				perror("send failed()\n");
+				perror("send failed()");
 				return sc;
 			}
 		}
diff -druNp --no-dereference linux-libre-5.3.14-gnu/tools/testing/selftests/bpf/test_sysctl.c linux-libre-5.3.15-gnu/tools/testing/selftests/bpf/test_sysctl.c
--- linux-libre-5.3.14-gnu/tools/testing/selftests/bpf/test_sysctl.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/tools/testing/selftests/bpf/test_sysctl.c	2019-12-04 16:34:32.000000000 -0500
@@ -158,9 +158,14 @@ static struct sysctl_test tests[] = {
 		.descr = "ctx:file_pos sysctl:read read ok narrow",
 		.insns = {
 			/* If (file_pos == X) */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
 			BPF_LDX_MEM(BPF_B, BPF_REG_7, BPF_REG_1,
 				    offsetof(struct bpf_sysctl, file_pos)),
-			BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 0, 2),
+#else
+			BPF_LDX_MEM(BPF_B, BPF_REG_7, BPF_REG_1,
+				    offsetof(struct bpf_sysctl, file_pos) + 3),
+#endif
+			BPF_JMP_IMM(BPF_JNE, BPF_REG_7, 4, 2),
 
 			/* return ALLOW; */
 			BPF_MOV64_IMM(BPF_REG_0, 1),
@@ -173,6 +178,7 @@ static struct sysctl_test tests[] = {
 		.attach_type = BPF_CGROUP_SYSCTL,
 		.sysctl = "kernel/ostype",
 		.open_flags = O_RDONLY,
+		.seek = 4,
 		.result = SUCCESS,
 	},
 	{
diff -druNp --no-dereference linux-libre-5.3.14-gnu/tools/testing/selftests/bpf/xdping.c linux-libre-5.3.15-gnu/tools/testing/selftests/bpf/xdping.c
--- linux-libre-5.3.14-gnu/tools/testing/selftests/bpf/xdping.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/tools/testing/selftests/bpf/xdping.c	2019-12-04 16:34:32.000000000 -0500
@@ -45,7 +45,7 @@ static int get_stats(int fd, __u16 count
 	printf("\nXDP RTT data:\n");
 
 	if (bpf_map_lookup_elem(fd, &raddr, &pinginfo)) {
-		perror("bpf_map_lookup elem: ");
+		perror("bpf_map_lookup elem");
 		return 1;
 	}
 
diff -druNp --no-dereference linux-libre-5.3.14-gnu/tools/testing/selftests/net/pmtu.sh linux-libre-5.3.15-gnu/tools/testing/selftests/net/pmtu.sh
--- linux-libre-5.3.14-gnu/tools/testing/selftests/net/pmtu.sh	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/tools/testing/selftests/net/pmtu.sh	2019-12-04 16:34:32.000000000 -0500
@@ -1249,8 +1249,7 @@ test_list_flush_ipv4_exception() {
 	done
 	run_cmd ${ns_a} ping -q -M want -i 0.1 -c 2 -s 1800 "${dst2}"
 
-	# Each exception is printed as two lines
-	if [ "$(${ns_a} ip route list cache | wc -l)" -ne 202 ]; then
+	if [ "$(${ns_a} ip -oneline route list cache | wc -l)" -ne 101 ]; then
 		err "  can't list cached exceptions"
 		fail=1
 	fi
@@ -1300,7 +1299,7 @@ test_list_flush_ipv6_exception() {
 		run_cmd ${ns_a} ping -q -M want -i 0.1 -w 1 -s 1800 "${dst_prefix1}${i}"
 	done
 	run_cmd ${ns_a} ping -q -M want -i 0.1 -w 1 -s 1800 "${dst2}"
-	if [ "$(${ns_a} ip -6 route list cache | wc -l)" -ne 101 ]; then
+	if [ "$(${ns_a} ip -oneline -6 route list cache | wc -l)" -ne 101 ]; then
 		err "  can't list cached exceptions"
 		fail=1
 	fi
diff -druNp --no-dereference linux-libre-5.3.14-gnu/tools/testing/selftests/net/tls.c linux-libre-5.3.15-gnu/tools/testing/selftests/net/tls.c
--- linux-libre-5.3.14-gnu/tools/testing/selftests/net/tls.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/tools/testing/selftests/net/tls.c	2019-12-04 16:34:32.000000000 -0500
@@ -268,6 +268,38 @@ TEST_F(tls, sendmsg_single)
 	EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
 }
 
+#define MAX_FRAGS	64
+#define SEND_LEN	13
+TEST_F(tls, sendmsg_fragmented)
+{
+	char const *test_str = "test_sendmsg";
+	char buf[SEND_LEN * MAX_FRAGS];
+	struct iovec vec[MAX_FRAGS];
+	struct msghdr msg;
+	int i, frags;
+
+	for (frags = 1; frags <= MAX_FRAGS; frags++) {
+		for (i = 0; i < frags; i++) {
+			vec[i].iov_base = (char *)test_str;
+			vec[i].iov_len = SEND_LEN;
+		}
+
+		memset(&msg, 0, sizeof(struct msghdr));
+		msg.msg_iov = vec;
+		msg.msg_iovlen = frags;
+
+		EXPECT_EQ(sendmsg(self->fd, &msg, 0), SEND_LEN * frags);
+		EXPECT_EQ(recv(self->cfd, buf, SEND_LEN * frags, MSG_WAITALL),
+			  SEND_LEN * frags);
+
+		for (i = 0; i < frags; i++)
+			EXPECT_EQ(memcmp(buf + SEND_LEN * i,
+					 test_str, SEND_LEN), 0);
+	}
+}
+#undef MAX_FRAGS
+#undef SEND_LEN
+
 TEST_F(tls, sendmsg_large)
 {
 	void *mem = malloc(16384);
@@ -694,6 +726,34 @@ TEST_F(tls, recv_lowat)
 	EXPECT_EQ(memcmp(send_mem, recv_mem + 10, 5), 0);
 }
 
+TEST_F(tls, recv_rcvbuf)
+{
+	char send_mem[4096];
+	char recv_mem[4096];
+	int rcv_buf = 1024;
+
+	memset(send_mem, 0x1c, sizeof(send_mem));
+
+	EXPECT_EQ(setsockopt(self->cfd, SOL_SOCKET, SO_RCVBUF,
+			     &rcv_buf, sizeof(rcv_buf)), 0);
+
+	EXPECT_EQ(send(self->fd, send_mem, 512, 0), 512);
+	memset(recv_mem, 0, sizeof(recv_mem));
+	EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), 512);
+	EXPECT_EQ(memcmp(send_mem, recv_mem, 512), 0);
+
+	if (self->notls)
+		return;
+
+	EXPECT_EQ(send(self->fd, send_mem, 4096, 0), 4096);
+	memset(recv_mem, 0, sizeof(recv_mem));
+	EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), -1);
+	EXPECT_EQ(errno, EMSGSIZE);
+
+	EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), -1);
+	EXPECT_EQ(errno, EMSGSIZE);
+}
+
 TEST_F(tls, bidir)
 {
 	char const *test_str = "test_read";
diff -druNp --no-dereference linux-libre-5.3.14-gnu/tools/testing/selftests/vm/gup_benchmark.c linux-libre-5.3.15-gnu/tools/testing/selftests/vm/gup_benchmark.c
--- linux-libre-5.3.14-gnu/tools/testing/selftests/vm/gup_benchmark.c	2019-11-29 04:08:31.000000000 -0500
+++ linux-libre-5.3.15-gnu/tools/testing/selftests/vm/gup_benchmark.c	2019-12-04 16:34:32.000000000 -0500
@@ -71,7 +71,7 @@ int main(int argc, char **argv)
 			flags |= MAP_SHARED;
 			break;
 		case 'H':
-			flags |= MAP_HUGETLB;
+			flags |= (MAP_HUGETLB | MAP_ANONYMOUS);
 			break;
 		default:
 			return -1;
