diff options
| -rw-r--r-- | drivers/dma/cppi41.c | 13 |
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 | |||
| 89 | struct cppi41_channel { | 92 | struct 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 | } |
