1 From a2dd154377c9aa6ddda00d39b8c7c334e4fa16ff Mon Sep 17 00:00:00 2001
2 From: Damien Horsley <damien.horsley@imgtec.com>
3 Date: Tue, 22 Mar 2016 12:46:09 +0000
4 Subject: dmaengine: img-mdc: Handle early status read
6 It is possible that mdc_tx_status may be called before the first
7 node has been read from memory.
9 In this case, the residue value stored in the register is undefined.
10 Return the transfer size instead.
12 Signed-off-by: Damien Horsley <damien.horsley@imgtec.com>
14 drivers/dma/img-mdc-dma.c | 40 ++++++++++++++++++++++++----------------
15 1 file changed, 24 insertions(+), 16 deletions(-)
17 --- a/drivers/dma/img-mdc-dma.c
18 +++ b/drivers/dma/img-mdc-dma.c
19 @@ -620,25 +620,33 @@ static enum dma_status mdc_tx_status(str
20 (MDC_CMDS_PROCESSED_CMDS_DONE_MASK + 1);
23 - * If the command loaded event hasn't been processed yet, then
24 - * the difference above includes an extra command.
25 + * If the first node has not yet been read from memory,
26 + * the residue register value is undefined
28 - if (!mdesc->cmd_loaded)
31 - cmds += mdesc->list_cmds_done;
33 - bytes = mdesc->list_xfer_size;
34 - ldesc = mdesc->list;
35 - for (i = 0; i < cmds; i++) {
36 - bytes -= ldesc->xfer_size + 1;
37 - ldesc = ldesc->next_desc;
40 - if (residue != MDC_TRANSFER_SIZE_MASK)
41 - bytes -= ldesc->xfer_size - residue;
42 + if (!mdesc->cmd_loaded && !cmds) {
43 + bytes = mdesc->list_xfer_size;
46 + * If the command loaded event hasn't been processed yet, then
47 + * the difference above includes an extra command.
49 + if (!mdesc->cmd_loaded)
52 + cmds += mdesc->list_cmds_done;
54 + bytes = mdesc->list_xfer_size;
55 + ldesc = mdesc->list;
56 + for (i = 0; i < cmds; i++) {
57 bytes -= ldesc->xfer_size + 1;
58 + ldesc = ldesc->next_desc;
61 + if (residue != MDC_TRANSFER_SIZE_MASK)
62 + bytes -= ldesc->xfer_size - residue;
64 + bytes -= ldesc->xfer_size + 1;
68 spin_unlock_irqrestore(&mchan->vc.lock, flags);