Skip to content

Commit c6b0b9e

Browse files
takaswietiwai
authored andcommitted
ALSA: firewire-motu: add tracepoints for messages for unique protocol
MOTU units transfer/receive messages in each data block of their isochronous packet payload. A part of content in the message is cleard for MIDI message transmission, while the rest is unknown yet. Additional features are required to assist users and developers to reveal the details. This commit adds tracepoints for the purpose. The tracepoints are designed for MOTU's protocol version 2 and 3 (Protocol version 1 is not upstreamed yet). In the tracepoints, events are probed to gather first two 24 bit data chunks of each data block. The chunks are formatted into elements of 64 bit array with padding in MSB. Signed-off-by: Takashi Sakamoto <[email protected]> Signed-off-by: Takashi Iwai <[email protected]>
1 parent 17909c1 commit c6b0b9e

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed

sound/firewire/motu/amdtp-motu-trace.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
static void copy_sph(u32 *frame, __be32 *buffer, unsigned int data_blocks,
1717
unsigned int data_block_quadlets);
18+
static void copy_message(u64 *frames, __be32 *buffer, unsigned int data_blocks,
19+
unsigned int data_block_quadlets);
1820

1921
TRACE_EVENT(in_data_block_sph,
2022
TP_PROTO(struct amdtp_stream *s, unsigned int data_blocks, __be32 *buffer),
@@ -64,6 +66,54 @@ TRACE_EVENT(out_data_block_sph,
6466
)
6567
);
6668

69+
TRACE_EVENT(in_data_block_message,
70+
TP_PROTO(struct amdtp_stream *s, unsigned int data_blocks, __be32 *buffer),
71+
TP_ARGS(s, data_blocks, buffer),
72+
TP_STRUCT__entry(
73+
__field(int, src)
74+
__field(int, dst)
75+
__field(unsigned int, data_blocks)
76+
__dynamic_array(u64, messages, data_blocks)
77+
),
78+
TP_fast_assign(
79+
__entry->src = fw_parent_device(s->unit)->node_id;
80+
__entry->dst = fw_parent_device(s->unit)->card->node_id;
81+
__entry->data_blocks = data_blocks;
82+
copy_message(__get_dynamic_array(messages), buffer, data_blocks, s->data_block_quadlets);
83+
),
84+
TP_printk(
85+
"%04x %04x %u %s",
86+
__entry->src,
87+
__entry->dst,
88+
__entry->data_blocks,
89+
__print_array(__get_dynamic_array(messages), __entry->data_blocks, 8)
90+
)
91+
);
92+
93+
TRACE_EVENT(out_data_block_message,
94+
TP_PROTO(struct amdtp_stream *s, unsigned int data_blocks, __be32 *buffer),
95+
TP_ARGS(s, data_blocks, buffer),
96+
TP_STRUCT__entry(
97+
__field(int, src)
98+
__field(int, dst)
99+
__field(unsigned int, data_blocks)
100+
__dynamic_array(u64, messages, data_blocks)
101+
),
102+
TP_fast_assign(
103+
__entry->src = fw_parent_device(s->unit)->card->node_id;
104+
__entry->dst = fw_parent_device(s->unit)->node_id;
105+
__entry->data_blocks = data_blocks;
106+
copy_message(__get_dynamic_array(messages), buffer, data_blocks, s->data_block_quadlets);
107+
),
108+
TP_printk(
109+
"%04x %04x %u %s",
110+
__entry->src,
111+
__entry->dst,
112+
__entry->data_blocks,
113+
__print_array(__get_dynamic_array(messages), __entry->data_blocks, 8)
114+
)
115+
);
116+
67117
#endif
68118

69119
#undef TRACE_INCLUDE_PATH

sound/firewire/motu/amdtp-motu.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,21 @@ static void copy_sph(u32 *frames, __be32 *buffer, unsigned int data_blocks,
280280
}
281281
}
282282

283+
/* For tracepoints. */
284+
static void copy_message(u64 *frames, __be32 *buffer, unsigned int data_blocks,
285+
unsigned int data_block_quadlets)
286+
{
287+
unsigned int i;
288+
289+
/* This is just for v2/v3 protocol. */
290+
for (i = 0; i < data_blocks; ++i) {
291+
*frames = (be32_to_cpu(buffer[1]) << 16) |
292+
(be32_to_cpu(buffer[2]) >> 16);
293+
buffer += data_block_quadlets;
294+
frames++;
295+
}
296+
}
297+
283298
static unsigned int process_tx_data_blocks(struct amdtp_stream *s,
284299
__be32 *buffer, unsigned int data_blocks,
285300
unsigned int *syt)
@@ -288,6 +303,7 @@ static unsigned int process_tx_data_blocks(struct amdtp_stream *s,
288303
struct snd_pcm_substream *pcm;
289304

290305
trace_in_data_block_sph(s, data_blocks, buffer);
306+
trace_in_data_block_message(s, data_blocks, buffer);
291307

292308
if (p->midi_ports)
293309
read_midi_messages(s, buffer, data_blocks);
@@ -365,6 +381,7 @@ static unsigned int process_rx_data_blocks(struct amdtp_stream *s,
365381
write_sph(s, buffer, data_blocks);
366382

367383
trace_out_data_block_sph(s, data_blocks, buffer);
384+
trace_out_data_block_message(s, data_blocks, buffer);
368385

369386
return data_blocks;
370387
}

0 commit comments

Comments
 (0)