diff options
| author | David S. Miller <davem@davemloft.net> | 2014-07-16 14:09:34 -0700 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2014-07-16 14:09:34 -0700 |
| commit | 1a98c69af1ecd97bfd1f4e4539924a9192434e36 (patch) | |
| tree | a243defcf921ea174f8e43fce11d06830a6a9c36 /drivers/dma/cppi41.c | |
| parent | 7a575f6b907ea5d207d2b5010293c189616eae34 (diff) | |
| parent | b6603fe574af289dbe9eb9fb4c540bca04f5a053 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/dma/cppi41.c')
| -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 @@ #define USBSS_IRQ_PD_COMP (1 << 2) +/* Packet Descriptor */ +#define PD2_ZERO_LENGTH (1 << 19) + struct cppi41_channel { struct dma_chan chan; struct dma_async_tx_descriptor txd; @@ -307,7 +310,7 @@ static irqreturn_t cppi41_irq(int irq, void *data) __iormb(); while (val) { - u32 desc; + u32 desc, len; q_num = __fls(val); val &= ~(1 << q_num); @@ -319,9 +322,13 @@ static irqreturn_t cppi41_irq(int irq, void *data) q_num, desc); continue; } - c->residue = pd_trans_len(c->desc->pd6) - - pd_trans_len(c->desc->pd0); + if (c->desc->pd2 & PD2_ZERO_LENGTH) + len = 0; + else + len = pd_trans_len(c->desc->pd0); + + c->residue = pd_trans_len(c->desc->pd6) - len; dma_cookie_complete(&c->txd); c->txd.callback(c->txd.callback_param); } |
