diff -druNp --no-dereference linux-libre-5.6.10-gnu/arch/arm/boot/dts/imx6qdl-sr-som-ti.dtsi linux-libre-5.6.11-gnu/arch/arm/boot/dts/imx6qdl-sr-som-ti.dtsi
--- linux-libre-5.6.10-gnu/arch/arm/boot/dts/imx6qdl-sr-som-ti.dtsi	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/arch/arm/boot/dts/imx6qdl-sr-som-ti.dtsi	2020-05-06 02:16:50.000000000 -0400
@@ -153,6 +153,7 @@
 	bus-width = <4>;
 	keep-power-in-suspend;
 	mmc-pwrseq = <&pwrseq_ti_wifi>;
+	cap-power-off-card;
 	non-removable;
 	vmmc-supply = <&vcc_3v3>;
 	/* vqmmc-supply = <&nvcc_sd1>; - MMC layer doesn't like it! */
diff -druNp --no-dereference linux-libre-5.6.10-gnu/arch/arm64/kernel/vdso/Makefile linux-libre-5.6.11-gnu/arch/arm64/kernel/vdso/Makefile
--- linux-libre-5.6.10-gnu/arch/arm64/kernel/vdso/Makefile	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/arch/arm64/kernel/vdso/Makefile	2020-05-06 02:16:50.000000000 -0400
@@ -32,7 +32,7 @@ UBSAN_SANITIZE			:= n
 OBJECT_FILES_NON_STANDARD	:= y
 KCOV_INSTRUMENT			:= n
 
-CFLAGS_vgettimeofday.o = -O2 -mcmodel=tiny
+CFLAGS_vgettimeofday.o = -O2 -mcmodel=tiny -fasynchronous-unwind-tables
 
 ifneq ($(c-gettimeofday-y),)
   CFLAGS_vgettimeofday.o += -include $(c-gettimeofday-y)
diff -druNp --no-dereference linux-libre-5.6.10-gnu/arch/x86/hyperv/hv_init.c linux-libre-5.6.11-gnu/arch/x86/hyperv/hv_init.c
--- linux-libre-5.6.10-gnu/arch/x86/hyperv/hv_init.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/arch/x86/hyperv/hv_init.c	2020-05-06 02:16:50.000000000 -0400
@@ -73,7 +73,8 @@ static int hv_cpu_init(unsigned int cpu)
 	struct page *pg;
 
 	input_arg = (void **)this_cpu_ptr(hyperv_pcpu_input_arg);
-	pg = alloc_page(GFP_KERNEL);
+	/* hv_cpu_init() can be called with IRQs disabled from hv_resume() */
+	pg = alloc_page(irqs_disabled() ? GFP_ATOMIC : GFP_KERNEL);
 	if (unlikely(!pg))
 		return -ENOMEM;
 	*input_arg = page_address(pg);
@@ -254,6 +255,7 @@ static int __init hv_pci_init(void)
 static int hv_suspend(void)
 {
 	union hv_x64_msr_hypercall_contents hypercall_msr;
+	int ret;
 
 	/*
 	 * Reset the hypercall page as it is going to be invalidated
@@ -270,12 +272,17 @@ static int hv_suspend(void)
 	hypercall_msr.enable = 0;
 	wrmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
 
-	return 0;
+	ret = hv_cpu_die(0);
+	return ret;
 }
 
 static void hv_resume(void)
 {
 	union hv_x64_msr_hypercall_contents hypercall_msr;
+	int ret;
+
+	ret = hv_cpu_init(0);
+	WARN_ON(ret);
 
 	/* Re-enable the hypercall page */
 	rdmsrl(HV_X64_MSR_HYPERCALL, hypercall_msr.as_uint64);
@@ -288,6 +295,7 @@ static void hv_resume(void)
 	hv_hypercall_pg_saved = NULL;
 }
 
