summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandre Bailon <abailon@baylibre.com>2017-01-30 20:49:21 +0300
committerVinod Koul <vinod.koul@intel.com>2017-03-07 11:12:28 +0300
commit4f68b09ea3ed5b9619568625d967569da055f487 (patch)
treec31bdb502a76c1beabf1207a16ed7e92225c816f
parente3fa49acf00a6db3bfdee725ac5d688dd98dc2c9 (diff)
downloadlinux-4f68b09ea3ed5b9619568625d967569da055f487.tar.xz
dmaengine: cppi41: Fix teardown warnings
During the teardown of a RX channel, because there is only one completion queue available for RX channel, descriptor of another channel may be popped which will cause 2 warnings: - the first one because we popped a wrong descriptor (neither the channel's descriptor, nor the teardown descriptor). - the second one happen during the teardown of another channel, because we can't find the channel descriptor (that is, the one that caused the first warning). To avoid that, use one free queue instead of a transmit completion queue. Note that fix doesn't fix all the teardown warnings: I still get some when I run some corner case. Signed-off-by: Alexandre Bailon <abailon@baylibre.com> Signed-off-by: Vinod Koul <vinod.koul@intel.com>
-rw-r--r--drivers/dma/cppi41.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/dma/cppi41.c b/drivers/dma/cppi41.c
index 135fb45a96f0..675de6a27e39 100644
--- a/drivers/dma/cppi41.c
+++ b/drivers/dma/cppi41.c
@@ -648,7 +648,7 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c)
if (!c->is_tx) {
reg |= GCR_STARV_RETRY;
reg |= GCR_DESC_TYPE_HOST;
- reg |= c->q_comp_num;
+ reg |= cdd->td_queue.complete;
}
reg |= GCR_TEARDOWN;
cppi_writel(reg, c->gcr_reg);
@@ -659,7 +659,7 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c)
if (!c->td_seen || !c->td_desc_seen) {
desc_phys = cppi41_pop_desc(cdd, cdd->td_queue.complete);
- if (!desc_phys)
+ if (!desc_phys && c->is_tx)
desc_phys = cppi41_pop_desc(cdd, c->q_comp_num);
if (desc_phys == c->desc_phys) {