ALSA: firewire-lib: fix amdtp_packet tracepoints event for packet_index field
The snd_firewire_lib:amdtp_packet tracepoints event includes index of
packet processed in a context handling. However in IR context, it is not
calculated as expected.
Cc: <stable@vger.kernel.org>
Fixes: 753e717986
("ALSA: firewire-lib: use packet descriptor for IR context")
Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Link: https://lore.kernel.org/r/20210513125652.110249-6-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
1be4f21d99
commit
814b43127f
|
@ -14,8 +14,8 @@
|
|||
#include <linux/tracepoint.h>
|
||||
|
||||
TRACE_EVENT(amdtp_packet,
|
||||
TP_PROTO(const struct amdtp_stream *s, u32 cycles, const __be32 *cip_header, unsigned int payload_length, unsigned int data_blocks, unsigned int data_block_counter, unsigned int index),
|
||||
TP_ARGS(s, cycles, cip_header, payload_length, data_blocks, data_block_counter, index),
|
||||
TP_PROTO(const struct amdtp_stream *s, u32 cycles, const __be32 *cip_header, unsigned int payload_length, unsigned int data_blocks, unsigned int data_block_counter, unsigned int packet_index, unsigned int index),
|
||||
TP_ARGS(s, cycles, cip_header, payload_length, data_blocks, data_block_counter, packet_index, index),
|
||||
TP_STRUCT__entry(
|
||||
__field(unsigned int, second)
|
||||
__field(unsigned int, cycle)
|
||||
|
@ -48,7 +48,7 @@ TRACE_EVENT(amdtp_packet,
|
|||
__entry->payload_quadlets = payload_length / sizeof(__be32);
|
||||
__entry->data_blocks = data_blocks;
|
||||
__entry->data_block_counter = data_block_counter,
|
||||
__entry->packet_index = s->packet_index;
|
||||
__entry->packet_index = packet_index;
|
||||
__entry->irq = !!in_interrupt();
|
||||
__entry->index = index;
|
||||
),
|
||||
|
|
|
@ -526,7 +526,7 @@ static void build_it_pkt_header(struct amdtp_stream *s, unsigned int cycle,
|
|||
}
|
||||
|
||||
trace_amdtp_packet(s, cycle, cip_header, payload_length, data_blocks,
|
||||
data_block_counter, index);
|
||||
data_block_counter, s->packet_index, index);
|
||||
}
|
||||
|
||||
static int check_cip_header(struct amdtp_stream *s, const __be32 *buf,
|
||||
|
@ -630,7 +630,7 @@ static int parse_ir_ctx_header(struct amdtp_stream *s, unsigned int cycle,
|
|||
unsigned int *payload_length,
|
||||
unsigned int *data_blocks,
|
||||
unsigned int *data_block_counter,
|
||||
unsigned int *syt, unsigned int index)
|
||||
unsigned int *syt, unsigned int packet_index, unsigned int index)
|
||||
{
|
||||
const __be32 *cip_header;
|
||||
unsigned int cip_header_size;
|
||||
|
@ -668,7 +668,7 @@ static int parse_ir_ctx_header(struct amdtp_stream *s, unsigned int cycle,
|
|||
}
|
||||
|
||||
trace_amdtp_packet(s, cycle, cip_header, *payload_length, *data_blocks,
|
||||
*data_block_counter, index);
|
||||
*data_block_counter, packet_index, index);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
@ -707,12 +707,13 @@ static int generate_device_pkt_descs(struct amdtp_stream *s,
|
|||
unsigned int packets)
|
||||
{
|
||||
unsigned int dbc = s->data_block_counter;
|
||||
unsigned int packet_index = s->packet_index;
|
||||
unsigned int queue_size = s->queue_size;
|
||||
int i;
|
||||
int err;
|
||||
|
||||
for (i = 0; i < packets; ++i) {
|
||||
struct pkt_desc *desc = descs + i;
|
||||
unsigned int index = (s->packet_index + i) % s->queue_size;
|
||||
unsigned int cycle;
|
||||
unsigned int payload_length;
|
||||
unsigned int data_blocks;
|
||||
|
@ -721,7 +722,7 @@ static int generate_device_pkt_descs(struct amdtp_stream *s,
|
|||
cycle = compute_cycle_count(ctx_header[1]);
|
||||
|
||||
err = parse_ir_ctx_header(s, cycle, ctx_header, &payload_length,
|
||||
&data_blocks, &dbc, &syt, i);
|
||||
&data_blocks, &dbc, &syt, packet_index, i);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
|
@ -729,13 +730,15 @@ static int generate_device_pkt_descs(struct amdtp_stream *s,
|
|||
desc->syt = syt;
|
||||
desc->data_blocks = data_blocks;
|
||||
desc->data_block_counter = dbc;
|
||||
desc->ctx_payload = s->buffer.packets[index].buffer;
|
||||
desc->ctx_payload = s->buffer.packets[packet_index].buffer;
|
||||
|
||||
if (!(s->flags & CIP_DBC_IS_END_EVENT))
|
||||
dbc = (dbc + desc->data_blocks) & 0xff;
|
||||
|
||||
ctx_header +=
|
||||
s->ctx_data.tx.ctx_header_size / sizeof(*ctx_header);
|
||||
|
||||
packet_index = (packet_index + 1) % queue_size;
|
||||
}
|
||||
|
||||
s->data_block_counter = dbc;
|
||||
|
|
Loading…
Reference in New Issue