Takashi Iwai b0d88d
From 1be4f21d9984fa9835fae5411a29465dc5aece6f Mon Sep 17 00:00:00 2001
Takashi Iwai b0d88d
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Takashi Iwai b0d88d
Date: Thu, 13 May 2021 21:56:51 +0900
Takashi Iwai b0d88d
Subject: [PATCH] ALSA: firewire-lib: fix calculation for size of IR context payload
Takashi Iwai b0d88d
Git-commit: 1be4f21d9984fa9835fae5411a29465dc5aece6f
Takashi Iwai b0d88d
Patch-mainline: v5.13-rc3
Takashi Iwai b0d88d
References: git-fixes
Takashi Iwai b0d88d
Takashi Iwai b0d88d
The quadlets for CIP header is handled as a part of IR context header,
Takashi Iwai b0d88d
thus it doesn't join in IR context payload. However current calculation
Takashi Iwai b0d88d
includes the quadlets in IR context payload.
Takashi Iwai b0d88d
Takashi Iwai b0d88d
Cc: <stable@vger.kernel.org>
Takashi Iwai b0d88d
Fixes: f11453c7cc01 ("ALSA: firewire-lib: use 16 bytes IR context header to separate CIP header")
Takashi Iwai b0d88d
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Takashi Iwai b0d88d
Link: https://lore.kernel.org/r/20210513125652.110249-5-o-takashi@sakamocchi.jp
Takashi Iwai b0d88d
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Takashi Iwai b0d88d
Takashi Iwai b0d88d
---
Takashi Iwai b0d88d
 sound/firewire/amdtp-stream.c |   13 ++++++-------
Takashi Iwai b0d88d
 1 file changed, 6 insertions(+), 7 deletions(-)
Takashi Iwai b0d88d
Takashi Iwai b0d88d
--- a/sound/firewire/amdtp-stream.c
Takashi Iwai b0d88d
+++ b/sound/firewire/amdtp-stream.c
Takashi Iwai b0d88d
@@ -889,23 +889,22 @@ int amdtp_stream_start(struct amdtp_stre
Takashi Iwai b0d88d
 		s->ctx_data.rx.last_syt_offset = TICKS_PER_CYCLE;
Takashi Iwai b0d88d
 	}
Takashi Iwai b0d88d
 
Takashi Iwai b0d88d
-	/* initialize packet buffer */
Takashi Iwai b0d88d
+	// initialize packet buffer.
Takashi Iwai b0d88d
+	max_ctx_payload_size = amdtp_stream_get_max_payload(s);
Takashi Iwai b0d88d
 	if (s->direction == AMDTP_IN_STREAM) {
Takashi Iwai b0d88d
 		dir = DMA_FROM_DEVICE;
Takashi Iwai b0d88d
 		type = FW_ISO_CONTEXT_RECEIVE;
Takashi Iwai b0d88d
-		if (!(s->flags & CIP_NO_HEADER))
Takashi Iwai b0d88d
+		if (!(s->flags & CIP_NO_HEADER)) {
Takashi Iwai b0d88d
+			max_ctx_payload_size -= 8;
Takashi Iwai b0d88d
 			ctx_header_size = IR_CTX_HEADER_SIZE_CIP;
Takashi Iwai b0d88d
-		else
Takashi Iwai b0d88d
+		} else {
Takashi Iwai b0d88d
 			ctx_header_size = IR_CTX_HEADER_SIZE_NO_CIP;
Takashi Iwai b0d88d
-
Takashi Iwai b0d88d
-		max_ctx_payload_size = amdtp_stream_get_max_payload(s) -
Takashi Iwai b0d88d
-				       ctx_header_size;
Takashi Iwai b0d88d
+		}
Takashi Iwai b0d88d
 	} else {
Takashi Iwai b0d88d
 		dir = DMA_TO_DEVICE;
Takashi Iwai b0d88d
 		type = FW_ISO_CONTEXT_TRANSMIT;
Takashi Iwai b0d88d
 		ctx_header_size = 0;	// No effect for IT context.
Takashi Iwai b0d88d
 
Takashi Iwai b0d88d
-		max_ctx_payload_size = amdtp_stream_get_max_payload(s);
Takashi Iwai b0d88d
 		if (!(s->flags & CIP_NO_HEADER))
Takashi Iwai b0d88d
 			max_ctx_payload_size -= IT_PKT_HEADER_SIZE_CIP;
Takashi Iwai b0d88d
 	}