Skip to content

Commit

Permalink
dma: cppi41: handle 0-length packets
Browse files Browse the repository at this point in the history
When a 0-length packet is received on the bus, desc->pd0 yields 1,
which confuses the driver's users. This information is clearly wrong
and not in accordance to the datasheet, but it's been observed on an
AM335x board, very reproducible.

Fix this by looking at bit 19 in PD2 of the completed packet. This bit
will tell us if a zero-length packet was received on a queue. If it's
set, ignore the value in PD0 and report a total length of 0 instead.

Signed-off-by: Daniel Mack <zonque@gmail.com>
Signed-off-by: Vinod Koul <vinod.koul@intel.com>
  • Loading branch information
Daniel Mack authored and Vinod Koul committed Jul 1, 2014
1 parent 4c83445 commit 13bbfb5
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions drivers/dma/cppi41.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand All @@ -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);
}
Expand Down

0 comments on commit 13bbfb5

Please sign in to comment.