* [09/15] dmaengine: img-mdc: Handle early status read
@ 2018-07-22 21:20 Andreas Färber
0 siblings, 0 replies; 2+ messages in thread
From: Andreas Färber @ 2018-07-22 21:20 UTC (permalink / raw)
To: linux-mips
Cc: Ralf Baechle, Paul Burton, James Hogan, linux-kernel,
Damien Horsley, Andreas Färber, Vinod Koul, Dan Williams,
dmaengine
From: Damien Horsley <damien.horsley@imgtec.com>
It is possible that mdc_tx_status may be called before the first
node has been read from memory.
In this case, the residue value stored in the register is undefined.
Return the transfer size instead.
Signed-off-by: Damien Horsley <damien.horsley@imgtec.com>
Signed-off-by: Andreas Färber <afaerber@suse.de>
---
drivers/dma/img-mdc-dma.c | 40 ++++++++++++++++++++++++----------------
1 file changed, 24 insertions(+), 16 deletions(-)
diff --git a/drivers/dma/img-mdc-dma.c b/drivers/dma/img-mdc-dma.c
index 25cec9c243e1..0f2f0f52d83a 100644
--- a/drivers/dma/img-mdc-dma.c
+++ b/drivers/dma/img-mdc-dma.c
@@ -621,25 +621,33 @@ static enum dma_status mdc_tx_status(struct dma_chan *chan,
(MDC_CMDS_PROCESSED_CMDS_DONE_MASK + 1);
/*
- * If the command loaded event hasn't been processed yet, then
- * the difference above includes an extra command.
+ * If the first node has not yet been read from memory,
+ * the residue register value is undefined
*/
- if (!mdesc->cmd_loaded)
- cmds--;
- else
- cmds += mdesc->list_cmds_done;
-
- bytes = mdesc->list_xfer_size;
- ldesc = mdesc->list;
- for (i = 0; i < cmds; i++) {
- bytes -= ldesc->xfer_size + 1;
- ldesc = ldesc->next_desc;
- }
- if (ldesc) {
- if (residue != MDC_TRANSFER_SIZE_MASK)
- bytes -= ldesc->xfer_size - residue;
+ if (!mdesc->cmd_loaded && !cmds) {
+ bytes = mdesc->list_xfer_size;
+ } else {
+ /*
+ * If the command loaded event hasn't been processed yet, then
+ * the difference above includes an extra command.
+ */
+ if (!mdesc->cmd_loaded)
+ cmds--;
else
+ cmds += mdesc->list_cmds_done;
+
+ bytes = mdesc->list_xfer_size;
+ ldesc = mdesc->list;
+ for (i = 0; i < cmds; i++) {
bytes -= ldesc->xfer_size + 1;
+ ldesc = ldesc->next_desc;
+ }
+ if (ldesc) {
+ if (residue != MDC_TRANSFER_SIZE_MASK)
+ bytes -= ldesc->xfer_size - residue;
+ else
+ bytes -= ldesc->xfer_size + 1;
+ }
}
}
spin_unlock_irqrestore(&mchan->vc.lock, flags);
^ permalink raw reply related [flat|nested] 2+ messages in thread* [09/15] dmaengine: img-mdc: Handle early status read
@ 2018-07-24 11:36 Vinod Koul
0 siblings, 0 replies; 2+ messages in thread
From: Vinod Koul @ 2018-07-24 11:36 UTC (permalink / raw)
To: Andreas Färber
Cc: linux-mips, Ralf Baechle, Paul Burton, James Hogan, linux-kernel,
Damien Horsley, Dan Williams, dmaengine
On 22-07-18, 23:20, Andreas Färber wrote:
> From: Damien Horsley <damien.horsley@imgtec.com>
>
> It is possible that mdc_tx_status may be called before the first
> node has been read from memory.
>
> In this case, the residue value stored in the register is undefined.
> Return the transfer size instead.
>
> Signed-off-by: Damien Horsley <damien.horsley@imgtec.com>
> Signed-off-by: Andreas Färber <afaerber@suse.de>
> ---
> drivers/dma/img-mdc-dma.c | 40 ++++++++++++++++++++++++----------------
> 1 file changed, 24 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/dma/img-mdc-dma.c b/drivers/dma/img-mdc-dma.c
> index 25cec9c243e1..0f2f0f52d83a 100644
> --- a/drivers/dma/img-mdc-dma.c
> +++ b/drivers/dma/img-mdc-dma.c
> @@ -621,25 +621,33 @@ static enum dma_status mdc_tx_status(struct dma_chan *chan,
> (MDC_CMDS_PROCESSED_CMDS_DONE_MASK + 1);
>
> /*
> - * If the command loaded event hasn't been processed yet, then
> - * the difference above includes an extra command.
> + * If the first node has not yet been read from memory,
> + * the residue register value is undefined
so is this the case when transfer is not started ?
> */
> - if (!mdesc->cmd_loaded)
> - cmds--;
> - else
> - cmds += mdesc->list_cmds_done;
> -
> - bytes = mdesc->list_xfer_size;
> - ldesc = mdesc->list;
> - for (i = 0; i < cmds; i++) {
> - bytes -= ldesc->xfer_size + 1;
> - ldesc = ldesc->next_desc;
> - }
> - if (ldesc) {
> - if (residue != MDC_TRANSFER_SIZE_MASK)
> - bytes -= ldesc->xfer_size - residue;
> + if (!mdesc->cmd_loaded && !cmds) {
> + bytes = mdesc->list_xfer_size;
> + } else {
> + /*
> + * If the command loaded event hasn't been processed yet, then
> + * the difference above includes an extra command.
> + */
> + if (!mdesc->cmd_loaded)
> + cmds--;
> else
> + cmds += mdesc->list_cmds_done;
> +
> + bytes = mdesc->list_xfer_size;
> + ldesc = mdesc->list;
> + for (i = 0; i < cmds; i++) {
> bytes -= ldesc->xfer_size + 1;
> + ldesc = ldesc->next_desc;
> + }
> + if (ldesc) {
> + if (residue != MDC_TRANSFER_SIZE_MASK)
> + bytes -= ldesc->xfer_size - residue;
> + else
> + bytes -= ldesc->xfer_size + 1;
> + }
> }
> }
> spin_unlock_irqrestore(&mchan->vc.lock, flags);
> --
> 2.16.4
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2018-07-24 11:36 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-07-22 21:20 [09/15] dmaengine: img-mdc: Handle early status read Andreas Färber
-- strict thread matches above, loose matches on Subject: below --
2018-07-24 11:36 Vinod Koul
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox