Commit d0f22a3f authored by Jan Kuliga's avatar Jan Kuliga Committed by Vinod Koul
Browse files

dmaengine: xilinx: xdma: Add error checking in xdma_channel_isr()



Check and clear the status register value before proceeding any
further in xdma_channel_isr(). It is necessary to do it since the
interrupt may occur on any error condition enabled at the start of a
transfer.

Signed-off-by: default avatarJan Kuliga <jankul@alatek.krakow.pl>
Link: https://lore.kernel.org/r/20231218113943.9099-6-jankul@alatek.krakow.pl


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 855c2e1d
Loading
Loading
Loading
Loading
+12 −8
Original line number Diff line number Diff line
@@ -811,21 +811,25 @@ static irqreturn_t xdma_channel_isr(int irq, void *dev_id)
	desc = to_xdma_desc(vd);
	xdev = xchan->xdev_hdl;

	ret = regmap_read(xdev->rmap, xchan->base + XDMA_CHAN_COMPLETED_DESC,
			  &complete_desc_num);
	/* Clear-on-read the status register */
	ret = regmap_read(xdev->rmap, xchan->base + XDMA_CHAN_STATUS_RC, &st);
	if (ret)
		goto out;

	if (desc->cyclic) {
		desc->completed_desc_num = complete_desc_num;
	st &= XDMA_CHAN_STATUS_MASK;
	if ((st & XDMA_CHAN_ERROR_MASK) ||
	    !(st & (CHAN_CTRL_IE_DESC_COMPLETED | CHAN_CTRL_IE_DESC_STOPPED))) {
		xdma_err(xdev, "channel error, status register value: 0x%x", st);
		goto out;
	}

		ret = regmap_read(xdev->rmap, xchan->base + XDMA_CHAN_STATUS,
				  &st);
	ret = regmap_read(xdev->rmap, xchan->base + XDMA_CHAN_COMPLETED_DESC,
			  &complete_desc_num);
	if (ret)
		goto out;

		regmap_write(xdev->rmap, xchan->base + XDMA_CHAN_STATUS, st);

	if (desc->cyclic) {
		desc->completed_desc_num = complete_desc_num;
		vchan_cyclic_callback(vd);
	} else {
		xchan->busy = false;