static void copy_sph(u32 *frame, __be32 *buffer, unsigned int data_blocks,
                     unsigned int data_block_quadlets);
+static void copy_message(u64 *frames, __be32 *buffer, unsigned int data_blocks,
+                        unsigned int data_block_quadlets);
 
 TRACE_EVENT(in_data_block_sph,
        TP_PROTO(struct amdtp_stream *s, unsigned int data_blocks, __be32 *buffer),
        )
 );
 
+TRACE_EVENT(in_data_block_message,
+       TP_PROTO(struct amdtp_stream *s, unsigned int data_blocks, __be32 *buffer),
+       TP_ARGS(s, data_blocks, buffer),
+       TP_STRUCT__entry(
+               __field(int, src)
+               __field(int, dst)
+               __field(unsigned int, data_blocks)
+               __dynamic_array(u64, messages, data_blocks)
+       ),
+       TP_fast_assign(
+               __entry->src = fw_parent_device(s->unit)->node_id;
+               __entry->dst = fw_parent_device(s->unit)->card->node_id;
+               __entry->data_blocks = data_blocks;
+               copy_message(__get_dynamic_array(messages), buffer, data_blocks, s->data_block_quadlets);
+       ),
+       TP_printk(
+               "%04x %04x %u %s",
+               __entry->src,
+               __entry->dst,
+               __entry->data_blocks,
+               __print_array(__get_dynamic_array(messages), __entry->data_blocks, 8)
+       )
+);
+
+TRACE_EVENT(out_data_block_message,
+       TP_PROTO(struct amdtp_stream *s, unsigned int data_blocks, __be32 *buffer),
+       TP_ARGS(s, data_blocks, buffer),
+       TP_STRUCT__entry(
+               __field(int, src)
+               __field(int, dst)
+               __field(unsigned int, data_blocks)
+               __dynamic_array(u64, messages, data_blocks)
+       ),
+       TP_fast_assign(
+               __entry->src = fw_parent_device(s->unit)->card->node_id;
+               __entry->dst = fw_parent_device(s->unit)->node_id;
+               __entry->data_blocks = data_blocks;
+               copy_message(__get_dynamic_array(messages), buffer, data_blocks, s->data_block_quadlets);
+       ),
+       TP_printk(
+               "%04x %04x %u %s",
+               __entry->src,
+               __entry->dst,
+               __entry->data_blocks,
+               __print_array(__get_dynamic_array(messages), __entry->data_blocks, 8)
+       )
+);
+
 #endif
 
 #undef TRACE_INCLUDE_PATH
 
        }
 }
 
+/* For tracepoints. */
+static void copy_message(u64 *frames, __be32 *buffer, unsigned int data_blocks,
+                        unsigned int data_block_quadlets)
+{
+       unsigned int i;
+
+       /* This is just for v2/v3 protocol. */
+       for (i = 0; i < data_blocks; ++i) {
+               *frames = (be32_to_cpu(buffer[1]) << 16) |
+                         (be32_to_cpu(buffer[2]) >> 16);
+               buffer += data_block_quadlets;
+               frames++;
+       }
+}
+
 static unsigned int process_tx_data_blocks(struct amdtp_stream *s,
                                __be32 *buffer, unsigned int data_blocks,
                                unsigned int *syt)
        struct snd_pcm_substream *pcm;
 
        trace_in_data_block_sph(s, data_blocks, buffer);
+       trace_in_data_block_message(s, data_blocks, buffer);
 
        if (p->midi_ports)
                read_midi_messages(s, buffer, data_blocks);
        write_sph(s, buffer, data_blocks);
 
        trace_out_data_block_sph(s, data_blocks, buffer);
+       trace_out_data_block_message(s, data_blocks, buffer);
 
        return data_blocks;
 }