+++ /dev/null
-From 59861547ec9a9736e7882f6fb0c096a720ff811a Mon Sep 17 00:00:00 2001
-From: Bin Liu <b-liu@ti.com>
-Date: Mon, 12 Nov 2018 09:43:22 -0600
-Subject: dmaengine: cppi41: delete channel from pending list when stop channel
-
-From: Bin Liu <b-liu@ti.com>
-
-commit 59861547ec9a9736e7882f6fb0c096a720ff811a upstream.
-
-The driver defines three states for a cppi channel.
-- idle: .chan_busy == 0 && not in .pending list
-- pending: .chan_busy == 0 && in .pending list
-- busy: .chan_busy == 1 && not in .pending list
-
-There are cases in which the cppi channel could be in the pending state
-when cppi41_dma_issue_pending() is called after cppi41_runtime_suspend()
-is called.
-
-cppi41_stop_chan() has a bug for these cases to set channels to idle state.
-It only checks the .chan_busy flag, but not the .pending list, then later
-when cppi41_runtime_resume() is called the channels in .pending list will
-be transitioned to busy state.
-
-Removing channels from the .pending list solves the problem.
-
-Fixes: 975faaeb9985 ("dma: cppi41: start tear down only if channel is busy")
-Cc: stable@vger.kernel.org # v3.15+
-Signed-off-by: Bin Liu <b-liu@ti.com>
-Reviewed-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
-Signed-off-by: Vinod Koul <vkoul@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- drivers/dma/cppi41.c | 16 +++++++++++++++-
- 1 file changed, 15 insertions(+), 1 deletion(-)
-
---- a/drivers/dma/cppi41.c
-+++ b/drivers/dma/cppi41.c
-@@ -629,8 +629,22 @@ static int cppi41_stop_chan(struct dma_c
-
- desc_phys = lower_32_bits(c->desc_phys);
- desc_num = (desc_phys - cdd->descs_phys) / sizeof(struct cppi41_desc);
-- if (!cdd->chan_busy[desc_num])
-+ if (!cdd->chan_busy[desc_num]) {
-+ struct cppi41_channel *cc, *_ct;
-+
-+ /*
-+ * channels might still be in the pendling list if
-+ * cppi41_dma_issue_pending() is called after
-+ * cppi41_runtime_suspend() is called
-+ */
-+ list_for_each_entry_safe(cc, _ct, &cdd->pending, node) {
-+ if (cc != c)
-+ continue;
-+ list_del(&cc->node);
-+ break;
-+ }
- return 0;
-+ }
-
- ret = cppi41_tear_down_chan(c);
- if (ret)
alsa-pcm-call-snd_pcm_unlink-conditionally-at-closing.patch
alsa-pcm-fix-interval-evaluation-with-openmin-max.patch
sunrpc-fix-leak-of-krb5p-encode-pages.patch
-dmaengine-cppi41-delete-channel-from-pending-list-when-stop-channel.patch
xhci-prevent-u1-u2-link-pm-states-if-exit-latency-is-too-long.patch
usb-serial-option-add-device-id-for-hp-lt2523-novate.patch
staging-lustre-remove-two-build-warnings.patch
+++ /dev/null
-From 59861547ec9a9736e7882f6fb0c096a720ff811a Mon Sep 17 00:00:00 2001
-From: Bin Liu <b-liu@ti.com>
-Date: Mon, 12 Nov 2018 09:43:22 -0600
-Subject: dmaengine: cppi41: delete channel from pending list when stop channel
-
-From: Bin Liu <b-liu@ti.com>
-
-commit 59861547ec9a9736e7882f6fb0c096a720ff811a upstream.
-
-The driver defines three states for a cppi channel.
-- idle: .chan_busy == 0 && not in .pending list
-- pending: .chan_busy == 0 && in .pending list
-- busy: .chan_busy == 1 && not in .pending list
-
-There are cases in which the cppi channel could be in the pending state
-when cppi41_dma_issue_pending() is called after cppi41_runtime_suspend()
-is called.
-
-cppi41_stop_chan() has a bug for these cases to set channels to idle state.
-It only checks the .chan_busy flag, but not the .pending list, then later
-when cppi41_runtime_resume() is called the channels in .pending list will
-be transitioned to busy state.
-
-Removing channels from the .pending list solves the problem.
-
-Fixes: 975faaeb9985 ("dma: cppi41: start tear down only if channel is busy")
-Cc: stable@vger.kernel.org # v3.15+
-Signed-off-by: Bin Liu <b-liu@ti.com>
-Reviewed-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
-Signed-off-by: Vinod Koul <vkoul@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-
----
- drivers/dma/cppi41.c | 16 +++++++++++++++-
- 1 file changed, 15 insertions(+), 1 deletion(-)
-
---- a/drivers/dma/cppi41.c
-+++ b/drivers/dma/cppi41.c
-@@ -628,8 +628,22 @@ static int cppi41_stop_chan(struct dma_c
-
- desc_phys = lower_32_bits(c->desc_phys);
- desc_num = (desc_phys - cdd->descs_phys) / sizeof(struct cppi41_desc);
-- if (!cdd->chan_busy[desc_num])
-+ if (!cdd->chan_busy[desc_num]) {
-+ struct cppi41_channel *cc, *_ct;
-+
-+ /*
-+ * channels might still be in the pendling list if
-+ * cppi41_dma_issue_pending() is called after
-+ * cppi41_runtime_suspend() is called
-+ */
-+ list_for_each_entry_safe(cc, _ct, &cdd->pending, node) {
-+ if (cc != c)
-+ continue;
-+ list_del(&cc->node);
-+ break;
-+ }
- return 0;
-+ }
-
- ret = cppi41_tear_down_chan(c);
- if (ret)
virtio-s390-avoid-race-on-vcdev-config.patch
virtio-s390-fix-race-in-ccw_io_helper.patch
sunrpc-fix-leak-of-krb5p-encode-pages.patch
-dmaengine-cppi41-delete-channel-from-pending-list-when-stop-channel.patch
xhci-prevent-u1-u2-link-pm-states-if-exit-latency-is-too-long.patch
staging-lustre-remove-two-build-warnings.patch
cifs-fix-separator-when-building-path-from-dentry.patch