Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fa4e9989 authored by Russell King's avatar Russell King Committed by Russell King
Browse files

[ARM] dma: RiscPC: don't modify DMA SG entries



We should not be modifying the scatterlist passed to us from the
driver code; doing so breaks assumptions made by the DMA API code,
and could cause problems if the driver retries a transfer using an
old scatterlist.

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 308d333a
Loading
Loading
Loading
Loading
+9 −5
Original line number Original line Diff line number Diff line
@@ -32,6 +32,8 @@ struct iomd_dma {
	unsigned long		base;		/* Controller base address */
	unsigned long		base;		/* Controller base address */
	int			irq;		/* Controller IRQ */
	int			irq;		/* Controller IRQ */
	struct scatterlist	cur_sg;		/* Current controller buffer */
	struct scatterlist	cur_sg;		/* Current controller buffer */
	dma_addr_t		dma_addr;
	unsigned int		dma_len;
};
};


#if 0
#if 0
@@ -57,10 +59,10 @@ static void iomd_get_next_sg(struct scatterlist *sg, struct iomd_dma *idma)
	unsigned long end, offset, flags = 0;
	unsigned long end, offset, flags = 0;


	if (idma->dma.sg) {
	if (idma->dma.sg) {
		sg->dma_address = idma->dma.sg->dma_address;
		sg->dma_address = idma->dma_addr;
		offset = sg->dma_address & ~PAGE_MASK;
		offset = sg->dma_address & ~PAGE_MASK;


		end = offset + idma->dma.sg->length;
		end = offset + idma->dma_len;


		if (end > PAGE_SIZE)
		if (end > PAGE_SIZE)
			end = PAGE_SIZE;
			end = PAGE_SIZE;
@@ -70,12 +72,14 @@ static void iomd_get_next_sg(struct scatterlist *sg, struct iomd_dma *idma)


		sg->length = end - TRANSFER_SIZE;
		sg->length = end - TRANSFER_SIZE;


		idma->dma.sg->length -= end - offset;
		idma->dma_len -= end - offset;
		idma->dma.sg->dma_address += end - offset;
		idma->dma_addr += end - offset;


		if (idma->dma.sg->length == 0) {
		if (idma->dma_len == 0) {
			if (idma->dma.sgcount > 1) {
			if (idma->dma.sgcount > 1) {
				idma->dma.sg = sg_next(idma->dma.sg);
				idma->dma.sg = sg_next(idma->dma.sg);
				idma->dma_addr = idma->dma.sg->dma_address;
				idma->dma_len = idma->dma.sg->length;
				idma->dma.sgcount--;
				idma->dma.sgcount--;
			} else {
			} else {
				idma->dma.sg = NULL;
				idma->dma.sg = NULL;