aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/dma/cppi41.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dma/cppi41.c')
-rw-r--r--drivers/dma/cppi41.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/drivers/dma/cppi41.c b/drivers/dma/cppi41.c
index d028f36ae655..8f8b0b608875 100644
--- a/drivers/dma/cppi41.c
+++ b/drivers/dma/cppi41.c
@@ -86,6 +86,9 @@
86 86
87#define USBSS_IRQ_PD_COMP (1 << 2) 87#define USBSS_IRQ_PD_COMP (1 << 2)
88 88
89/* Packet Descriptor */
90#define PD2_ZERO_LENGTH (1 << 19)
91
89struct cppi41_channel { 92struct cppi41_channel {
90 struct dma_chan chan; 93 struct dma_chan chan;
91 struct dma_async_tx_descriptor txd; 94 struct dma_async_tx_descriptor txd;
@@ -307,7 +310,7 @@ static irqreturn_t cppi41_irq(int irq, void *data)
307 __iormb(); 310 __iormb();
308 311
309 while (val) { 312 while (val) {
310 u32 desc; 313 u32 desc, len;
311 314
312 q_num = __fls(val); 315 q_num = __fls(val);
313 val &= ~(1 << q_num); 316 val &= ~(1 << q_num);
@@ -319,9 +322,13 @@ static irqreturn_t cppi41_irq(int irq, void *data)
319 q_num, desc); 322 q_num, desc);
320 continue; 323 continue;
321 } 324 }
322 c->residue = pd_trans_len(c->desc->pd6) -
323 pd_trans_len(c->desc->pd0);
324 325
326 if (c->desc->pd2 & PD2_ZERO_LENGTH)
327 len = 0;
328 else
329 len = pd_trans_len(c->desc->pd0);
330
331 c->residue = pd_trans_len(c->desc->pd6) - len;
325 dma_cookie_complete(&c->txd); 332 dma_cookie_complete(&c->txd);
326 c->txd.callback(c->txd.callback_param); 333 c->txd.callback(c->txd.callback_param);
327 } 334 }