* Daniel Mack | 2013-10-01 15:31:11 [+0200]: >In cppi41_tear_down_chan(), bail out earlier in case td_seen is unset >instead of popping another descriptor when td_desc_seen is also unset. > >My system ran into WARN() condition multiple times when >cppi41_tear_down_chan() was called for channels that had all of >td_queued, td_seen and td_seen set to false. Which one? >Signed-off-by: Daniel Mack <zonque@xxxxxxxxx> >--- > drivers/dma/cppi41.c | 5 +++-- > 1 file changed, 3 insertions(+), 2 deletions(-) > >diff --git a/drivers/dma/cppi41.c b/drivers/dma/cppi41.c >index 7747bf7..6decf34 100644 >--- a/drivers/dma/cppi41.c >+++ b/drivers/dma/cppi41.c >@@ -586,6 +586,9 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c) > } > c->td_seen = 1; > } >+ >+ if (c->td_retry) >+ return -EAGAIN; So you return right away since the retry counter should be > 0 here. And then you want to get the TDDOWN bit set and retry. Hmmm. Let me answer to you 0/3 on this. > } > if (!c->td_desc_seen) { > desc_phys = cppi41_pop_desc(cdd, c->q_comp_num); >@@ -606,8 +609,6 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c) > * descriptor before the TD we fetch it from enqueue, it has to be > * there waiting for us. > */ >- if (!c->td_seen && c->td_retry) >- return -EAGAIN; > > WARN_ON(!c->td_retry); > if (!c->td_desc_seen) { Sebastian -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html