+/* Note: when the ops are called, only CPU0 is online and IRQs are disabled. */
 static struct syscore_ops hv_syscore_ops = {
 	.suspend	= hv_suspend,
 	.resume		= hv_resume,
diff -druNp --no-dereference linux-libre-5.6.10-gnu/block/partition-generic.c linux-libre-5.6.11-gnu/block/partition-generic.c
--- linux-libre-5.6.10-gnu/block/partition-generic.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/block/partition-generic.c	2020-05-06 02:16:50.000000000 -0400
@@ -468,7 +468,7 @@ int blk_drop_partitions(struct gendisk *
 
 	if (!disk_part_scan_enabled(disk))
 		return 0;
-	if (bdev->bd_part_count || bdev->bd_openers > 1)
+	if (bdev->bd_part_count)
 		return -EBUSY;
 	res = invalidate_partition(disk, 0);
 	if (res)
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/acpi/device_pm.c linux-libre-5.6.11-gnu/drivers/acpi/device_pm.c
--- linux-libre-5.6.10-gnu/drivers/acpi/device_pm.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/acpi/device_pm.c	2020-05-06 02:16:50.000000000 -0400
@@ -273,13 +273,13 @@ int acpi_device_set_power(struct acpi_de
  end:
 	if (result) {
 		dev_warn(&device->dev, "Failed to change power state to %s\n",
-			 acpi_power_state_string(state));
+			 acpi_power_state_string(target_state));
 	} else {
 		device->power.state = target_state;
 		ACPI_DEBUG_PRINT((ACPI_DB_INFO,
 				  "Device [%s] transitioned to %s\n",
 				  device->pnp.bus_id,
-				  acpi_power_state_string(state)));
+				  acpi_power_state_string(target_state)));
 	}
 
 	return result;
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/crypto/caam/caamalg.c linux-libre-5.6.11-gnu/drivers/crypto/caam/caamalg.c
--- linux-libre-5.6.10-gnu/drivers/crypto/caam/caamalg.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/crypto/caam/caamalg.c	2020-05-06 02:16:50.000000000 -0400
@@ -1791,7 +1791,7 @@ static struct skcipher_edesc *skcipher_e
 
 	if (ivsize || mapped_dst_nents > 1)
 		sg_to_sec4_set_last(edesc->sec4_sg + dst_sg_idx +
-				    mapped_dst_nents);
+				    mapped_dst_nents - 1 + !!ivsize);
 
 	if (sec4_sg_bytes) {
 		edesc->sec4_sg_dma = dma_map_single(jrdev, edesc->sec4_sg,
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/dma/dmaengine.c linux-libre-5.6.11-gnu/drivers/dma/dmaengine.c
--- linux-libre-5.6.10-gnu/drivers/dma/dmaengine.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/dma/dmaengine.c	2020-05-06 02:16:50.000000000 -0400
@@ -151,10 +151,6 @@ static void chan_dev_release(struct devi
 	struct dma_chan_dev *chan_dev;
 
 	chan_dev = container_of(dev, typeof(*chan_dev), device);
-	if (atomic_dec_and_test(chan_dev->idr_ref)) {
-		ida_free(&dma_ida, chan_dev->dev_id);
-		kfree(chan_dev->idr_ref);
-	}
 	kfree(chan_dev);
 }
 
@@ -952,27 +948,9 @@ static int get_dma_id(struct dma_device
 }
 
 static int __dma_async_device_channel_register(struct dma_device *device,
-					       struct dma_chan *chan,
-					       int chan_id)
+					       struct dma_chan *chan)
 {
 	int rc = 0;
-	int chancnt = device->chancnt;
-	atomic_t *idr_ref;
-	struct dma_chan *tchan;
-
-	tchan = list_first_entry_or_null(&device->channels,
-					 struct dma_chan, device_node);
-	if (!tchan)
-		return -ENODEV;
-
-	if (tchan->dev) {
-		idr_ref = tchan->dev->idr_ref;
-	} else {
-		idr_ref = kmalloc(sizeof(*idr_ref), GFP_KERNEL);
-		if (!idr_ref)
-			return -ENOMEM;
-		atomic_set(idr_ref, 0);
-	}
 
 	chan->local = alloc_percpu(typeof(*chan->local));
 	if (!chan->local)
@@ -988,29 +966,36 @@ static int __dma_async_device_channel_re
 	 * When the chan_id is a negative value, we are dynamically adding
 	 * the channel. Otherwise we are static enumerating.
 	 */
-	chan->chan_id = chan_id < 0 ? chancnt : chan_id;
+	mutex_lock(&device->chan_mutex);
+	chan->chan_id = ida_alloc(&device->chan_ida, GFP_KERNEL);
+	mutex_unlock(&device->chan_mutex);
+	if (chan->chan_id < 0) {
+		pr_err("%s: unable to alloc ida for chan: %d\n",
+		       __func__, chan->chan_id);
+		goto err_out;
+	}
+
 	chan->dev->device.class = &dma_devclass;
 	chan->dev->device.parent = device->dev;
 	chan->dev->chan = chan;
-	chan->dev->idr_ref = idr_ref;
 	chan->dev->dev_id = device->dev_id;
-	atomic_inc(idr_ref);
 	dev_set_name(&chan->dev->device, "dma%dchan%d",
 		     device->dev_id, chan->chan_id);
-
 	rc = device_register(&chan->dev->device);
 	if (rc)
-		goto err_out;
+		goto err_out_ida;
 	chan->client_count = 0;
-	device->chancnt = chan->chan_id + 1;
+	device->chancnt++;
 
 	return 0;
 
+ err_out_ida:
+	mutex_lock(&device->chan_mutex);
+	ida_free(&device->chan_ida, chan->chan_id);
+	mutex_unlock(&device->chan_mutex);
  err_out:
 	free_percpu(chan->local);
 	kfree(chan->dev);
-	if (atomic_dec_return(idr_ref) == 0)
-		kfree(idr_ref);
 	return rc;
 }
 
@@ -1019,7 +1004,7 @@ int dma_async_device_channel_register(st
 {
 	int rc;
 
-	rc = __dma_async_device_channel_register(device, chan, -1);
+	rc = __dma_async_device_channel_register(device, chan);
 	if (rc < 0)
 		return rc;
 
@@ -1039,6 +1024,9 @@ static void __dma_async_device_channel_u
 	device->chancnt--;
 	chan->dev->chan = NULL;
 	mutex_unlock(&dma_list_mutex);
+	mutex_lock(&device->chan_mutex);
+	ida_free(&device->chan_ida, chan->chan_id);
+	mutex_unlock(&device->chan_mutex);
 	device_unregister(&chan->dev->device);
 	free_percpu(chan->local);
 }
@@ -1061,7 +1049,7 @@ EXPORT_SYMBOL_GPL(dma_async_device_chann
  */
 int dma_async_device_register(struct dma_device *device)
 {
-	int rc, i = 0;
+	int rc;
 	struct dma_chan* chan;
 
 	if (!device)
@@ -1166,9 +1154,12 @@ int dma_async_device_register(struct dma
 	if (rc != 0)
 		return rc;
 
+	mutex_init(&device->chan_mutex);
+	ida_init(&device->chan_ida);
+
 	/* represent channels in sysfs. Probably want devs too */
 	list_for_each_entry(chan, &device->channels, device_node) {
-		rc = __dma_async_device_channel_register(device, chan, i++);
+		rc = __dma_async_device_channel_register(device, chan);
 		if (rc < 0)
 			goto err_out;
 	}
@@ -1239,6 +1230,7 @@ void dma_async_device_unregister(struct
 	 */
 	dma_cap_set(DMA_PRIVATE, device->cap_mask);
 	dma_channel_rebalance();
+	ida_free(&dma_ida, device->dev_id);
 	dma_device_put(device);
 	mutex_unlock(&dma_list_mutex);
 }
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/dma/dmatest.c linux-libre-5.6.11-gnu/drivers/dma/dmatest.c
--- linux-libre-5.6.10-gnu/drivers/dma/dmatest.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/dma/dmatest.c	2020-05-06 02:16:50.000000000 -0400
@@ -240,7 +240,7 @@ static bool is_threaded_test_run(struct
 		struct dmatest_thread *thread;
 
 		list_for_each_entry(thread, &dtc->threads, node) {
-			if (!thread->done)
+			if (!thread->done && !thread->pending)
 				return true;
 		}
 	}
@@ -662,8 +662,8 @@ static int dmatest_func(void *data)
 		flags = DMA_CTRL_ACK | DMA_PREP_INTERRUPT;
 
 	ktime = ktime_get();
-	while (!kthread_should_stop()
-	       && !(params->iterations && total_tests >= params->iterations)) {
+	while (!(kthread_should_stop() ||
+	       (params->iterations && total_tests >= params->iterations))) {
 		struct dma_async_tx_descriptor *tx = NULL;
 		struct dmaengine_unmap_data *um;
 		dma_addr_t *dsts;
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/dma/Kconfig linux-libre-5.6.11-gnu/drivers/dma/Kconfig
--- linux-libre-5.6.10-gnu/drivers/dma/Kconfig	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/dma/Kconfig	2020-05-06 02:16:50.000000000 -0400
@@ -241,7 +241,8 @@ config FSL_RAID
 
 config HISI_DMA
 	tristate "HiSilicon DMA Engine support"
-	depends on ARM64 || (COMPILE_TEST && PCI_MSI)
+	depends on ARM64 || COMPILE_TEST
+	depends on PCI_MSI
 	select DMA_ENGINE
 	select DMA_VIRTUAL_CHANNELS
 	help
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/dma/ti/k3-psil.c linux-libre-5.6.11-gnu/drivers/dma/ti/k3-psil.c
--- linux-libre-5.6.10-gnu/drivers/dma/ti/k3-psil.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/dma/ti/k3-psil.c	2020-05-06 02:16:50.000000000 -0400
@@ -27,6 +27,7 @@ struct psil_endpoint_config *psil_get_ep
 			soc_ep_map = &j721e_ep_map;
 		} else {
 			pr_err("PSIL: No compatible machine found for map\n");
+			mutex_unlock(&ep_map_mutex);
 			return ERR_PTR(-ENOTSUPP);
 		}
 		pr_debug("%s: Using map for %s\n", __func__, soc_ep_map->name);
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/dma-buf/dma-buf.c linux-libre-5.6.11-gnu/drivers/dma-buf/dma-buf.c
--- linux-libre-5.6.10-gnu/drivers/dma-buf/dma-buf.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/dma-buf/dma-buf.c	2020-05-06 02:16:50.000000000 -0400
@@ -388,7 +388,8 @@ static long dma_buf_ioctl(struct file *f
 
 		return ret;
 
-	case DMA_BUF_SET_NAME:
+	case DMA_BUF_SET_NAME_A:
+	case DMA_BUF_SET_NAME_B:
 		return dma_buf_set_name(dmabuf, (const char __user *)arg);
 
 	default:
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h linux-libre-5.6.11-gnu/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/amd/amdgpu/navi10_sdma_pkt_open.h	2020-05-06 02:16:50.000000000 -0400
@@ -73,6 +73,22 @@
 #define SDMA_OP_AQL_COPY  0
 #define SDMA_OP_AQL_BARRIER_OR  0
 
+#define SDMA_GCR_RANGE_IS_PA		(1 << 18)
+#define SDMA_GCR_SEQ(x)			(((x) & 0x3) << 16)
+#define SDMA_GCR_GL2_WB			(1 << 15)
+#define SDMA_GCR_GL2_INV		(1 << 14)
+#define SDMA_GCR_GL2_DISCARD		(1 << 13)
+#define SDMA_GCR_GL2_RANGE(x)		(((x) & 0x3) << 11)
+#define SDMA_GCR_GL2_US			(1 << 10)
+#define SDMA_GCR_GL1_INV		(1 << 9)
+#define SDMA_GCR_GLV_INV		(1 << 8)
+#define SDMA_GCR_GLK_INV		(1 << 7)
+#define SDMA_GCR_GLK_WB			(1 << 6)
+#define SDMA_GCR_GLM_INV		(1 << 5)
+#define SDMA_GCR_GLM_WB			(1 << 4)
+#define SDMA_GCR_GL1_RANGE(x)		(((x) & 0x3) << 2)
+#define SDMA_GCR_GLI_INV(x)		(((x) & 0x3) << 0)
+
 /*define for op field*/
 #define SDMA_PKT_HEADER_op_offset 0
 #define SDMA_PKT_HEADER_op_mask   0x000000FF
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c linux-libre-5.6.11-gnu/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c	2020-05-03 02:42:11.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c	2020-05-06 06:18:04.000000000 -0400
@@ -375,6 +375,18 @@ static void sdma_v5_0_ring_emit_ib(struc
 	unsigned vmid = AMDGPU_JOB_GET_VMID(job);
 	uint64_t csa_mc_addr = amdgpu_sdma_get_csa_mc_addr(ring, vmid);
 
+	/* Invalidate L2, because if we don't do it, we might get stale cache
+	 * lines from previous IBs.
+	 */
+	amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_GCR_REQ));
+	amdgpu_ring_write(ring, 0);
+	amdgpu_ring_write(ring, (SDMA_GCR_GL2_INV |
+				 SDMA_GCR_GL2_WB |
+				 SDMA_GCR_GLM_INV |
+				 SDMA_GCR_GLM_WB) << 16);
+	amdgpu_ring_write(ring, 0xffffff80);
+	amdgpu_ring_write(ring, 0xffff);
+
 	/* An IB packet must end on a 8 DW boundary--the next dword
 	 * must be on a 8-dword boundary. Our IB packet below is 6
 	 * dwords long, thus add x number of NOPs, such that, in
@@ -1590,7 +1602,7 @@ static const struct amdgpu_ring_funcs sd
 		SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 +
 		SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 6 * 2 +
 		10 + 10 + 10, /* sdma_v5_0_ring_emit_fence x3 for user fence, vm fence */
-	.emit_ib_size = 7 + 6, /* sdma_v5_0_ring_emit_ib */
+	.emit_ib_size = 5 + 7 + 6, /* sdma_v5_0_ring_emit_ib */
 	.emit_ib = sdma_v5_0_ring_emit_ib,
 	.emit_fence = sdma_v5_0_ring_emit_fence,
 	.emit_pipeline_sync = sdma_v5_0_ring_emit_pipeline_sync,
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c linux-libre-5.6.11-gnu/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c	2020-05-03 02:42:36.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c	2020-05-06 06:18:27.000000000 -0400
@@ -3212,7 +3212,8 @@ fill_plane_dcc_attributes(struct amdgpu_
 			  const union dc_tiling_info *tiling_info,
 			  const uint64_t info,
 			  struct dc_plane_dcc_param *dcc,
-			  struct dc_plane_address *address)
+			  struct dc_plane_address *address,
+			  bool force_disable_dcc)
 {
 	struct dc *dc = adev->dm.dc;
 	struct dc_dcc_surface_param input;
@@ -3224,6 +3225,9 @@ fill_plane_dcc_attributes(struct amdgpu_
 	memset(&input, 0, sizeof(input));
 	memset(&output, 0, sizeof(output));
 
+	if (force_disable_dcc)
+		return 0;
+
 	if (!offset)
 		return 0;
 
@@ -3273,7 +3277,8 @@ fill_plane_buffer_attributes(struct amdg
 			     union dc_tiling_info *tiling_info,
 			     struct plane_size *plane_size,
 			     struct dc_plane_dcc_param *dcc,
-			     struct dc_plane_address *address)
+			     struct dc_plane_address *address,
+			     bool force_disable_dcc)
 {
 	const struct drm_framebuffer *fb = &afb->base;
 	int ret;
@@ -3379,7 +3384,8 @@ fill_plane_buffer_attributes(struct amdg
 
 		ret = fill_plane_dcc_attributes(adev, afb, format, rotation,
 						plane_size, tiling_info,
-						tiling_flags, dcc, address);
+						tiling_flags, dcc, address,
+						force_disable_dcc);
 		if (ret)
 			return ret;
 	}
@@ -3471,7 +3477,8 @@ fill_dc_plane_info_and_addr(struct amdgp
 			    const struct drm_plane_state *plane_state,
 			    const uint64_t tiling_flags,
 			    struct dc_plane_info *plane_info,
-			    struct dc_plane_address *address)
+			    struct dc_plane_address *address,
+			    bool force_disable_dcc)
 {
 	const struct drm_framebuffer *fb = plane_state->fb;
 	const struct amdgpu_framebuffer *afb =
@@ -3550,7 +3557,8 @@ fill_dc_plane_info_and_addr(struct amdgp
 					   plane_info->rotation, tiling_flags,
 					   &plane_info->tiling_info,
 					   &plane_info->plane_size,
-					   &plane_info->dcc, address);
+					   &plane_info->dcc, address,
+					   force_disable_dcc);
 	if (ret)
 		return ret;
 
@@ -3573,6 +3581,7 @@ static int fill_dc_plane_attributes(stru
 	struct dc_plane_info plane_info;
 	uint64_t tiling_flags;
 	int ret;
+	bool force_disable_dcc = false;
 
 	ret = fill_dc_scaling_info(plane_state, &scaling_info);
 	if (ret)
@@ -3587,9 +3596,11 @@ static int fill_dc_plane_attributes(stru
 	if (ret)
 		return ret;
 
+	force_disable_dcc = adev->asic_type == CHIP_RAVEN && adev->in_suspend;
 	ret = fill_dc_plane_info_and_addr(adev, plane_state, tiling_flags,
 					  &plane_info,
-					  &dc_plane_state->address);
+					  &dc_plane_state->address,
+					  force_disable_dcc);
 	if (ret)
 		return ret;
 
@@ -5171,6 +5182,7 @@ static int dm_plane_helper_prepare_fb(st
 	uint64_t tiling_flags;
 	uint32_t domain;
 	int r;
+	bool force_disable_dcc = false;
 
 	dm_plane_state_old = to_dm_plane_state(plane->state);
 	dm_plane_state_new = to_dm_plane_state(new_state);
@@ -5229,11 +5241,13 @@ static int dm_plane_helper_prepare_fb(st
 			dm_plane_state_old->dc_state != dm_plane_state_new->dc_state) {
 		struct dc_plane_state *plane_state = dm_plane_state_new->dc_state;
 
+		force_disable_dcc = adev->asic_type == CHIP_RAVEN && adev->in_suspend;
 		fill_plane_buffer_attributes(
 			adev, afb, plane_state->format, plane_state->rotation,
 			tiling_flags, &plane_state->tiling_info,
 			&plane_state->plane_size, &plane_state->dcc,
-			&plane_state->address);
+			&plane_state->address,
+			force_disable_dcc);
 	}
 
 	return 0;
@@ -6514,7 +6528,12 @@ static void amdgpu_dm_commit_planes(stru
 		fill_dc_plane_info_and_addr(
 			dm->adev, new_plane_state, tiling_flags,
 			&bundle->plane_infos[planes_count],
-			&bundle->flip_addrs[planes_count].address);
+			&bundle->flip_addrs[planes_count].address,
+			false);
+
+		DRM_DEBUG_DRIVER("plane: id=%d dcc_en=%d\n",
+				 new_plane_state->plane->index,
+				 bundle->plane_infos[planes_count].dcc.enable);
 
 		bundle->surface_updates[planes_count].plane_info =
 			&bundle->plane_infos[planes_count];
@@ -7935,7 +7954,8 @@ dm_determine_update_type_for_commit(stru
 				ret = fill_dc_plane_info_and_addr(
 					dm->adev, new_plane_state, tiling_flags,
 					plane_info,
-					&flip_addr->address);
+					&flip_addr->address,
+					false);
 				if (ret)
 					goto cleanup;
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/drm_edid.c linux-libre-5.6.11-gnu/drivers/gpu/drm/drm_edid.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/drm_edid.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/drm_edid.c	2020-05-06 02:16:50.000000000 -0400
@@ -5009,7 +5009,7 @@ static struct drm_display_mode *drm_mode
 	struct drm_display_mode *mode;
 	unsigned pixel_clock = (timings->pixel_clock[0] |
 				(timings->pixel_clock[1] << 8) |
-				(timings->pixel_clock[2] << 16));
+				(timings->pixel_clock[2] << 16)) + 1;
 	unsigned hactive = (timings->hactive[0] | timings->hactive[1] << 8) + 1;
 	unsigned hblank = (timings->hblank[0] | timings->hblank[1] << 8) + 1;
 	unsigned hsync = (timings->hsync[0] | (timings->hsync[1] & 0x7f) << 8) + 1;
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/i915/gem/i915_gem_tiling.c linux-libre-5.6.11-gnu/drivers/gpu/drm/i915/gem/i915_gem_tiling.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/i915/gem/i915_gem_tiling.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/i915/gem/i915_gem_tiling.c	2020-05-06 02:16:50.000000000 -0400
@@ -183,21 +183,35 @@ i915_gem_object_fence_prepare(struct drm
 			      int tiling_mode, unsigned int stride)
 {
 	struct i915_ggtt *ggtt = &to_i915(obj->base.dev)->ggtt;
-	struct i915_vma *vma;
+	struct i915_vma *vma, *vn;
+	LIST_HEAD(unbind);
 	int ret = 0;
 
 	if (tiling_mode == I915_TILING_NONE)
 		return 0;
 
 	mutex_lock(&ggtt->vm.mutex);
+
+	spin_lock(&obj->vma.lock);
 	for_each_ggtt_vma(vma, obj) {
+		GEM_BUG_ON(vma->vm != &ggtt->vm);
+
 		if (i915_vma_fence_prepare(vma, tiling_mode, stride))
 			continue;
 
+		list_move(&vma->vm_link, &unbind);
+	}
+	spin_unlock(&obj->vma.lock);
+
+	list_for_each_entry_safe(vma, vn, &unbind, vm_link) {
 		ret = __i915_vma_unbind(vma);
-		if (ret)
+		if (ret) {
+			/* Restore the remaining vma on an error */
+			list_splice(&unbind, &ggtt->vm.bound_list);
 			break;
+		}
 	}
+
 	mutex_unlock(&ggtt->vm.mutex);
 
 	return ret;
@@ -269,6 +283,7 @@ i915_gem_object_set_tiling(struct drm_i9
 	}
 	mutex_unlock(&obj->mm.lock);
 
+	spin_lock(&obj->vma.lock);
 	for_each_ggtt_vma(vma, obj) {
 		vma->fence_size =
 			i915_gem_fence_size(i915, vma->size, tiling, stride);
@@ -279,6 +294,7 @@ i915_gem_object_set_tiling(struct drm_i9
 		if (vma->fence)
 			vma->fence->dirty = true;
 	}
+	spin_unlock(&obj->vma.lock);
 
 	obj->tiling_and_stride = tiling | stride;
 	i915_gem_object_unlock(obj);
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/i915/gem/selftests/huge_pages.c linux-libre-5.6.11-gnu/drivers/gpu/drm/i915/gem/selftests/huge_pages.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/i915/gem/selftests/huge_pages.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/i915/gem/selftests/huge_pages.c	2020-05-06 02:16:50.000000000 -0400
@@ -1578,8 +1578,10 @@ static int igt_ppgtt_pin_update(void *ar
 		unsigned int page_size = BIT(first);
 
 		obj = i915_gem_object_create_internal(dev_priv, page_size);
-		if (IS_ERR(obj))
-			return PTR_ERR(obj);
+		if (IS_ERR(obj)) {
+			err = PTR_ERR(obj);
+			goto out_vm;
+		}
 
 		vma = i915_vma_instance(obj, vm, NULL);
 		if (IS_ERR(vma)) {
@@ -1632,8 +1634,10 @@ static int igt_ppgtt_pin_update(void *ar
 	}
 
 	obj = i915_gem_object_create_internal(dev_priv, PAGE_SIZE);
-	if (IS_ERR(obj))
-		return PTR_ERR(obj);
+	if (IS_ERR(obj)) {
+		err = PTR_ERR(obj);
+		goto out_vm;
+	}
 
 	vma = i915_vma_instance(obj, vm, NULL);
 	if (IS_ERR(vma)) {
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/i915/gt/intel_timeline.c linux-libre-5.6.11-gnu/drivers/gpu/drm/i915/gt/intel_timeline.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/i915/gt/intel_timeline.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/i915/gt/intel_timeline.c	2020-05-06 02:16:50.000000000 -0400
@@ -519,6 +519,8 @@ int intel_timeline_read_hwsp(struct i915
 
 	rcu_read_lock();
 	cl = rcu_dereference(from->hwsp_cacheline);
+	if (i915_request_completed(from)) /* confirm cacheline is valid */
+		goto unlock;
 	if (unlikely(!i915_active_acquire_if_busy(&cl->active)))
 		goto unlock; /* seqno wrapped and completed! */
 	if (unlikely(i915_request_completed(from)))
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/i915/i915_irq.c linux-libre-5.6.11-gnu/drivers/gpu/drm/i915/i915_irq.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/i915/i915_irq.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/i915/i915_irq.c	2020-05-06 02:16:50.000000000 -0400
@@ -3321,7 +3321,8 @@ static void gen8_de_irq_postinstall(stru
 {
 	struct intel_uncore *uncore = &dev_priv->uncore;
 
-	u32 de_pipe_masked = GEN8_PIPE_CDCLK_CRC_DONE;
+	u32 de_pipe_masked = gen8_de_pipe_fault_mask(dev_priv) |
+		GEN8_PIPE_CDCLK_CRC_DONE;
 	u32 de_pipe_enables;
 	u32 de_port_masked = GEN8_AUX_CHANNEL_A;
 	u32 de_port_enables;
@@ -3332,13 +3333,10 @@ static void gen8_de_irq_postinstall(stru
 		de_misc_masked |= GEN8_DE_MISC_GSE;
 
 	if (INTEL_GEN(dev_priv) >= 9) {
-		de_pipe_masked |= GEN9_DE_PIPE_IRQ_FAULT_ERRORS;
 		de_port_masked |= GEN9_AUX_CHANNEL_B | GEN9_AUX_CHANNEL_C |
 				  GEN9_AUX_CHANNEL_D;
 		if (IS_GEN9_LP(dev_priv))
 			de_port_masked |= BXT_DE_PORT_GMBUS;
-	} else {
-		de_pipe_masked |= GEN8_DE_PIPE_IRQ_FAULT_ERRORS;
 	}
 
 	if (INTEL_GEN(dev_priv) >= 11)
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/i915/i915_vma.c linux-libre-5.6.11-gnu/drivers/gpu/drm/i915/i915_vma.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/i915/i915_vma.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/i915/i915_vma.c	2020-05-06 02:16:50.000000000 -0400
@@ -158,16 +158,18 @@ vma_create(struct drm_i915_gem_object *o
 
 	GEM_BUG_ON(!IS_ALIGNED(vma->size, I915_GTT_PAGE_SIZE));
 
+	spin_lock(&obj->vma.lock);
+
 	if (i915_is_ggtt(vm)) {
 		if (unlikely(overflows_type(vma->size, u32)))
-			goto err_vma;
+			goto err_unlock;
 
 		vma->fence_size = i915_gem_fence_size(vm->i915, vma->size,
 						      i915_gem_object_get_tiling(obj),
 						      i915_gem_object_get_stride(obj));
 		if (unlikely(vma->fence_size < vma->size || /* overflow */
 			     vma->fence_size > vm->total))
-			goto err_vma;
+			goto err_unlock;
 
 		GEM_BUG_ON(!IS_ALIGNED(vma->fence_size, I915_GTT_MIN_ALIGNMENT));
 
@@ -179,8 +181,6 @@ vma_create(struct drm_i915_gem_object *o
 		__set_bit(I915_VMA_GGTT_BIT, __i915_vma_flags(vma));
 	}
 
-	spin_lock(&obj->vma.lock);
-
 	rb = NULL;
 	p = &obj->vma.tree.rb_node;
 	while (*p) {
@@ -225,6 +225,8 @@ vma_create(struct drm_i915_gem_object *o
 
 	return vma;
 
+err_unlock:
+	spin_unlock(&obj->vma.lock);
 err_vma:
 	i915_vma_free(vma);
 	return ERR_PTR(-E2BIG);
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/qxl/qxl_cmd.c linux-libre-5.6.11-gnu/drivers/gpu/drm/qxl/qxl_cmd.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/qxl/qxl_cmd.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/qxl/qxl_cmd.c	2020-05-06 02:16:50.000000000 -0400
@@ -480,9 +480,10 @@ int qxl_hw_surface_alloc(struct qxl_devi
 		return ret;
 
 	ret = qxl_release_reserve_list(release, true);
-	if (ret)
+	if (ret) {
+		qxl_release_free(qdev, release);
 		return ret;
-
+	}
 	cmd = (struct qxl_surface_cmd *)qxl_release_map(qdev, release);
 	cmd->type = QXL_SURFACE_CMD_CREATE;
 	cmd->flags = QXL_SURF_FLAG_KEEP_DATA;
@@ -499,8 +500,8 @@ int qxl_hw_surface_alloc(struct qxl_devi
 	/* no need to add a release to the fence for this surface bo,
 	   since it is only released when we ask to destroy the surface
 	   and it would never signal otherwise */
-	qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
 	qxl_release_fence_buffer_objects(release);
+	qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
 
 	surf->hw_surf_alloc = true;
 	spin_lock(&qdev->surf_id_idr_lock);
@@ -542,9 +543,8 @@ int qxl_hw_surface_dealloc(struct qxl_de
 	cmd->surface_id = id;
 	qxl_release_unmap(qdev, release, &cmd->release_info);
 
-	qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
-
 	qxl_release_fence_buffer_objects(release);
+	qxl_push_command_ring_release(qdev, release, QXL_CMD_SURFACE, false);
 
 	return 0;
 }
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/qxl/qxl_display.c linux-libre-5.6.11-gnu/drivers/gpu/drm/qxl/qxl_display.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/qxl/qxl_display.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/qxl/qxl_display.c	2020-05-06 02:16:50.000000000 -0400
@@ -523,8 +523,8 @@ static int qxl_primary_apply_cursor(stru
 	cmd->u.set.visible = 1;
 	qxl_release_unmap(qdev, release, &cmd->release_info);
 
-	qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
 	qxl_release_fence_buffer_objects(release);
+	qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
 
 	return ret;
 
@@ -665,8 +665,8 @@ static void qxl_cursor_atomic_update(str
 	cmd->u.position.y = plane->state->crtc_y + fb->hot_y;
 
 	qxl_release_unmap(qdev, release, &cmd->release_info);
-	qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
 	qxl_release_fence_buffer_objects(release);
+	qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
 
 	if (old_cursor_bo != NULL)
 		qxl_bo_unpin(old_cursor_bo);
@@ -713,8 +713,8 @@ static void qxl_cursor_atomic_disable(st
 	cmd->type = QXL_CURSOR_HIDE;
 	qxl_release_unmap(qdev, release, &cmd->release_info);
 
-	qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
 	qxl_release_fence_buffer_objects(release);
+	qxl_push_cursor_ring_release(qdev, release, QXL_CMD_CURSOR, false);
 }
 
 static void qxl_update_dumb_head(struct qxl_device *qdev,
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/qxl/qxl_draw.c linux-libre-5.6.11-gnu/drivers/gpu/drm/qxl/qxl_draw.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/qxl/qxl_draw.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/qxl/qxl_draw.c	2020-05-06 02:16:50.000000000 -0400
@@ -209,9 +209,10 @@ void qxl_draw_dirty_fb(struct qxl_device
 		goto out_release_backoff;
 
 	rects = drawable_set_clipping(qdev, num_clips, clips_bo);
-	if (!rects)
+	if (!rects) {
+		ret = -EINVAL;
 		goto out_release_backoff;
-
+	}
 	drawable = (struct qxl_drawable *)qxl_release_map(qdev, release);
 
 	drawable->clip.type = SPICE_CLIP_TYPE_RECTS;
@@ -242,8 +243,8 @@ void qxl_draw_dirty_fb(struct qxl_device
 	}
 	qxl_bo_kunmap(clips_bo);
 
-	qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false);
 	qxl_release_fence_buffer_objects(release);
+	qxl_push_command_ring_release(qdev, release, QXL_CMD_DRAW, false);
 
 out_release_backoff:
 	if (ret)
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/qxl/qxl_ioctl.c linux-libre-5.6.11-gnu/drivers/gpu/drm/qxl/qxl_ioctl.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/qxl/qxl_ioctl.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/qxl/qxl_ioctl.c	2020-05-06 02:16:50.000000000 -0400
@@ -261,11 +261,8 @@ static int qxl_process_single_command(st
 			apply_surf_reloc(qdev, &reloc_info[i]);
 	}
 
+	qxl_release_fence_buffer_objects(release);
 	ret = qxl_push_command_ring_release(qdev, release, cmd->type, true);
-	if (ret)
-		qxl_release_backoff_reserve_list(release);
-	else
-		qxl_release_fence_buffer_objects(release);
 
 out_free_bos:
 out_free_release:
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/gpu/drm/scheduler/sched_main.c linux-libre-5.6.11-gnu/drivers/gpu/drm/scheduler/sched_main.c
--- linux-libre-5.6.10-gnu/drivers/gpu/drm/scheduler/sched_main.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/gpu/drm/scheduler/sched_main.c	2020-05-06 02:16:50.000000000 -0400
@@ -687,7 +687,7 @@ drm_sched_get_cleanup_job(struct drm_gpu
 	 */
 	if ((sched->timeout != MAX_SCHEDULE_TIMEOUT &&
 	    !cancel_delayed_work(&sched->work_tdr)) ||
-	    __kthread_should_park(sched->thread))
+	    kthread_should_park())
 		return NULL;
 
 	spin_lock_irqsave(&sched->job_list_lock, flags);
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/hv/vmbus_drv.c linux-libre-5.6.11-gnu/drivers/hv/vmbus_drv.c
--- linux-libre-5.6.10-gnu/drivers/hv/vmbus_drv.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/hv/vmbus_drv.c	2020-05-06 02:16:50.000000000 -0400
@@ -978,6 +978,9 @@ static int vmbus_resume(struct device *c
 
 	return drv->resume(dev);
 }
+#else
+#define vmbus_suspend NULL
+#define vmbus_resume NULL
 #endif /* CONFIG_PM_SLEEP */
 
 /*
@@ -997,11 +1000,22 @@ static void vmbus_device_release(struct
 }
 
 /*
- * Note: we must use SET_NOIRQ_SYSTEM_SLEEP_PM_OPS rather than
- * SET_SYSTEM_SLEEP_PM_OPS: see the comment before vmbus_bus_pm.
+ * Note: we must use the "noirq" ops: see the comment before vmbus_bus_pm.
+ *
+ * suspend_noirq/resume_noirq are set to NULL to support Suspend-to-Idle: we
+ * shouldn't suspend the vmbus devices upon Suspend-to-Idle, otherwise there
+ * is no way to wake up a Generation-2 VM.
+ *
+ * The other 4 ops are for hibernation.
  */
+
 static const struct dev_pm_ops vmbus_pm = {
-	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(vmbus_suspend, vmbus_resume)
+	.suspend_noirq	= NULL,
+	.resume_noirq	= NULL,
+	.freeze_noirq	= vmbus_suspend,
+	.thaw_noirq	= vmbus_resume,
+	.poweroff_noirq	= vmbus_suspend,
+	.restore_noirq	= vmbus_resume,
 };
 
 /* The one and only one */
@@ -2281,6 +2295,9 @@ static int vmbus_bus_resume(struct devic
 
 	return 0;
 }
+#else
+#define vmbus_bus_suspend NULL
+#define vmbus_bus_resume NULL
 #endif /* CONFIG_PM_SLEEP */
 
 static const struct acpi_device_id vmbus_acpi_device_ids[] = {
@@ -2291,16 +2308,24 @@ static const struct acpi_device_id vmbus
 MODULE_DEVICE_TABLE(acpi, vmbus_acpi_device_ids);
 
 /*
- * Note: we must use SET_NOIRQ_SYSTEM_SLEEP_PM_OPS rather than
- * SET_SYSTEM_SLEEP_PM_OPS, otherwise NIC SR-IOV can not work, because the
- * "pci_dev_pm_ops" uses the "noirq" callbacks: in the resume path, the
- * pci "noirq" restore callback runs before "non-noirq" callbacks (see
+ * Note: we must use the "no_irq" ops, otherwise hibernation can not work with
+ * PCI device assignment, because "pci_dev_pm_ops" uses the "noirq" ops: in
+ * the resume path, the pci "noirq" restore op runs before "non-noirq" op (see
  * resume_target_kernel() -> dpm_resume_start(), and hibernation_restore() ->
  * dpm_resume_end()). This means vmbus_bus_resume() and the pci-hyperv's
- * resume callback must also run via the "noirq" callbacks.
+ * resume callback must also run via the "noirq" ops.
+ *
+ * Set suspend_noirq/resume_noirq to NULL for Suspend-to-Idle: see the comment
+ * earlier in this file before vmbus_pm.
  */
+
 static const struct dev_pm_ops vmbus_bus_pm = {
-	SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(vmbus_bus_suspend, vmbus_bus_resume)
+	.suspend_noirq	= NULL,
+	.resume_noirq	= NULL,
+	.freeze_noirq	= vmbus_bus_suspend,
+	.thaw_noirq	= vmbus_bus_resume,
+	.poweroff_noirq	= vmbus_bus_suspend,
+	.restore_noirq	= vmbus_bus_resume
 };
 
 static struct acpi_driver vmbus_acpi_driver = {
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/i2c/busses/i2c-amd-mp2-pci.c linux-libre-5.6.11-gnu/drivers/i2c/busses/i2c-amd-mp2-pci.c
--- linux-libre-5.6.10-gnu/drivers/i2c/busses/i2c-amd-mp2-pci.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/i2c/busses/i2c-amd-mp2-pci.c	2020-05-06 02:16:50.000000000 -0400
@@ -349,12 +349,12 @@ static int amd_mp2_pci_probe(struct pci_
 	if (!privdata)
 		return -ENOMEM;
 
+	privdata->pci_dev = pci_dev;
 	rc = amd_mp2_pci_init(privdata, pci_dev);
 	if (rc)
 		return rc;
 
 	mutex_init(&privdata->c2p_lock);
-	privdata->pci_dev = pci_dev;
 
 	pm_runtime_set_autosuspend_delay(&pci_dev->dev, 1000);
 	pm_runtime_use_autosuspend(&pci_dev->dev);
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/i2c/busses/i2c-aspeed.c linux-libre-5.6.11-gnu/drivers/i2c/busses/i2c-aspeed.c
--- linux-libre-5.6.10-gnu/drivers/i2c/busses/i2c-aspeed.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/i2c/busses/i2c-aspeed.c	2020-05-06 02:16:50.000000000 -0400
@@ -603,6 +603,7 @@ static irqreturn_t aspeed_i2c_bus_irq(in
 	/* Ack all interrupts except for Rx done */
 	writel(irq_received & ~ASPEED_I2CD_INTR_RX_DONE,
 	       bus->base + ASPEED_I2C_INTR_STS_REG);
+	readl(bus->base + ASPEED_I2C_INTR_STS_REG);
 	irq_remaining = irq_received;
 
 #if IS_ENABLED(CONFIG_I2C_SLAVE)
@@ -645,9 +646,11 @@ static irqreturn_t aspeed_i2c_bus_irq(in
 			irq_received, irq_handled);
 
 	/* Ack Rx done */
-	if (irq_received & ASPEED_I2CD_INTR_RX_DONE)
+	if (irq_received & ASPEED_I2CD_INTR_RX_DONE) {
 		writel(ASPEED_I2CD_INTR_RX_DONE,
 		       bus->base + ASPEED_I2C_INTR_STS_REG);
+		readl(bus->base + ASPEED_I2C_INTR_STS_REG);
+	}
 	spin_unlock(&bus->lock);
 	return irq_remaining ? IRQ_NONE : IRQ_HANDLED;
 }
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/i2c/busses/i2c-bcm-iproc.c linux-libre-5.6.11-gnu/drivers/i2c/busses/i2c-bcm-iproc.c
--- linux-libre-5.6.10-gnu/drivers/i2c/busses/i2c-bcm-iproc.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/i2c/busses/i2c-bcm-iproc.c	2020-05-06 02:16:50.000000000 -0400
@@ -360,6 +360,9 @@ static bool bcm_iproc_i2c_slave_isr(stru
 			value = (u8)((val >> S_RX_DATA_SHIFT) & S_RX_DATA_MASK);
 			i2c_slave_event(iproc_i2c->slave,
 					I2C_SLAVE_WRITE_RECEIVED, &value);
+			if (rx_status == I2C_SLAVE_RX_END)
+				i2c_slave_event(iproc_i2c->slave,
+						I2C_SLAVE_STOP, &value);
 		}
 	} else if (status & BIT(IS_S_TX_UNDERRUN_SHIFT)) {
 		/* Master read other than start */
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/infiniband/core/cm.c linux-libre-5.6.11-gnu/drivers/infiniband/core/cm.c
--- linux-libre-5.6.10-gnu/drivers/infiniband/core/cm.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/infiniband/core/cm.c	2020-05-06 02:16:50.000000000 -0400
@@ -572,18 +572,6 @@ static int cm_init_av_by_path(struct sa_
 	return 0;
 }
 
-static int cm_alloc_id(struct cm_id_private *cm_id_priv)
-{
-	int err;
-	u32 id;
-
-	err = xa_alloc_cyclic_irq(&cm.local_id_table, &id, cm_id_priv,
-			xa_limit_32b, &cm.local_id_next, GFP_KERNEL);
-
-	cm_id_priv->id.local_id = (__force __be32)id ^ cm.random_id_operand;
-	return err;
-}
-
 static u32 cm_local_id(__be32 local_id)
 {
 	return (__force u32) (local_id ^ cm.random_id_operand);
@@ -825,6 +813,7 @@ struct ib_cm_id *ib_create_cm_id(struct
 				 void *context)
 {
 	struct cm_id_private *cm_id_priv;
+	u32 id;
 	int ret;
 
 	cm_id_priv = kzalloc(sizeof *cm_id_priv, GFP_KERNEL);
@@ -836,9 +825,6 @@ struct ib_cm_id *ib_create_cm_id(struct
 	cm_id_priv->id.cm_handler = cm_handler;
 	cm_id_priv->id.context = context;
 	cm_id_priv->id.remote_cm_qpn = 1;
-	ret = cm_alloc_id(cm_id_priv);
-	if (ret)
-		goto error;
 
 	spin_lock_init(&cm_id_priv->lock);
 	init_completion(&cm_id_priv->comp);
@@ -847,11 +833,20 @@ struct ib_cm_id *ib_create_cm_id(struct
 	INIT_LIST_HEAD(&cm_id_priv->altr_list);
 	atomic_set(&cm_id_priv->work_count, -1);
 	refcount_set(&cm_id_priv->refcount, 1);
+
+	ret = xa_alloc_cyclic_irq(&cm.local_id_table, &id, NULL, xa_limit_32b,
+				  &cm.local_id_next, GFP_KERNEL);
+	if (ret < 0)
+		goto error;
+	cm_id_priv->id.local_id = (__force __be32)id ^ cm.random_id_operand;
+	xa_store_irq(&cm.local_id_table, cm_local_id(cm_id_priv->id.local_id),
+		     cm_id_priv, GFP_KERNEL);
+
 	return &cm_id_priv->id;
 
 error:
 	kfree(cm_id_priv);
-	return ERR_PTR(-ENOMEM);
+	return ERR_PTR(ret);
 }
 EXPORT_SYMBOL(ib_create_cm_id);
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/infiniband/core/rdma_core.c linux-libre-5.6.11-gnu/drivers/infiniband/core/rdma_core.c
--- linux-libre-5.6.10-gnu/drivers/infiniband/core/rdma_core.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/infiniband/core/rdma_core.c	2020-05-06 02:16:50.000000000 -0400
@@ -360,7 +360,7 @@ lookup_get_fd_uobject(const struct uverb
 	 * uverbs_uobject_fd_release(), and the caller is expected to ensure
 	 * that release is never done while a call to lookup is possible.
 	 */
-	if (f->f_op != fd_type->fops) {
+	if (f->f_op != fd_type->fops || uobject->ufile != ufile) {
 		fput(f);
 		return ERR_PTR(-EBADF);
 	}
@@ -474,16 +474,15 @@ alloc_begin_fd_uobject(const struct uver
 	filp = anon_inode_getfile(fd_type->name, fd_type->fops, NULL,
 				  fd_type->flags);
 	if (IS_ERR(filp)) {
+		uverbs_uobject_put(uobj);
 		uobj = ERR_CAST(filp);
-		goto err_uobj;
+		goto err_fd;
 	}
 	uobj->object = filp;
 
 	uobj->id = new_fd;
 	return uobj;
 
-err_uobj:
-	uverbs_uobject_put(uobj);
 err_fd:
 	put_unused_fd(new_fd);
 	return uobj;
@@ -679,7 +678,6 @@ void rdma_lookup_put_uobject(struct ib_u
 			     enum rdma_lookup_mode mode)
 {
 	assert_uverbs_usecnt(uobj, mode);
-	uobj->uapi_object->type_class->lookup_put(uobj, mode);
 	/*
 	 * In order to unlock an object, either decrease its usecnt for
 	 * read access or zero it in case of exclusive access. See
@@ -696,6 +694,7 @@ void rdma_lookup_put_uobject(struct ib_u
 		break;
 	}
 
+	uobj->uapi_object->type_class->lookup_put(uobj, mode);
 	/* Pairs with the kref obtained by type->lookup_get */
 	uverbs_uobject_put(uobj);
 }
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/infiniband/core/uverbs_main.c linux-libre-5.6.11-gnu/drivers/infiniband/core/uverbs_main.c
--- linux-libre-5.6.10-gnu/drivers/infiniband/core/uverbs_main.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/infiniband/core/uverbs_main.c	2020-05-06 02:16:50.000000000 -0400
@@ -820,6 +820,10 @@ void uverbs_user_mmap_disassociate(struc
 			ret = mmget_not_zero(mm);
 			if (!ret) {
 				list_del_init(&priv->list);
+				if (priv->entry) {
+					rdma_user_mmap_entry_put(priv->entry);
+					priv->entry = NULL;
+				}
 				mm = NULL;
 				continue;
 			}
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/infiniband/hw/mlx4/main.c linux-libre-5.6.11-gnu/drivers/infiniband/hw/mlx4/main.c
--- linux-libre-5.6.10-gnu/drivers/infiniband/hw/mlx4/main.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/infiniband/hw/mlx4/main.c	2020-05-06 02:16:50.000000000 -0400
@@ -1502,8 +1502,9 @@ static int __mlx4_ib_create_default_rule
 	int i;
 
 	for (i = 0; i < ARRAY_SIZE(pdefault_rules->rules_create_list); i++) {
+		union ib_flow_spec ib_spec = {};
 		int ret;
-		union ib_flow_spec ib_spec;
+
 		switch (pdefault_rules->rules_create_list[i]) {
 		case 0:
 			/* no rule */
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/infiniband/hw/mlx5/qp.c linux-libre-5.6.11-gnu/drivers/infiniband/hw/mlx5/qp.c
--- linux-libre-5.6.10-gnu/drivers/infiniband/hw/mlx5/qp.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/infiniband/hw/mlx5/qp.c	2020-05-06 02:16:50.000000000 -0400
@@ -5545,7 +5545,9 @@ static void to_rdma_ah_attr(struct mlx5_
 	rdma_ah_set_path_bits(ah_attr, path->grh_mlid & 0x7f);
 	rdma_ah_set_static_rate(ah_attr,
 				path->static_rate ? path->static_rate - 5 : 0);
-	if (path->grh_mlid & (1 << 7)) {
+
+	if (path->grh_mlid & (1 << 7) ||
+	    ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE) {
 		u32 tc_fl = be32_to_cpu(path->tclass_flowlabel);
 
 		rdma_ah_set_grh(ah_attr, NULL,
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/infiniband/sw/rdmavt/cq.c linux-libre-5.6.11-gnu/drivers/infiniband/sw/rdmavt/cq.c
--- linux-libre-5.6.10-gnu/drivers/infiniband/sw/rdmavt/cq.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/infiniband/sw/rdmavt/cq.c	2020-05-06 02:16:50.000000000 -0400
@@ -248,8 +248,8 @@ int rvt_create_cq(struct ib_cq *ibcq, co
 	 */
 	if (udata && udata->outlen >= sizeof(__u64)) {
 		cq->ip = rvt_create_mmap_info(rdi, sz, udata, u_wc);
-		if (!cq->ip) {
-			err = -ENOMEM;
+		if (IS_ERR(cq->ip)) {
+			err = PTR_ERR(cq->ip);
 			goto bail_wc;
 		}
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/infiniband/sw/rdmavt/mmap.c linux-libre-5.6.11-gnu/drivers/infiniband/sw/rdmavt/mmap.c
--- linux-libre-5.6.10-gnu/drivers/infiniband/sw/rdmavt/mmap.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/infiniband/sw/rdmavt/mmap.c	2020-05-06 02:16:50.000000000 -0400
@@ -154,7 +154,7 @@ done:
  * @udata: user data (must be valid!)
  * @obj: opaque pointer to a cq, wq etc
  *
- * Return: rvt_mmap struct on success
+ * Return: rvt_mmap struct on success, ERR_PTR on failure
  */
 struct rvt_mmap_info *rvt_create_mmap_info(struct rvt_dev_info *rdi, u32 size,
 					   struct ib_udata *udata, void *obj)
@@ -166,7 +166,7 @@ struct rvt_mmap_info *rvt_create_mmap_in
 
 	ip = kmalloc_node(sizeof(*ip), GFP_KERNEL, rdi->dparms.node);
 	if (!ip)
-		return ip;
+		return ERR_PTR(-ENOMEM);
 
 	size = PAGE_ALIGN(size);
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/infiniband/sw/rdmavt/qp.c linux-libre-5.6.11-gnu/drivers/infiniband/sw/rdmavt/qp.c
--- linux-libre-5.6.10-gnu/drivers/infiniband/sw/rdmavt/qp.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/infiniband/sw/rdmavt/qp.c	2020-05-06 02:16:50.000000000 -0400
@@ -1244,8 +1244,8 @@ struct ib_qp *rvt_create_qp(struct ib_pd
 
 			qp->ip = rvt_create_mmap_info(rdi, s, udata,
 						      qp->r_rq.wq);
-			if (!qp->ip) {
-				ret = ERR_PTR(-ENOMEM);
+			if (IS_ERR(qp->ip)) {
+				ret = ERR_CAST(qp->ip);
 				goto bail_qpn;
 			}
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/infiniband/sw/rdmavt/srq.c linux-libre-5.6.11-gnu/drivers/infiniband/sw/rdmavt/srq.c
--- linux-libre-5.6.10-gnu/drivers/infiniband/sw/rdmavt/srq.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/infiniband/sw/rdmavt/srq.c	2020-05-06 02:16:50.000000000 -0400
@@ -111,8 +111,8 @@ int rvt_create_srq(struct ib_srq *ibsrq,
 		u32 s = sizeof(struct rvt_rwq) + srq->rq.size * sz;
 
 		srq->ip = rvt_create_mmap_info(dev, s, udata, srq->rq.wq);
-		if (!srq->ip) {
-			ret = -ENOMEM;
+		if (IS_ERR(srq->ip)) {
+			ret = PTR_ERR(srq->ip);
 			goto bail_wq;
 		}
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/infiniband/sw/siw/siw_qp_tx.c linux-libre-5.6.11-gnu/drivers/infiniband/sw/siw/siw_qp_tx.c
--- linux-libre-5.6.10-gnu/drivers/infiniband/sw/siw/siw_qp_tx.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/infiniband/sw/siw/siw_qp_tx.c	2020-05-06 02:16:50.000000000 -0400
@@ -920,20 +920,27 @@ static int siw_fastreg_mr(struct ib_pd *
 {
 	struct ib_mr *base_mr = (struct ib_mr *)(uintptr_t)sqe->base_mr;
 	struct siw_device *sdev = to_siw_dev(pd->device);
-	struct siw_mem *mem = siw_mem_id2obj(sdev, sqe->rkey  >> 8);
+	struct siw_mem *mem;
 	int rv = 0;
 
 	siw_dbg_pd(pd, "STag 0x%08x\n", sqe->rkey);
 
-	if (unlikely(!mem || !base_mr)) {
+	if (unlikely(!base_mr)) {
 		pr_warn("siw: fastreg: STag 0x%08x unknown\n", sqe->rkey);
 		return -EINVAL;
 	}
+
 	if (unlikely(base_mr->rkey >> 8 != sqe->rkey  >> 8)) {
 		pr_warn("siw: fastreg: STag 0x%08x: bad MR\n", sqe->rkey);
-		rv = -EINVAL;
-		goto out;
+		return -EINVAL;
 	}
+
+	mem = siw_mem_id2obj(sdev, sqe->rkey  >> 8);
+	if (unlikely(!mem)) {
+		pr_warn("siw: fastreg: STag 0x%08x unknown\n", sqe->rkey);
+		return -EINVAL;
+	}
+
 	if (unlikely(mem->pd != pd)) {
 		pr_warn("siw: fastreg: PD mismatch\n");
 		rv = -EINVAL;
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/iommu/amd_iommu_init.c linux-libre-5.6.11-gnu/drivers/iommu/amd_iommu_init.c
--- linux-libre-5.6.10-gnu/drivers/iommu/amd_iommu_init.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/iommu/amd_iommu_init.c	2020-05-06 02:16:50.000000000 -0400
@@ -2936,7 +2936,7 @@ static int __init parse_amd_iommu_intr(c
 {
 	for (; *str; ++str) {
 		if (strncmp(str, "legacy", 6) == 0) {
-			amd_iommu_guest_ir = AMD_IOMMU_GUEST_IR_LEGACY;
+			amd_iommu_guest_ir = AMD_IOMMU_GUEST_IR_LEGACY_GA;
 			break;
 		}
 		if (strncmp(str, "vapic", 5) == 0) {
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/iommu/intel-iommu.c linux-libre-5.6.11-gnu/drivers/iommu/intel-iommu.c
--- linux-libre-5.6.10-gnu/drivers/iommu/intel-iommu.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/iommu/intel-iommu.c	2020-05-06 02:16:50.000000000 -0400
@@ -371,11 +371,11 @@ int dmar_disabled = 0;
 int dmar_disabled = 1;
 #endif /* CONFIG_INTEL_IOMMU_DEFAULT_ON */
 
-#ifdef INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON
+#ifdef CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON
 int intel_iommu_sm = 1;
 #else
 int intel_iommu_sm;
-#endif /* INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON */
+#endif /* CONFIG_INTEL_IOMMU_SCALABLE_MODE_DEFAULT_ON */
 
 int intel_iommu_enabled = 0;
 EXPORT_SYMBOL_GPL(intel_iommu_enabled);
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/iommu/iommu.c linux-libre-5.6.11-gnu/drivers/iommu/iommu.c
--- linux-libre-5.6.10-gnu/drivers/iommu/iommu.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/iommu/iommu.c	2020-05-06 02:16:50.000000000 -0400
@@ -1428,7 +1428,7 @@ struct iommu_group *iommu_group_get_for_
 
 	return group;
 }
-EXPORT_SYMBOL(iommu_group_get_for_dev);
+EXPORT_SYMBOL_GPL(iommu_group_get_for_dev);
 
 struct iommu_domain *iommu_group_default_domain(struct iommu_group *group)
 {
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/iommu/qcom_iommu.c linux-libre-5.6.11-gnu/drivers/iommu/qcom_iommu.c
--- linux-libre-5.6.10-gnu/drivers/iommu/qcom_iommu.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/iommu/qcom_iommu.c	2020-05-06 02:16:50.000000000 -0400
@@ -813,8 +813,11 @@ static int qcom_iommu_device_probe(struc
 	qcom_iommu->dev = dev;
 
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	if (res)
+	if (res) {
 		qcom_iommu->local_base = devm_ioremap_resource(dev, res);
+		if (IS_ERR(qcom_iommu->local_base))
+			return PTR_ERR(qcom_iommu->local_base);
+	}
 
 	qcom_iommu->iface_clk = devm_clk_get(dev, "iface");
 	if (IS_ERR(qcom_iommu->iface_clk)) {
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/md/dm-mpath.c linux-libre-5.6.11-gnu/drivers/md/dm-mpath.c
--- linux-libre-5.6.10-gnu/drivers/md/dm-mpath.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/md/dm-mpath.c	2020-05-06 02:16:50.000000000 -0400
@@ -585,10 +585,12 @@ static struct pgpath *__map_bio(struct m
 
 	/* Do we need to select a new pgpath? */
 	pgpath = READ_ONCE(m->current_pgpath);
-	queue_io = test_bit(MPATHF_QUEUE_IO, &m->flags);
-	if (!pgpath || !queue_io)
+	if (!pgpath || !test_bit(MPATHF_QUEUE_IO, &m->flags))
 		pgpath = choose_pgpath(m, bio->bi_iter.bi_size);
 
+	/* MPATHF_QUEUE_IO might have been cleared by choose_pgpath. */
+	queue_io = test_bit(MPATHF_QUEUE_IO, &m->flags);
+
 	if ((pgpath && queue_io) ||
 	    (!pgpath && test_bit(MPATHF_QUEUE_IF_NO_PATH, &m->flags))) {
 		/* Queue for the daemon to resubmit */
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/md/dm-verity-fec.c linux-libre-5.6.11-gnu/drivers/md/dm-verity-fec.c
--- linux-libre-5.6.10-gnu/drivers/md/dm-verity-fec.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/md/dm-verity-fec.c	2020-05-06 02:16:50.000000000 -0400
@@ -435,7 +435,7 @@ int verity_fec_decode(struct dm_verity *
 	fio->level++;
 
 	if (type == DM_VERITY_BLOCK_TYPE_METADATA)
-		block += v->data_blocks;
+		block = block - v->hash_start + v->data_blocks;
 
 	/*
 	 * For RS(M, N), the continuous FEC data is divided into blocks of N
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/md/dm-writecache.c linux-libre-5.6.11-gnu/drivers/md/dm-writecache.c
--- linux-libre-5.6.10-gnu/drivers/md/dm-writecache.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/md/dm-writecache.c	2020-05-06 02:16:50.000000000 -0400
@@ -882,6 +882,24 @@ static int writecache_alloc_entries(stru
 	return 0;
 }
 
+static int writecache_read_metadata(struct dm_writecache *wc, sector_t n_sectors)
+{
+	struct dm_io_region region;
+	struct dm_io_request req;
+
+	region.bdev = wc->ssd_dev->bdev;
+	region.sector = wc->start_sector;
+	region.count = n_sectors;
+	req.bi_op = REQ_OP_READ;
+	req.bi_op_flags = REQ_SYNC;
+	req.mem.type = DM_IO_VMA;
+	req.mem.ptr.vma = (char *)wc->memory_map;
+	req.client = wc->dm_io;
+	req.notify.fn = NULL;
+
+	return dm_io(&req, 1, &region, NULL);
+}
+
 static void writecache_resume(struct dm_target *ti)
 {
 	struct dm_writecache *wc = ti->private;
@@ -892,8 +910,18 @@ static void writecache_resume(struct dm_
 
 	wc_lock(wc);
 
-	if (WC_MODE_PMEM(wc))
+	if (WC_MODE_PMEM(wc)) {
 		persistent_memory_invalidate_cache(wc->memory_map, wc->memory_map_size);
+	} else {
+		r = writecache_read_metadata(wc, wc->metadata_sectors);
+		if (r) {
+			size_t sb_entries_offset;
+			writecache_error(wc, r, "unable to read metadata: %d", r);
+			sb_entries_offset = offsetof(struct wc_memory_superblock, entries);
+			memset((char *)wc->memory_map + sb_entries_offset, -1,
+			       (wc->metadata_sectors << SECTOR_SHIFT) - sb_entries_offset);
+		}
+	}
 
 	wc->tree = RB_ROOT;
 	INIT_LIST_HEAD(&wc->lru);
@@ -2005,6 +2033,12 @@ static int writecache_ctr(struct dm_targ
 		ti->error = "Invalid block size";
 		goto bad;
 	}
+	if (wc->block_size < bdev_logical_block_size(wc->dev->bdev) ||
+	    wc->block_size < bdev_logical_block_size(wc->ssd_dev->bdev)) {
+		r = -EINVAL;
+		ti->error = "Block size is smaller than device logical block size";
+		goto bad;
+	}
 	wc->block_size_bits = __ffs(wc->block_size);
 
 	wc->max_writeback_jobs = MAX_WRITEBACK_JOBS;
@@ -2093,8 +2127,6 @@ invalid_optional:
 			goto bad;
 		}
 	} else {
-		struct dm_io_region region;
-		struct dm_io_request req;
 		size_t n_blocks, n_metadata_blocks;
 		uint64_t n_bitmap_bits;
 
@@ -2151,19 +2183,9 @@ invalid_optional:
 			goto bad;
 		}
 
-		region.bdev = wc->ssd_dev->bdev;
-		region.sector = wc->start_sector;
-		region.count = wc->metadata_sectors;
-		req.bi_op = REQ_OP_READ;
-		req.bi_op_flags = REQ_SYNC;
-		req.mem.type = DM_IO_VMA;
-		req.mem.ptr.vma = (char *)wc->memory_map;
-		req.client = wc->dm_io;
-		req.notify.fn = NULL;
-
-		r = dm_io(&req, 1, &region, NULL);
+		r = writecache_read_metadata(wc, wc->block_size >> SECTOR_SHIFT);
 		if (r) {
-			ti->error = "Unable to read metadata";
+			ti->error = "Unable to read first block of metadata";
 			goto bad;
 		}
 	}
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/mmc/host/cqhci.c linux-libre-5.6.11-gnu/drivers/mmc/host/cqhci.c
--- linux-libre-5.6.10-gnu/drivers/mmc/host/cqhci.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/mmc/host/cqhci.c	2020-05-06 02:16:50.000000000 -0400
@@ -5,6 +5,7 @@
 #include <linux/delay.h>
 #include <linux/highmem.h>
 #include <linux/io.h>
+#include <linux/iopoll.h>
 #include <linux/module.h>
 #include <linux/dma-mapping.h>
 #include <linux/slab.h>
@@ -343,12 +344,16 @@ static int cqhci_enable(struct mmc_host
 /* CQHCI is idle and should halt immediately, so set a small timeout */
 #define CQHCI_OFF_TIMEOUT 100
 
+static u32 cqhci_read_ctl(struct cqhci_host *cq_host)
+{
+	return cqhci_readl(cq_host, CQHCI_CTL);
+}
+
 static void cqhci_off(struct mmc_host *mmc)
 {
 	struct cqhci_host *cq_host = mmc->cqe_private;
-	ktime_t timeout;
-	bool timed_out;
 	u32 reg;
+	int err;
 
 	if (!cq_host->enabled || !mmc->cqe_on || cq_host->recovery_halt)
 		return;
@@ -358,15 +363,9 @@ static void cqhci_off(struct mmc_host *m
 
 	cqhci_writel(cq_host, CQHCI_HALT, CQHCI_CTL);
 
-	timeout = ktime_add_us(ktime_get(), CQHCI_OFF_TIMEOUT);
-	while (1) {
-		timed_out = ktime_compare(ktime_get(), timeout) > 0;
-		reg = cqhci_readl(cq_host, CQHCI_CTL);
-		if ((reg & CQHCI_HALT) || timed_out)
-			break;
-	}
-
-	if (timed_out)
+	err = readx_poll_timeout(cqhci_read_ctl, cq_host, reg,
+				 reg & CQHCI_HALT, 0, CQHCI_OFF_TIMEOUT);
+	if (err < 0)
 		pr_err("%s: cqhci: CQE stuck on\n", mmc_hostname(mmc));
 	else
 		pr_debug("%s: cqhci: CQE off\n", mmc_hostname(mmc));
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/mmc/host/meson-mx-sdio.c linux-libre-5.6.11-gnu/drivers/mmc/host/meson-mx-sdio.c
--- linux-libre-5.6.10-gnu/drivers/mmc/host/meson-mx-sdio.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/mmc/host/meson-mx-sdio.c	2020-05-06 02:16:50.000000000 -0400
@@ -357,14 +357,6 @@ static void meson_mx_mmc_request(struct
 		meson_mx_mmc_start_cmd(mmc, mrq->cmd);
 }
 
-static int meson_mx_mmc_card_busy(struct mmc_host *mmc)
-{
-	struct meson_mx_mmc_host *host = mmc_priv(mmc);
-	u32 irqc = readl(host->base + MESON_MX_SDIO_IRQC);
-
-	return !!(irqc & MESON_MX_SDIO_IRQC_FORCE_DATA_DAT_MASK);
-}
-
 static void meson_mx_mmc_read_response(struct mmc_host *mmc,
 				       struct mmc_command *cmd)
 {
@@ -506,7 +498,6 @@ static void meson_mx_mmc_timeout(struct
 static struct mmc_host_ops meson_mx_mmc_ops = {
 	.request		= meson_mx_mmc_request,
 	.set_ios		= meson_mx_mmc_set_ios,
-	.card_busy		= meson_mx_mmc_card_busy,
 	.get_cd			= mmc_gpio_get_cd,
 	.get_ro			= mmc_gpio_get_ro,
 };
@@ -570,7 +561,7 @@ static int meson_mx_mmc_add_host(struct
 	mmc->f_max = clk_round_rate(host->cfg_div_clk,
 				    clk_get_rate(host->parent_clk));
 
-	mmc->caps |= MMC_CAP_ERASE | MMC_CAP_CMD23;
+	mmc->caps |= MMC_CAP_ERASE | MMC_CAP_CMD23 | MMC_CAP_WAIT_WHILE_BUSY;
 	mmc->ops = &meson_mx_mmc_ops;
 
 	ret = mmc_of_parse(mmc);
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/mmc/host/sdhci-msm.c linux-libre-5.6.11-gnu/drivers/mmc/host/sdhci-msm.c
--- linux-libre-5.6.10-gnu/drivers/mmc/host/sdhci-msm.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/mmc/host/sdhci-msm.c	2020-05-06 02:16:50.000000000 -0400
@@ -2068,6 +2068,8 @@ static int sdhci_msm_probe(struct platfo
 		goto clk_disable;
 	}
 
+	msm_host->mmc->caps |= MMC_CAP_WAIT_WHILE_BUSY | MMC_CAP_NEED_RSP_BUSY;
+
 	pm_runtime_get_noresume(&pdev->dev);
 	pm_runtime_set_active(&pdev->dev);
 	pm_runtime_enable(&pdev->dev);
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/mmc/host/sdhci-pci-core.c linux-libre-5.6.11-gnu/drivers/mmc/host/sdhci-pci-core.c
--- linux-libre-5.6.10-gnu/drivers/mmc/host/sdhci-pci-core.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/mmc/host/sdhci-pci-core.c	2020-05-06 02:16:50.000000000 -0400
@@ -601,6 +601,9 @@ static int intel_select_drive_strength(s
 	struct sdhci_pci_slot *slot = sdhci_priv(host);
 	struct intel_host *intel_host = sdhci_pci_priv(slot);
 
+	if (!(mmc_driver_type_mask(intel_host->drv_strength) & card_drv))
+		return 0;
+
 	return intel_host->drv_strength;
 }
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/mmc/host/sdhci-xenon.c linux-libre-5.6.11-gnu/drivers/mmc/host/sdhci-xenon.c
--- linux-libre-5.6.10-gnu/drivers/mmc/host/sdhci-xenon.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/mmc/host/sdhci-xenon.c	2020-05-06 02:16:50.000000000 -0400
@@ -235,6 +235,16 @@ static void xenon_voltage_switch(struct
 {
 	/* Wait for 5ms after set 1.8V signal enable bit */
 	usleep_range(5000, 5500);
+
+	/*
+	 * For some reason the controller's Host Control2 register reports
+	 * the bit representing 1.8V signaling as 0 when read after it was
+	 * written as 1. Subsequent read reports 1.
+	 *
+	 * Since this may cause some issues, do an empty read of the Host
+	 * Control2 register here to circumvent this.
+	 */
+	sdhci_readw(host, SDHCI_HOST_CONTROL2);
 }
 
 static const struct sdhci_ops sdhci_xenon_ops = {
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/nvme/host/core.c linux-libre-5.6.11-gnu/drivers/nvme/host/core.c
--- linux-libre-5.6.10-gnu/drivers/nvme/host/core.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/nvme/host/core.c	2020-05-06 02:16:50.000000000 -0400
@@ -3580,6 +3580,8 @@ static int nvme_alloc_ns(struct nvme_ctr
 
 	return 0;
  out_put_disk:
+	/* prevent double queue cleanup */
+	ns->disk->queue = NULL;
 	put_disk(ns->disk);
  out_unlink_ns:
 	mutex_lock(&ctrl->subsys->lock);
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/scsi/qla2xxx/qla_os.c linux-libre-5.6.11-gnu/drivers/scsi/qla2xxx/qla_os.c
--- linux-libre-5.6.10-gnu/drivers/scsi/qla2xxx/qla_os.c	2020-05-03 03:07:16.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/scsi/qla2xxx/qla_os.c	2020-05-06 06:42:38.000000000 -0400
@@ -3720,6 +3720,13 @@ qla2x00_remove_one(struct pci_dev *pdev)
 	}
 	qla2x00_wait_for_hba_ready(base_vha);
 
+	/*
+	 * if UNLOADING flag is already set, then continue unload,
+	 * where it was set first.
+	 */
+	if (test_and_set_bit(UNLOADING, &base_vha->dpc_flags))
+		return;
+
 	if (IS_QLA25XX(ha) || IS_QLA2031(ha) || IS_QLA27XX(ha) ||
 	    IS_QLA28XX(ha)) {
 		if (ha->flags.fw_started)
@@ -3738,15 +3745,6 @@ qla2x00_remove_one(struct pci_dev *pdev)
 
 	qla2x00_wait_for_sess_deletion(base_vha);
 
-	/*
-	 * if UNLOAD flag is already set, then continue unload,
-	 * where it was set first.
-	 */
-	if (test_bit(UNLOADING, &base_vha->dpc_flags))
-		return;
-
-	set_bit(UNLOADING, &base_vha->dpc_flags);
-
 	qla_nvme_delete(base_vha);
 
 	dma_free_coherent(&ha->pdev->dev,
@@ -4856,6 +4854,9 @@ qla2x00_alloc_work(struct scsi_qla_host
 	struct qla_work_evt *e;
 	uint8_t bail;
 
+	if (test_bit(UNLOADING, &vha->dpc_flags))
+		return NULL;
+
 	QLA_VHA_MARK_BUSY(vha, bail);
 	if (bail)
 		return NULL;
@@ -6044,13 +6045,6 @@ qla2x00_disable_board_on_pci_error(struc
 	struct pci_dev *pdev = ha->pdev;
 	scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
 
-	/*
-	 * if UNLOAD flag is already set, then continue unload,
-	 * where it was set first.
-	 */
-	if (test_bit(UNLOADING, &base_vha->dpc_flags))
-		return;
-
 	ql_log(ql_log_warn, base_vha, 0x015b,
 	    "Disabling adapter.\n");
 
@@ -6061,9 +6055,14 @@ qla2x00_disable_board_on_pci_error(struc
 		return;
 	}
 
-	qla2x00_wait_for_sess_deletion(base_vha);
+	/*
+	 * if UNLOADING flag is already set, then continue unload,
+	 * where it was set first.
+	 */
+	if (test_and_set_bit(UNLOADING, &base_vha->dpc_flags))
+		return;
 
-	set_bit(UNLOADING, &base_vha->dpc_flags);
+	qla2x00_wait_for_sess_deletion(base_vha);
 
 	qla2x00_delete_all_vps(ha, base_vha);
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/target/target_core_iblock.c linux-libre-5.6.11-gnu/drivers/target/target_core_iblock.c
--- linux-libre-5.6.10-gnu/drivers/target/target_core_iblock.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/target/target_core_iblock.c	2020-05-06 02:16:50.000000000 -0400
@@ -432,7 +432,7 @@ iblock_execute_zero_out(struct block_dev
 				target_to_linux_sector(dev, cmd->t_task_lba),
 				target_to_linux_sector(dev,
 					sbc_get_write_same_sectors(cmd)),
-				GFP_KERNEL, false);
+				GFP_KERNEL, BLKDEV_ZERO_NOUNMAP);
 	if (ret)
 		return TCM_LOGICAL_UNIT_COMMUNICATION_FAILURE;
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/drivers/vfio/vfio_iommu_type1.c linux-libre-5.6.11-gnu/drivers/vfio/vfio_iommu_type1.c
--- linux-libre-5.6.10-gnu/drivers/vfio/vfio_iommu_type1.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/drivers/vfio/vfio_iommu_type1.c	2020-05-06 02:16:50.000000000 -0400
@@ -341,8 +341,8 @@ static int vaddr_get_pfn(struct mm_struc
 	vma = find_vma_intersection(mm, vaddr, vaddr + 1);
 
 	if (vma && vma->vm_flags & VM_PFNMAP) {
-		*pfn = ((vaddr - vma->vm_start) >> PAGE_SHIFT) + vma->vm_pgoff;
-		if (is_invalid_reserved_pfn(*pfn))
+		if (!follow_pfn(vma, vaddr, pfn) &&
+		    is_invalid_reserved_pfn(*pfn))
 			ret = 0;
 	}
 done:
@@ -554,7 +554,7 @@ static int vfio_iommu_type1_pin_pages(vo
 			continue;
 		}
 
-		remote_vaddr = dma->vaddr + iova - dma->iova;
+		remote_vaddr = dma->vaddr + (iova - dma->iova);
 		ret = vfio_pin_page_external(dma, remote_vaddr, &phys_pfn[i],
 					     do_accounting);
 		if (ret)
diff -druNp --no-dereference linux-libre-5.6.10-gnu/fs/btrfs/block-group.c linux-libre-5.6.11-gnu/fs/btrfs/block-group.c
--- linux-libre-5.6.10-gnu/fs/btrfs/block-group.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/fs/btrfs/block-group.c	2020-05-06 02:16:50.000000000 -0400
@@ -916,7 +916,7 @@ int btrfs_remove_block_group(struct btrf
 	path = btrfs_alloc_path();
 	if (!path) {
 		ret = -ENOMEM;
-		goto out;
+		goto out_put_group;
 	}
 
 	/*
@@ -954,7 +954,7 @@ int btrfs_remove_block_group(struct btrf
 		ret = btrfs_orphan_add(trans, BTRFS_I(inode));
 		if (ret) {
 			btrfs_add_delayed_iput(inode);
-			goto out;
+			goto out_put_group;
 		}
 		clear_nlink(inode);
 		/* One for the block groups ref */
@@ -977,13 +977,13 @@ int btrfs_remove_block_group(struct btrf
 
 	ret = btrfs_search_slot(trans, tree_root, &key, path, -1, 1);
 	if (ret < 0)
-		goto out;
+		goto out_put_group;
 	if (ret > 0)
 		btrfs_release_path(path);
 	if (ret == 0) {
 		ret = btrfs_del_item(trans, tree_root, path);
 		if (ret)
-			goto out;
+			goto out_put_group;
 		btrfs_release_path(path);
 	}
 
@@ -1102,9 +1102,9 @@ int btrfs_remove_block_group(struct btrf
 
 	ret = remove_block_group_free_space(trans, block_group);
 	if (ret)
-		goto out;
+		goto out_put_group;
 
-	btrfs_put_block_group(block_group);
+	/* Once for the block groups rbtree */
 	btrfs_put_block_group(block_group);
 
 	ret = btrfs_search_slot(trans, root, &key, path, -1, 1);
@@ -1127,6 +1127,10 @@ int btrfs_remove_block_group(struct btrf
 		/* once for the tree */
 		free_extent_map(em);
 	}
+
+out_put_group:
+	/* Once for the lookup reference */
+	btrfs_put_block_group(block_group);
 out:
 	if (remove_rsv)
 		btrfs_delayed_refs_rsv_release(fs_info, 1);
diff -druNp --no-dereference linux-libre-5.6.10-gnu/fs/btrfs/relocation.c linux-libre-5.6.11-gnu/fs/btrfs/relocation.c
--- linux-libre-5.6.10-gnu/fs/btrfs/relocation.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/fs/btrfs/relocation.c	2020-05-06 02:16:50.000000000 -0400
@@ -4614,6 +4614,7 @@ int btrfs_recover_relocation(struct btrf
 		if (IS_ERR(fs_root)) {
 			err = PTR_ERR(fs_root);
 			list_add_tail(&reloc_root->root_list, &reloc_roots);
+			btrfs_end_transaction(trans);
 			goto out_unset;
 		}
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/fs/btrfs/transaction.c linux-libre-5.6.11-gnu/fs/btrfs/transaction.c
--- linux-libre-5.6.10-gnu/fs/btrfs/transaction.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/fs/btrfs/transaction.c	2020-05-06 02:16:50.000000000 -0400
@@ -660,10 +660,19 @@ again:
 	}
 
 got_it:
-	btrfs_record_root_in_trans(h, root);
-
 	if (!current->journal_info)
 		current->journal_info = h;
+
+	/*
+	 * btrfs_record_root_in_trans() needs to alloc new extents, and may
+	 * call btrfs_join_transaction() while we're also starting a
+	 * transaction.
+	 *
+	 * Thus it need to be called after current->journal_info initialized,
+	 * or we can deadlock.
+	 */
+	btrfs_record_root_in_trans(h, root);
+
 	return h;
 
 join_fail:
diff -druNp --no-dereference linux-libre-5.6.10-gnu/fs/btrfs/tree-log.c linux-libre-5.6.11-gnu/fs/btrfs/tree-log.c
--- linux-libre-5.6.10-gnu/fs/btrfs/tree-log.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/fs/btrfs/tree-log.c	2020-05-06 02:16:50.000000000 -0400
@@ -4211,6 +4211,9 @@ static int btrfs_log_prealloc_extents(st
 	const u64 ino = btrfs_ino(inode);
 	struct btrfs_path *dst_path = NULL;
 	bool dropped_extents = false;
+	u64 truncate_offset = i_size;
+	struct extent_buffer *leaf;
+	int slot;
 	int ins_nr = 0;
 	int start_slot;
 	int ret;
@@ -4225,9 +4228,43 @@ static int btrfs_log_prealloc_extents(st
 	if (ret < 0)
 		goto out;
 
+	/*
+	 * We must check if there is a prealloc extent that starts before the
+	 * i_size and crosses the i_size boundary. This is to ensure later we
+	 * truncate down to the end of that extent and not to the i_size, as
+	 * otherwise we end up losing part of the prealloc extent after a log
+	 * replay and with an implicit hole if there is another prealloc extent
+	 * that starts at an offset beyond i_size.
+	 */
+	ret = btrfs_previous_item(root, path, ino, BTRFS_EXTENT_DATA_KEY);
+	if (ret < 0)
+		goto out;
+
+	if (ret == 0) {
+		struct btrfs_file_extent_item *ei;
+
+		leaf = path->nodes[0];
+		slot = path->slots[0];
+		ei = btrfs_item_ptr(leaf, slot, struct btrfs_file_extent_item);
+
+		if (btrfs_file_extent_type(leaf, ei) ==
+		    BTRFS_FILE_EXTENT_PREALLOC) {
+			u64 extent_end;
+
+			btrfs_item_key_to_cpu(leaf, &key, slot);
+			extent_end = key.offset +
+				btrfs_file_extent_num_bytes(leaf, ei);
+
+			if (extent_end > i_size)
+				truncate_offset = extent_end;
+		}
+	} else {
+		ret = 0;
+	}
+
 	while (true) {
-		struct extent_buffer *leaf = path->nodes[0];
-		int slot = path->slots[0];
+		leaf = path->nodes[0];
+		slot = path->slots[0];
 
 		if (slot >= btrfs_header_nritems(leaf)) {
 			if (ins_nr > 0) {
@@ -4265,7 +4302,7 @@ static int btrfs_log_prealloc_extents(st
 				ret = btrfs_truncate_inode_items(trans,
 							 root->log_root,
 							 &inode->vfs_inode,
-							 i_size,
+							 truncate_offset,
 							 BTRFS_EXTENT_DATA_KEY);
 			} while (ret == -EAGAIN);
 			if (ret)
diff -druNp --no-dereference linux-libre-5.6.10-gnu/fs/io_uring.c linux-libre-5.6.11-gnu/fs/io_uring.c
--- linux-libre-5.6.10-gnu/fs/io_uring.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/fs/io_uring.c	2020-05-06 02:16:50.000000000 -0400
@@ -479,6 +479,7 @@ enum {
 	REQ_F_COMP_LOCKED_BIT,
 	REQ_F_NEED_CLEANUP_BIT,
 	REQ_F_OVERFLOW_BIT,
+	REQ_F_NO_FILE_TABLE_BIT,
 };
 
 enum {
@@ -521,6 +522,8 @@ enum {
 	REQ_F_NEED_CLEANUP	= BIT(REQ_F_NEED_CLEANUP_BIT),
 	/* in overflow list */
 	REQ_F_OVERFLOW		= BIT(REQ_F_OVERFLOW_BIT),
+	/* doesn't need file table for this request */
+	REQ_F_NO_FILE_TABLE	= BIT(REQ_F_NO_FILE_TABLE_BIT),
 };
 
 /*
@@ -711,6 +714,7 @@ static const struct io_op_def io_op_defs
 		.needs_file		= 1,
 		.fd_non_neg		= 1,
 		.needs_fs		= 1,
+		.file_table		= 1,
 	},
 	[IORING_OP_READ] = {
 		.needs_mm		= 1,
@@ -2843,8 +2847,12 @@ static int io_statx(struct io_kiocb *req
 	struct kstat stat;
 	int ret;
 
-	if (force_nonblock)
+	if (force_nonblock) {
+		/* only need file table for an actual valid fd */
+		if (ctx->dfd == -1 || ctx->dfd == AT_FDCWD)
+			req->flags |= REQ_F_NO_FILE_TABLE;
 		return -EAGAIN;
+	}
 
 	if (vfs_stat_set_lookup_flags(&lookup_flags, ctx->how.flags))
 		return -EINVAL;
@@ -4632,7 +4640,7 @@ static int io_grab_files(struct io_kiocb
 	int ret = -EBADF;
 	struct io_ring_ctx *ctx = req->ctx;
 
-	if (req->work.files)
+	if (req->work.files || (req->flags & REQ_F_NO_FILE_TABLE))
 		return 0;
 	if (!ctx->ring_file)
 		return -EBADF;
diff -druNp --no-dereference linux-libre-5.6.10-gnu/fs/nfs/nfs3acl.c linux-libre-5.6.11-gnu/fs/nfs/nfs3acl.c
--- linux-libre-5.6.10-gnu/fs/nfs/nfs3acl.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/fs/nfs/nfs3acl.c	2020-05-06 02:16:50.000000000 -0400
@@ -253,37 +253,45 @@ int nfs3_proc_setacls(struct inode *inod
 
 int nfs3_set_acl(struct inode *inode, struct posix_acl *acl, int type)
 {
-	struct posix_acl *alloc = NULL, *dfacl = NULL;
+	struct posix_acl *orig = acl, *dfacl = NULL, *alloc;
 	int status;
 
 	if (S_ISDIR(inode->i_mode)) {
 		switch(type) {
 		case ACL_TYPE_ACCESS:
-			alloc = dfacl = get_acl(inode, ACL_TYPE_DEFAULT);
+			alloc = get_acl(inode, ACL_TYPE_DEFAULT);
 			if (IS_ERR(alloc))
 				goto fail;
+			dfacl = alloc;
 			break;
 
 		case ACL_TYPE_DEFAULT:
-			dfacl = acl;
-			alloc = acl = get_acl(inode, ACL_TYPE_ACCESS);
+			alloc = get_acl(inode, ACL_TYPE_ACCESS);
 			if (IS_ERR(alloc))
 				goto fail;
+			dfacl = acl;
+			acl = alloc;
 			break;
 		}
 	}
 
 	if (acl == NULL) {
-		alloc = acl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
+		alloc = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
 		if (IS_ERR(alloc))
 			goto fail;
+		acl = alloc;
 	}
 	status = __nfs3_proc_setacls(inode, acl, dfacl);
-	posix_acl_release(alloc);
+out:
+	if (acl != orig)
+		posix_acl_release(acl);
+	if (dfacl != orig)
+		posix_acl_release(dfacl);
 	return status;
 
 fail:
-	return PTR_ERR(alloc);
+	status = PTR_ERR(alloc);
+	goto out;
 }
 
 const struct xattr_handler *nfs3_xattr_handlers[] = {
diff -druNp --no-dereference linux-libre-5.6.10-gnu/fs/nfs/nfs4proc.c linux-libre-5.6.11-gnu/fs/nfs/nfs4proc.c
--- linux-libre-5.6.10-gnu/fs/nfs/nfs4proc.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/fs/nfs/nfs4proc.c	2020-05-06 02:16:50.000000000 -0400
@@ -7893,6 +7893,7 @@ static void
 nfs4_bind_one_conn_to_session_done(struct rpc_task *task, void *calldata)
 {
 	struct nfs41_bind_conn_to_session_args *args = task->tk_msg.rpc_argp;
+	struct nfs41_bind_conn_to_session_res *res = task->tk_msg.rpc_resp;
 	struct nfs_client *clp = args->client;
 
 	switch (task->tk_status) {
@@ -7901,6 +7902,12 @@ nfs4_bind_one_conn_to_session_done(struc
 		nfs4_schedule_session_recovery(clp->cl_session,
 				task->tk_status);
 	}
+	if (args->dir == NFS4_CDFC4_FORE_OR_BOTH &&
+			res->dir != NFS4_CDFS4_BOTH) {
+		rpc_task_close_connection(task);
+		if (args->retries++ < MAX_BIND_CONN_TO_SESSION_RETRIES)
+			rpc_restart_call(task);
+	}
 }
 
 static const struct rpc_call_ops nfs4_bind_one_conn_to_session_ops = {
@@ -7923,6 +7930,7 @@ int nfs4_proc_bind_one_conn_to_session(s
 	struct nfs41_bind_conn_to_session_args args = {
 		.client = clp,
 		.dir = NFS4_CDFC4_FORE_OR_BOTH,
+		.retries = 0,
 	};
 	struct nfs41_bind_conn_to_session_res res;
 	struct rpc_message msg = {
diff -druNp --no-dereference linux-libre-5.6.10-gnu/fs/ocfs2/dlmfs/dlmfs.c linux-libre-5.6.11-gnu/fs/ocfs2/dlmfs/dlmfs.c
--- linux-libre-5.6.10-gnu/fs/ocfs2/dlmfs/dlmfs.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/fs/ocfs2/dlmfs/dlmfs.c	2020-05-06 02:16:50.000000000 -0400
@@ -275,7 +275,6 @@ static ssize_t dlmfs_file_write(struct f
 				loff_t *ppos)
 {
 	int bytes_left;
-	ssize_t writelen;
 	char *lvb_buf;
 	struct inode *inode = file_inode(filp);
 
@@ -285,32 +284,30 @@ static ssize_t dlmfs_file_write(struct f
 	if (*ppos >= i_size_read(inode))
 		return -ENOSPC;
 
+	/* don't write past the lvb */
+	if (count > i_size_read(inode) - *ppos)
+		count = i_size_read(inode) - *ppos;
+
 	if (!count)
 		return 0;
 
 	if (!access_ok(buf, count))
 		return -EFAULT;
 
-	/* don't write past the lvb */
-	if ((count + *ppos) > i_size_read(inode))
-		writelen = i_size_read(inode) - *ppos;
-	else
-		writelen = count - *ppos;
-
-	lvb_buf = kmalloc(writelen, GFP_NOFS);
+	lvb_buf = kmalloc(count, GFP_NOFS);
 	if (!lvb_buf)
 		return -ENOMEM;
 
-	bytes_left = copy_from_user(lvb_buf, buf, writelen);
-	writelen -= bytes_left;
-	if (writelen)
-		user_dlm_write_lvb(inode, lvb_buf, writelen);
+	bytes_left = copy_from_user(lvb_buf, buf, count);
+	count -= bytes_left;
+	if (count)
+		user_dlm_write_lvb(inode, lvb_buf, count);
 
 	kfree(lvb_buf);
 
-	*ppos = *ppos + writelen;
-	mlog(0, "wrote %zd bytes\n", writelen);
-	return writelen;
+	*ppos = *ppos + count;
+	mlog(0, "wrote %zu bytes\n", count);
+	return count;
 }
 
 static void dlmfs_init_once(void *foo)
diff -druNp --no-dereference linux-libre-5.6.10-gnu/fs/super.c linux-libre-5.6.11-gnu/fs/super.c
--- linux-libre-5.6.10-gnu/fs/super.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/fs/super.c	2020-05-06 02:16:50.000000000 -0400
@@ -1302,8 +1302,8 @@ int get_tree_bdev(struct fs_context *fc,
 	mutex_lock(&bdev->bd_fsfreeze_mutex);
 	if (bdev->bd_fsfreeze_count > 0) {
 		mutex_unlock(&bdev->bd_fsfreeze_mutex);
-		blkdev_put(bdev, mode);
 		warnf(fc, "%pg: Can't mount, blockdev is frozen", bdev);
+		blkdev_put(bdev, mode);
 		return -EBUSY;
 	}
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/include/linux/dmaengine.h linux-libre-5.6.11-gnu/include/linux/dmaengine.h
--- linux-libre-5.6.10-gnu/include/linux/dmaengine.h	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/include/linux/dmaengine.h	2020-05-06 02:16:50.000000000 -0400
@@ -336,13 +336,11 @@ struct dma_chan {
  * @chan: driver channel device
  * @device: sysfs device
  * @dev_id: parent dma_device dev_id
- * @idr_ref: reference count to gate release of dma_device dev_id
  */
 struct dma_chan_dev {
 	struct dma_chan *chan;
 	struct device device;
 	int dev_id;
-	atomic_t *idr_ref;
 };
 
 /**
@@ -827,6 +825,8 @@ struct dma_device {
 	int dev_id;
 	struct device *dev;
 	struct module *owner;
+	struct ida chan_ida;
+	struct mutex chan_mutex;	/* to protect chan_ida */
 
 	u32 src_addr_widths;
 	u32 dst_addr_widths;
diff -druNp --no-dereference linux-libre-5.6.10-gnu/include/linux/nfs_xdr.h linux-libre-5.6.11-gnu/include/linux/nfs_xdr.h
--- linux-libre-5.6.10-gnu/include/linux/nfs_xdr.h	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/include/linux/nfs_xdr.h	2020-05-06 02:16:50.000000000 -0400
@@ -1307,11 +1307,13 @@ struct nfs41_impl_id {
 	struct nfstime4			date;
 };
 
+#define MAX_BIND_CONN_TO_SESSION_RETRIES 3
 struct nfs41_bind_conn_to_session_args {
 	struct nfs_client		*client;
 	struct nfs4_sessionid		sessionid;
 	u32				dir;
 	bool				use_conn_in_rdma_mode;
+	int				retries;
 };
 
 struct nfs41_bind_conn_to_session_res {
diff -druNp --no-dereference linux-libre-5.6.10-gnu/include/linux/sunrpc/clnt.h linux-libre-5.6.11-gnu/include/linux/sunrpc/clnt.h
--- linux-libre-5.6.10-gnu/include/linux/sunrpc/clnt.h	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/include/linux/sunrpc/clnt.h	2020-05-06 02:16:50.000000000 -0400
@@ -236,4 +236,9 @@ static inline int rpc_reply_expected(str
 		(task->tk_msg.rpc_proc->p_decode != NULL);
 }
 
+static inline void rpc_task_close_connection(struct rpc_task *task)
+{
+	if (task->tk_xprt)
+		xprt_force_disconnect(task->tk_xprt);
+}
 #endif /* _LINUX_SUNRPC_CLNT_H */
diff -druNp --no-dereference linux-libre-5.6.10-gnu/include/uapi/linux/dma-buf.h linux-libre-5.6.11-gnu/include/uapi/linux/dma-buf.h
--- linux-libre-5.6.10-gnu/include/uapi/linux/dma-buf.h	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/include/uapi/linux/dma-buf.h	2020-05-06 02:16:50.000000000 -0400
@@ -39,6 +39,12 @@ struct dma_buf_sync {
 
 #define DMA_BUF_BASE		'b'
 #define DMA_BUF_IOCTL_SYNC	_IOW(DMA_BUF_BASE, 0, struct dma_buf_sync)
+
+/* 32/64bitness of this uapi was botched in android, there's no difference
+ * between them in actual uapi, they're just different numbers.
+ */
 #define DMA_BUF_SET_NAME	_IOW(DMA_BUF_BASE, 1, const char *)
+#define DMA_BUF_SET_NAME_A	_IOW(DMA_BUF_BASE, 1, u32)
+#define DMA_BUF_SET_NAME_B	_IOW(DMA_BUF_BASE, 1, u64)
 
 #endif
diff -druNp --no-dereference linux-libre-5.6.10-gnu/kernel/power/hibernate.c linux-libre-5.6.11-gnu/kernel/power/hibernate.c
--- linux-libre-5.6.10-gnu/kernel/power/hibernate.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/kernel/power/hibernate.c	2020-05-06 02:16:50.000000000 -0400
@@ -898,6 +898,13 @@ static int software_resume(void)
 	error = freeze_processes();
 	if (error)
 		goto Close_Finish;
+
+	error = freeze_kernel_threads();
+	if (error) {
+		thaw_processes();
+		goto Close_Finish;
+	}
+
 	error = load_image_and_restore();
 	thaw_processes();
  Finish:
diff -druNp --no-dereference linux-libre-5.6.10-gnu/Makefile linux-libre-5.6.11-gnu/Makefile
--- linux-libre-5.6.10-gnu/Makefile	2020-05-03 02:38:39.000000000 -0400
+++ linux-libre-5.6.11-gnu/Makefile	2020-05-06 06:14:38.000000000 -0400
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
 VERSION = 5
 PATCHLEVEL = 6
-SUBLEVEL = 10
+SUBLEVEL = 11
 EXTRAVERSION = -gnu
 NAME = Kleptomaniac Octopus
 
diff -druNp --no-dereference linux-libre-5.6.10-gnu/security/selinux/hooks.c linux-libre-5.6.11-gnu/security/selinux/hooks.c
--- linux-libre-5.6.10-gnu/security/selinux/hooks.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/security/selinux/hooks.c	2020-05-06 02:16:50.000000000 -0400
@@ -5829,40 +5829,60 @@ static unsigned int selinux_ipv6_postrou
 
 static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
 {
-	int err = 0;
-	u32 perm;
+	int rc = 0;
+	unsigned int msg_len;
+	unsigned int data_len = skb->len;
+	unsigned char *data = skb->data;
 	struct nlmsghdr *nlh;
 	struct sk_security_struct *sksec = sk->sk_security;
+	u16 sclass = sksec->sclass;
+	u32 perm;
 
-	if (skb->len < NLMSG_HDRLEN) {
-		err = -EINVAL;
-		goto out;
-	}
-	nlh = nlmsg_hdr(skb);
+	while (data_len >= nlmsg_total_size(0)) {
+		nlh = (struct nlmsghdr *)data;
 
-	err = selinux_nlmsg_lookup(sksec->sclass, nlh->nlmsg_type, &perm);
-	if (err) {
-		if (err == -EINVAL) {
+		/* NOTE: the nlmsg_len field isn't reliably set by some netlink
+		 *       users which means we can't reject skb's with bogus
+		 *       length fields; our solution is to follow what
+		 *       netlink_rcv_skb() does and simply skip processing at
+		 *       messages with length fields that are clearly junk
+		 */
+		if (nlh->nlmsg_len < NLMSG_HDRLEN || nlh->nlmsg_len > data_len)
+			return 0;
+
+		rc = selinux_nlmsg_lookup(sclass, nlh->nlmsg_type, &perm);
+		if (rc == 0) {
+			rc = sock_has_perm(sk, perm);
+			if (rc)
+				return rc;
+		} else if (rc == -EINVAL) {
+			/* -EINVAL is a missing msg/perm mapping */
 			pr_warn_ratelimited("SELinux: unrecognized netlink"
-			       " message: protocol=%hu nlmsg_type=%hu sclass=%s"
-			       " pid=%d comm=%s\n",
-			       sk->sk_protocol, nlh->nlmsg_type,
-			       secclass_map[sksec->sclass - 1].name,
-			       task_pid_nr(current), current->comm);
-			if (!enforcing_enabled(&selinux_state) ||
-			    security_get_allow_unknown(&selinux_state))
-				err = 0;
+				" message: protocol=%hu nlmsg_type=%hu sclass=%s"
+				" pid=%d comm=%s\n",
+				sk->sk_protocol, nlh->nlmsg_type,
+				secclass_map[sclass - 1].name,
+				task_pid_nr(current), current->comm);
+			if (enforcing_enabled(&selinux_state) &&
+			    !security_get_allow_unknown(&selinux_state))
+				return rc;
+			rc = 0;
+		} else if (rc == -ENOENT) {
+			/* -ENOENT is a missing socket/class mapping, ignore */
+			rc = 0;
+		} else {
+			return rc;
 		}
 
-		/* Ignore */
-		if (err == -ENOENT)
-			err = 0;
-		goto out;
+		/* move to the next message after applying netlink padding */
+		msg_len = NLMSG_ALIGN(nlh->nlmsg_len);
+		if (msg_len >= data_len)
+			return 0;
+		data_len -= msg_len;
+		data += msg_len;
 	}
 
-	err = sock_has_perm(sk, perm);
-out:
-	return err;
+	return rc;
 }
 
 static void ipc_init_security(struct ipc_security_struct *isec, u16 sclass)
diff -druNp --no-dereference linux-libre-5.6.10-gnu/sound/core/oss/pcm_plugin.c linux-libre-5.6.11-gnu/sound/core/oss/pcm_plugin.c
--- linux-libre-5.6.10-gnu/sound/core/oss/pcm_plugin.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/sound/core/oss/pcm_plugin.c	2020-05-06 02:16:50.000000000 -0400
@@ -211,21 +211,23 @@ static snd_pcm_sframes_t plug_client_siz
 	if (stream == SNDRV_PCM_STREAM_PLAYBACK) {
 		plugin = snd_pcm_plug_last(plug);
 		while (plugin && drv_frames > 0) {
-			if (check_size && drv_frames > plugin->buf_frames)
-				drv_frames = plugin->buf_frames;
 			plugin_prev = plugin->prev;
 			if (plugin->src_frames)
 				drv_frames = plugin->src_frames(plugin, drv_frames);
+			if (check_size && plugin->buf_frames &&
+			    drv_frames > plugin->buf_frames)
+				drv_frames = plugin->buf_frames;
 			plugin = plugin_prev;
 		}
 	} else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
 		plugin = snd_pcm_plug_first(plug);
 		while (plugin && drv_frames > 0) {
 			plugin_next = plugin->next;
+			if (check_size && plugin->buf_frames &&
+			    drv_frames > plugin->buf_frames)
+				drv_frames = plugin->buf_frames;
 			if (plugin->dst_frames)
 				drv_frames = plugin->dst_frames(plugin, drv_frames);
-			if (check_size && drv_frames > plugin->buf_frames)
-				drv_frames = plugin->buf_frames;
 			plugin = plugin_next;
 		}
 	} else
@@ -251,26 +253,28 @@ static snd_pcm_sframes_t plug_slave_size
 		plugin = snd_pcm_plug_first(plug);
 		while (plugin && frames > 0) {
 			plugin_next = plugin->next;
+			if (check_size && plugin->buf_frames &&
+			    frames > plugin->buf_frames)
+				frames = plugin->buf_frames;
 			if (plugin->dst_frames) {
 				frames = plugin->dst_frames(plugin, frames);
 				if (frames < 0)
 					return frames;
 			}
-			if (check_size && frames > plugin->buf_frames)
-				frames = plugin->buf_frames;
 			plugin = plugin_next;
 		}
 	} else if (stream == SNDRV_PCM_STREAM_CAPTURE) {
 		plugin = snd_pcm_plug_last(plug);
 		while (plugin) {
-			if (check_size && frames > plugin->buf_frames)
-				frames = plugin->buf_frames;
 			plugin_prev = plugin->prev;
 			if (plugin->src_frames) {
 				frames = plugin->src_frames(plugin, frames);
 				if (frames < 0)
 					return frames;
 			}
+			if (check_size && plugin->buf_frames &&
+			    frames > plugin->buf_frames)
+				frames = plugin->buf_frames;
 			plugin = plugin_prev;
 		}
 	} else
diff -druNp --no-dereference linux-libre-5.6.10-gnu/sound/isa/opti9xx/miro.c linux-libre-5.6.11-gnu/sound/isa/opti9xx/miro.c
--- linux-libre-5.6.10-gnu/sound/isa/opti9xx/miro.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/sound/isa/opti9xx/miro.c	2020-05-06 02:16:50.000000000 -0400
@@ -867,10 +867,13 @@ static void snd_miro_write(struct snd_mi
 	spin_unlock_irqrestore(&chip->lock, flags);
 }
 
+static inline void snd_miro_write_mask(struct snd_miro *chip,
+		unsigned char reg, unsigned char value, unsigned char mask)
+{
+	unsigned char oldval = snd_miro_read(chip, reg);
 
-#define snd_miro_write_mask(chip, reg, value, mask)	\
-	snd_miro_write(chip, reg,			\
-		(snd_miro_read(chip, reg) & ~(mask)) | ((value) & (mask)))
+	snd_miro_write(chip, reg, (oldval & ~mask) | (value & mask));
+}
 
 /*
  *  Proc Interface
diff -druNp --no-dereference linux-libre-5.6.10-gnu/sound/isa/opti9xx/opti92x-ad1848.c linux-libre-5.6.11-gnu/sound/isa/opti9xx/opti92x-ad1848.c
--- linux-libre-5.6.10-gnu/sound/isa/opti9xx/opti92x-ad1848.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/sound/isa/opti9xx/opti92x-ad1848.c	2020-05-06 02:16:50.000000000 -0400
@@ -317,10 +317,13 @@ static void snd_opti9xx_write(struct snd
 }
 
 
-#define snd_opti9xx_write_mask(chip, reg, value, mask)	\
-	snd_opti9xx_write(chip, reg,			\
-		(snd_opti9xx_read(chip, reg) & ~(mask)) | ((value) & (mask)))
+static inline void snd_opti9xx_write_mask(struct snd_opti9xx *chip,
+		unsigned char reg, unsigned char value, unsigned char mask)
+{
+	unsigned char oldval = snd_opti9xx_read(chip, reg);
 
+	snd_opti9xx_write(chip, reg, (oldval & ~mask) | (value & mask));
+}
 
 static int snd_opti9xx_configure(struct snd_opti9xx *chip,
 					   long port,
diff -druNp --no-dereference linux-libre-5.6.10-gnu/sound/pci/hda/patch_hdmi.c linux-libre-5.6.11-gnu/sound/pci/hda/patch_hdmi.c
--- linux-libre-5.6.10-gnu/sound/pci/hda/patch_hdmi.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/sound/pci/hda/patch_hdmi.c	2020-05-06 02:16:50.000000000 -0400
@@ -1934,8 +1934,10 @@ static bool check_non_pcm_per_cvt(struct
 	/* Add sanity check to pass klockwork check.
 	 * This should never happen.
 	 */
-	if (WARN_ON(spdif == NULL))
+	if (WARN_ON(spdif == NULL)) {
+		mutex_unlock(&codec->spdif_mutex);
 		return true;
+	}
 	non_pcm = !!(spdif->status & IEC958_AES0_NONAUDIO);
 	mutex_unlock(&codec->spdif_mutex);
 	return non_pcm;
diff -druNp --no-dereference linux-libre-5.6.10-gnu/sound/pci/hda/patch_realtek.c linux-libre-5.6.11-gnu/sound/pci/hda/patch_realtek.c
--- linux-libre-5.6.10-gnu/sound/pci/hda/patch_realtek.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/sound/pci/hda/patch_realtek.c	2020-05-06 02:16:50.000000000 -0400
@@ -7295,6 +7295,7 @@ static const struct snd_pci_quirk alc269
 	SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
 	SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
 	SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
+	SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
 	SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
 	SND_PCI_QUIRK(0x17aa, 0x215e, "Thinkpad L512", ALC269_FIXUP_SKU_IGNORE),
 	SND_PCI_QUIRK(0x17aa, 0x21b8, "Thinkpad Edge 14", ALC269_FIXUP_SKU_IGNORE),
diff -druNp --no-dereference linux-libre-5.6.10-gnu/sound/usb/line6/podhd.c linux-libre-5.6.11-gnu/sound/usb/line6/podhd.c
--- linux-libre-5.6.10-gnu/sound/usb/line6/podhd.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/sound/usb/line6/podhd.c	2020-05-06 02:16:50.000000000 -0400
@@ -21,8 +21,7 @@
 enum {
 	LINE6_PODHD300,
 	LINE6_PODHD400,
-	LINE6_PODHD500_0,
-	LINE6_PODHD500_1,
+	LINE6_PODHD500,
 	LINE6_PODX3,
 	LINE6_PODX3LIVE,
 	LINE6_PODHD500X,
@@ -318,8 +317,7 @@ static const struct usb_device_id podhd_
 	/* TODO: no need to alloc data interfaces when only audio is used */
 	{ LINE6_DEVICE(0x5057),    .driver_info = LINE6_PODHD300 },
 	{ LINE6_DEVICE(0x5058),    .driver_info = LINE6_PODHD400 },
-	{ LINE6_IF_NUM(0x414D, 0), .driver_info = LINE6_PODHD500_0 },
-	{ LINE6_IF_NUM(0x414D, 1), .driver_info = LINE6_PODHD500_1 },
+	{ LINE6_IF_NUM(0x414D, 0), .driver_info = LINE6_PODHD500 },
 	{ LINE6_IF_NUM(0x414A, 0), .driver_info = LINE6_PODX3 },
 	{ LINE6_IF_NUM(0x414B, 0), .driver_info = LINE6_PODX3LIVE },
 	{ LINE6_IF_NUM(0x4159, 0), .driver_info = LINE6_PODHD500X },
@@ -352,23 +350,13 @@ static const struct line6_properties pod
 		.ep_audio_r = 0x82,
 		.ep_audio_w = 0x01,
 	},
-	[LINE6_PODHD500_0] = {
+	[LINE6_PODHD500] = {
 		.id = "PODHD500",
 		.name = "POD HD500",
-		.capabilities	= LINE6_CAP_PCM
+		.capabilities	= LINE6_CAP_PCM | LINE6_CAP_CONTROL
 				| LINE6_CAP_HWMON,
 		.altsetting = 1,
-		.ep_ctrl_r = 0x81,
-		.ep_ctrl_w = 0x01,
-		.ep_audio_r = 0x86,
-		.ep_audio_w = 0x02,
-	},
-	[LINE6_PODHD500_1] = {
-		.id = "PODHD500",
-		.name = "POD HD500",
-		.capabilities	= LINE6_CAP_PCM
-				| LINE6_CAP_HWMON,
-		.altsetting = 0,
+		.ctrl_if = 1,
 		.ep_ctrl_r = 0x81,
 		.ep_ctrl_w = 0x01,
 		.ep_audio_r = 0x86,
diff -druNp --no-dereference linux-libre-5.6.10-gnu/sound/usb/quirks.c linux-libre-5.6.11-gnu/sound/usb/quirks.c
--- linux-libre-5.6.10-gnu/sound/usb/quirks.c	2020-05-02 11:27:56.000000000 -0400
+++ linux-libre-5.6.11-gnu/sound/usb/quirks.c	2020-05-06 02:16:50.000000000 -0400
@@ -1643,7 +1643,7 @@ u64 snd_usb_interface_dsd_format_quirks(
 
 	case USB_ID(0x0d8c, 0x0316): /* Hegel HD12 DSD */
 	case USB_ID(0x10cb, 0x0103): /* The Bit Opus #3; with fp->dsd_raw */
-	case USB_ID(0x16b0, 0x06b2): /* NuPrime DAC-10 */
+	case USB_ID(0x16d0, 0x06b2): /* NuPrime DAC-10 */
 	case USB_ID(0x16d0, 0x09dd): /* Encore mDSD */
 	case USB_ID(0x16d0, 0x0733): /* Furutech ADL Stratos */
 	case USB_ID(0x16d0, 0x09db): /* NuPrime Audio DAC-9 */
