summaryrefslogtreecommitdiffstats
path: root/sound/firewire/motu
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2017-04-09 08:33:29 -0400
committerTakashi Iwai <tiwai@suse.de>2017-04-11 02:30:47 -0400
commitc6b0b9e65f094deabc0c1d499b96ed5085b0f7db (patch)
treeee8009c3d9fbe82b6365fa8a1ee01944898cd30d /sound/firewire/motu
parent17909c1b3058b315698965aeb33ed6434501567c (diff)
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 <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/firewire/motu')
-rw-r--r--sound/firewire/motu/amdtp-motu-trace.h50
-rw-r--r--sound/firewire/motu/amdtp-motu.c17
2 files changed, 67 insertions, 0 deletions
diff --git a/sound/firewire/motu/amdtp-motu-trace.h b/sound/firewire/motu/amdtp-motu-trace.h
index 5862bf930c56..cd0cbfa9f96f 100644
--- a/sound/firewire/motu/amdtp-motu-trace.h
+++ b/sound/firewire/motu/amdtp-motu-trace.h
@@ -15,6 +15,8 @@
15 15
16static void copy_sph(u32 *frame, __be32 *buffer, unsigned int data_blocks, 16static void copy_sph(u32 *frame, __be32 *buffer, unsigned int data_blocks,
17 unsigned int data_block_quadlets); 17 unsigned int data_block_quadlets);
18static void copy_message(u64 *frames, __be32 *buffer, unsigned int data_blocks,
19 unsigned int data_block_quadlets);
18 20
19TRACE_EVENT(in_data_block_sph, 21TRACE_EVENT(in_data_block_sph,
20 TP_PROTO(struct amdtp_stream *s, unsigned int data_blocks, __be32 *buffer), 22 TP_PROTO(struct amdtp_stream *s, unsigned int data_blocks, __be32 *buffer),
@@ -64,6 +66,54 @@ TRACE_EVENT(out_data_block_sph,
64 ) 66 )
65); 67);
66 68
69TRACE_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
93TRACE_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
67#endif 117#endif
68 118
69#undef TRACE_INCLUDE_PATH 119#undef TRACE_INCLUDE_PATH
diff --git a/sound/firewire/motu/amdtp-motu.c b/sound/firewire/motu/amdtp-motu.c
index 2c77e8bb5424..996b5f818918 100644
--- a/sound/firewire/motu/amdtp-motu.c
+++ b/sound/firewire/motu/amdtp-motu.c
@@ -280,6 +280,21 @@ static void copy_sph(u32 *frames, __be32 *buffer, unsigned int data_blocks,
280 } 280 }
281} 281}
282 282
283/* For tracepoints. */
284static 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
283static unsigned int process_tx_data_blocks(struct amdtp_stream *s, 298static unsigned int process_tx_data_blocks(struct amdtp_stream *s,
284 __be32 *buffer, unsigned int data_blocks, 299 __be32 *buffer, unsigned int data_blocks,
285 unsigned int *syt) 300 unsigned int *syt)
@@ -288,6 +303,7 @@ static unsigned int process_tx_data_blocks(struct amdtp_stream *s,
288 struct snd_pcm_substream *pcm; 303 struct snd_pcm_substream *pcm;
289 304
290 trace_in_data_block_sph(s, data_blocks, buffer); 305 trace_in_data_block_sph(s, data_blocks, buffer);
306 trace_in_data_block_message(s, data_blocks, buffer);
291 307
292 if (p->midi_ports) 308 if (p->midi_ports)
293 read_midi_messages(s, buffer, data_blocks); 309 read_midi_messages(s, buffer, data_blocks);
@@ -365,6 +381,7 @@ static unsigned int process_rx_data_blocks(struct amdtp_stream *s,
365 write_sph(s, buffer, data_blocks); 381 write_sph(s, buffer, data_blocks);
366 382
367 trace_out_data_block_sph(s, data_blocks, buffer); 383 trace_out_data_block_sph(s, data_blocks, buffer);
384 trace_out_data_block_message(s, data_blocks, buffer);
368 385
369 return data_blocks; 386 return data_blocks;
370} 387}