提交 4f68b09e 编写于 作者: A Alexandre Bailon 提交者: Vinod Koul

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: NAlexandre Bailon <abailon@baylibre.com>
Signed-off-by: NVinod Koul <vinod.koul@intel.com>
上级 e3fa49ac
...@@ -648,7 +648,7 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c) ...@@ -648,7 +648,7 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c)
if (!c->is_tx) { if (!c->is_tx) {
reg |= GCR_STARV_RETRY; reg |= GCR_STARV_RETRY;
reg |= GCR_DESC_TYPE_HOST; reg |= GCR_DESC_TYPE_HOST;
reg |= c->q_comp_num; reg |= cdd->td_queue.complete;
} }
reg |= GCR_TEARDOWN; reg |= GCR_TEARDOWN;
cppi_writel(reg, c->gcr_reg); cppi_writel(reg, c->gcr_reg);
...@@ -659,7 +659,7 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c) ...@@ -659,7 +659,7 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c)
if (!c->td_seen || !c->td_desc_seen) { if (!c->td_seen || !c->td_desc_seen) {
desc_phys = cppi41_pop_desc(cdd, cdd->td_queue.complete); 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); desc_phys = cppi41_pop_desc(cdd, c->q_comp_num);
if (desc_phys == c->desc_phys) { if (desc_phys == c->desc_phys) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册