ALSA: firewire-lib: fix invalid length of rx packet payload for tracepoint events
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Sun, 7 Jul 2019 12:07:53 +0000 (21:07 +0900)
committerTakashi Iwai <tiwai@suse.de>
Mon, 8 Jul 2019 12:50:36 +0000 (14:50 +0200)
Although CIP header is handled as context header, the length of isochronous
packet includes two quadlets for its payload. In tracepoints event the
value of payload_quadlets should includes the two quadlets. But at present
it doesn't.

This commit fixes the bug.

Fixes: b18f0cfaf16b ("ALSA: firewire-lib: use 8 byte packet header for IT context to separate CIP header from CIP payload")
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/amdtp-stream.c

index 87a46bd604962a6bc44df21da681e45ac498d9cc..427624009de958d5cfc2641b5ec4f272a3ec92fc 100644 (file)
@@ -490,8 +490,12 @@ static void build_it_pkt_header(struct amdtp_stream *s, unsigned int cycle,
                                unsigned int data_blocks, unsigned int syt,
                                unsigned int index)
 {
+       unsigned int payload_length;
        __be32 *cip_header;
 
+       payload_length = data_blocks * sizeof(__be32) * s->data_block_quadlets;
+       params->payload_length = payload_length;
+
        if (s->flags & CIP_DBC_IS_END_EVENT) {
                s->data_block_counter =
                                (s->data_block_counter + data_blocks) & 0xff;
@@ -501,6 +505,7 @@ static void build_it_pkt_header(struct amdtp_stream *s, unsigned int cycle,
                cip_header = (__be32 *)params->header;
                generate_cip_header(s, cip_header, syt);
                params->header_length = 2 * sizeof(__be32);
+               payload_length += params->header_length;
        } else {
                cip_header = NULL;
        }
@@ -510,11 +515,8 @@ static void build_it_pkt_header(struct amdtp_stream *s, unsigned int cycle,
                                (s->data_block_counter + data_blocks) & 0xff;
        }
 
-       params->payload_length =
-                       data_blocks * sizeof(__be32) * s->data_block_quadlets;
-
-       trace_amdtp_packet(s, cycle, cip_header, params->payload_length,
-                          data_blocks, index);
+       trace_amdtp_packet(s, cycle, cip_header, payload_length, data_blocks,
+                          index);
 }
 
 static int check_cip_header(struct amdtp_stream *s, const __be32 *buf,