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

Commit 5f638b4f authored by Russell King - ARM Linux's avatar Russell King - ARM Linux Committed by Dan Williams
Browse files

ARM: PL08x: fix fill_bytes calculation



The number of bytes we want to fill into any LLI is the minimum of:
- number of bytes remaining in the transfer
- number of bytes we can transfer in a single LLI
- number of bytes we can transfer without overflowing the source boundary
- number of bytes we can transfer without overflowing the destination boundary

The minimum of the first two is already calculated (target_len).  We
limit the boundary calculations to this number of bytes, which will
then give us the number of bytes we can place into this LLI.

Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
Acked-by: default avatarLinus Walleij <linus.walleij@stericsson.com>
Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
parent d6cf7b59
Loading
Loading
Loading
Loading
+10 −16
Original line number Diff line number Diff line
@@ -685,31 +685,25 @@ static int pl08x_fill_llis_for_desc(struct pl08x_driver_data *pl08x,
			target_len = min(remainder, max_bytes_per_lli);

			/*
			 * Set bus lengths for incrementing buses
			 * to number of bytes which fill to next memory
			 * boundary
			 * Set bus lengths for incrementing buses to the
			 * number of bytes which fill to next memory boundary,
			 * limiting on the target length calculated above.
			 */
			if (cctl & PL080_CONTROL_SRC_INCR)
				txd->srcbus.fill_bytes =
					pl08x_pre_boundary(
						txd->srcbus.addr,
						remainder);
					pl08x_pre_boundary(txd->srcbus.addr,
						target_len);
			else
				txd->srcbus.fill_bytes =
					max_bytes_per_lli;
				txd->srcbus.fill_bytes = target_len;

			if (cctl & PL080_CONTROL_DST_INCR)
				txd->dstbus.fill_bytes =
					pl08x_pre_boundary(
						txd->dstbus.addr,
						remainder);
					pl08x_pre_boundary(txd->dstbus.addr,
						target_len);
			else
				txd->dstbus.fill_bytes =
						max_bytes_per_lli;
				txd->dstbus.fill_bytes = target_len;

			/*
			 *  Find the nearest
			 */
			/* Find the nearest */
			lli_len	= min(txd->srcbus.fill_bytes,
				txd->dstbus.fill_bytes);