* Grygorii Strashko <grygorii.strashko@xxxxxx> [170112 15:43]: > @@ -457,38 +449,36 @@ static void push_desc_queue(struct cppi41_channel *c) > cppi_writel(reg, cdd->qmgr_mem + QMGR_QUEUE_D(c->q_num)); > } > > -static void pending_desc(struct cppi41_channel *c) > +static void cppi41_dma_issue_pending(struct dma_chan *chan) > { > + struct cppi41_channel *c = to_cpp41_chan(chan); > struct cppi41_dd *cdd = c->cdd; > + int error; > + struct cppi41_channel *_c; > unsigned long flags; > > spin_lock_irqsave(&cdd->lock, flags); > list_add_tail(&c->node, &cdd->pending); > - spin_unlock_irqrestore(&cdd->lock, flags); > -} > - > -static void cppi41_dma_issue_pending(struct dma_chan *chan) > -{ > - struct cppi41_channel *c = to_cpp41_chan(chan); > - struct cppi41_dd *cdd = c->cdd; > - int error; > > error = pm_runtime_get(cdd->ddev.dev); > - if ((error != -EINPROGRESS) && error < 0) { > + if (error < 0) { > pm_runtime_put_noidle(cdd->ddev.dev); > dev_err(cdd->ddev.dev, "Failed to pm_runtime_get: %i\n", > error); > - > + spin_unlock_irqrestore(&cdd->lock, flags); > return; > } > > - if (likely(pm_runtime_active(cdd->ddev.dev))) > - push_desc_queue(c); > - else > - pending_desc(c); > + if (!cdd->is_suspended) { > + list_for_each_entry_safe(c, _c, &cdd->pending, node) { > + push_desc_queue(c); > + list_del(&c->node); > + }; > + } > > pm_runtime_mark_last_busy(cdd->ddev.dev); > pm_runtime_put_autosuspend(cdd->ddev.dev); > + spin_lock_irqsave(&cdd->lock, flags); > } So always add to the queue no matter, then always flush the queue directly if active? Yeah that might work :) Don't we need spinlock in the list_for_each_entry_safe() to prevent it racing with runtime_resume() though? Tony -- 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