ALSA: firewire-lib: use circular linked list for context payload processing layer
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 9 Jan 2023 02:17:37 +0000 (11:17 +0900)
committerTakashi Iwai <tiwai@suse.de>
Mon, 9 Jan 2023 16:04:44 +0000 (17:04 +0100)
The list of packet descriptor is passed to context payload processing
layer so that each driver can copy PCM frames, MIDI messages, and device
specific data between packet payload buffer and intermediate buffer for
user space application.

The list of packet descriptor was replaced by circular linked list in a
previous commit. This commit uses circular linked in context payload
processing layer as well.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Link: https://lore.kernel.org/r/20230109021738.75543-3-o-takashi@sakamocchi.jp
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/amdtp-am824.c
sound/firewire/amdtp-stream.c
sound/firewire/amdtp-stream.h
sound/firewire/digi00x/amdtp-dot.c
sound/firewire/fireface/amdtp-ff.c
sound/firewire/motu/amdtp-motu.c
sound/firewire/motu/motu-command-dsp-message-parser.c
sound/firewire/motu/motu-register-dsp-message-parser.c
sound/firewire/motu/motu.h
sound/firewire/tascam/amdtp-tascam.c

index d9c700f652bbb8c12042062e9ce8f43bdcf7e758..cf55f7784d23355db225ffc857bb123771ce3295 100644 (file)
@@ -347,16 +347,15 @@ static void read_midi_messages(struct amdtp_stream *s, __be32 *buffer,
 }
 
 static unsigned int process_it_ctx_payloads(struct amdtp_stream *s,
-                                           const struct pkt_desc *descs,
-                                           unsigned int packets,
+                                           const struct pkt_desc *desc,
+                                           unsigned int count,
                                            struct snd_pcm_substream *pcm)
 {
        struct amdtp_am824 *p = s->protocol;
        unsigned int pcm_frames = 0;
        int i;
 
-       for (i = 0; i < packets; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __be32 *buf = desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
 
@@ -371,22 +370,23 @@ static unsigned int process_it_ctx_payloads(struct amdtp_stream *s,
                        write_midi_messages(s, buf, data_blocks,
                                            desc->data_block_counter);
                }
+
+               desc = amdtp_stream_next_packet_desc(s, desc);
        }
 
        return pcm_frames;
 }
 
 static unsigned int process_ir_ctx_payloads(struct amdtp_stream *s,
-                                           const struct pkt_desc *descs,
-                                           unsigned int packets,
+                                           const struct pkt_desc *desc,
+                                           unsigned int count,
                                            struct snd_pcm_substream *pcm)
 {
        struct amdtp_am824 *p = s->protocol;
        unsigned int pcm_frames = 0;
        int i;
 
-       for (i = 0; i < packets; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __be32 *buf = desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
 
@@ -399,6 +399,8 @@ static unsigned int process_ir_ctx_payloads(struct amdtp_stream *s,
                        read_midi_messages(s, buf, data_blocks,
                                           desc->data_block_counter);
                }
+
+               desc = amdtp_stream_next_packet_desc(s, desc);
        }
 
        return pcm_frames;
index 794ac693aae6c006a6686e83022a1f024c2badba..006dc939065f8049d4938aa00e989b8e6183f5fd 100644 (file)
@@ -1028,13 +1028,13 @@ static inline void cancel_stream(struct amdtp_stream *s)
 
 static void process_ctx_payloads(struct amdtp_stream *s,
                                 const struct pkt_desc *descs,
-                                unsigned int packets)
+                                unsigned int count)
 {
        struct snd_pcm_substream *pcm;
        unsigned int pcm_frames;
 
        pcm = READ_ONCE(s->pcm);
-       pcm_frames = s->process_ctx_payloads(s, descs, packets, pcm);
+       pcm_frames = s->process_ctx_payloads(s, descs, count, pcm);
        if (pcm)
                update_pcm_pointers(s, pcm, pcm_frames);
 }
index 4bf701796166169cc421ae2ed64a057f17e8fff5..84156d0d57b83ac1d823abd2666444c25f4126ec 100644 (file)
@@ -110,7 +110,7 @@ struct amdtp_stream;
 typedef unsigned int (*amdtp_stream_process_ctx_payloads_t)(
                                                struct amdtp_stream *s,
                                                const struct pkt_desc *desc,
-                                               unsigned int packets,
+                                               unsigned int count,
                                                struct snd_pcm_substream *pcm);
 
 struct amdtp_domain;
index 59b86c8d89e13bf888a07350fb99e25edaef8771..fcae7d07aa0393ef784c11e70c31a222e50ed90c 100644 (file)
@@ -342,15 +342,14 @@ void amdtp_dot_midi_trigger(struct amdtp_stream *s, unsigned int port,
 }
 
 static unsigned int process_ir_ctx_payloads(struct amdtp_stream *s,
-                                           const struct pkt_desc *descs,
-                                           unsigned int packets,
+                                           const struct pkt_desc *desc,
+                                           unsigned int count,
                                            struct snd_pcm_substream *pcm)
 {
        unsigned int pcm_frames = 0;
        int i;
 
-       for (i = 0; i < packets; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __be32 *buf = desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
 
@@ -360,21 +359,22 @@ static unsigned int process_ir_ctx_payloads(struct amdtp_stream *s,
                }
 
                read_midi_messages(s, buf, data_blocks);
+
+               desc = amdtp_stream_next_packet_desc(s, desc);
        }
 
        return pcm_frames;
 }
 
 static unsigned int process_it_ctx_payloads(struct amdtp_stream *s,
-                                           const struct pkt_desc *descs,
-                                           unsigned int packets,
+                                           const struct pkt_desc *desc,
+                                           unsigned int count,
                                            struct snd_pcm_substream *pcm)
 {
        unsigned int pcm_frames = 0;
        int i;
 
-       for (i = 0; i < packets; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __be32 *buf = desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
 
@@ -387,6 +387,8 @@ static unsigned int process_it_ctx_payloads(struct amdtp_stream *s,
 
                write_midi_messages(s, buf, data_blocks,
                                    desc->data_block_counter);
+
+               desc = amdtp_stream_next_packet_desc(s, desc);
        }
 
        return pcm_frames;
index 98177b0666d3e303e773fafbdfefd68340458753..2402e2be87a674e26fe15b716ed63c54fcbed95e 100644 (file)
@@ -113,15 +113,14 @@ int amdtp_ff_add_pcm_hw_constraints(struct amdtp_stream *s,
 }
 
 static unsigned int process_it_ctx_payloads(struct amdtp_stream *s,
-                                          const struct pkt_desc *descs,
-                                          unsigned int packets,
+                                          const struct pkt_desc *desc,
+                                          unsigned int count,
                                           struct snd_pcm_substream *pcm)
 {
        unsigned int pcm_frames = 0;
        int i;
 
-       for (i = 0; i < packets; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __le32 *buf = (__le32 *)desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
 
@@ -131,21 +130,22 @@ static unsigned int process_it_ctx_payloads(struct amdtp_stream *s,
                } else {
                        write_pcm_silence(s, buf, data_blocks);
                }
+
+               desc = amdtp_stream_next_packet_desc(s, desc);
        }
 
        return pcm_frames;
 }
 
 static unsigned int process_ir_ctx_payloads(struct amdtp_stream *s,
-                                           const struct pkt_desc *descs,
-                                           unsigned int packets,
+                                           const struct pkt_desc *desc,
+                                           unsigned int count,
                                            struct snd_pcm_substream *pcm)
 {
        unsigned int pcm_frames = 0;
        int i;
 
-       for (i = 0; i < packets; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __le32 *buf = (__le32 *)desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
 
@@ -153,6 +153,8 @@ static unsigned int process_ir_ctx_payloads(struct amdtp_stream *s,
                        read_pcm_s32(s, pcm, buf, data_blocks, pcm_frames);
                        pcm_frames += data_blocks;
                }
+
+               desc = amdtp_stream_next_packet_desc(s, desc);
        }
 
        return pcm_frames;
index 2fb52f481d12d78b4abdc8d0b72be5c4d1083fb5..ea0063cec5fbfe820aaa379cdaa335afbb80560d 100644 (file)
@@ -284,19 +284,19 @@ static void __maybe_unused copy_message(u64 *frames, __be32 *buffer,
        }
 }
 
-static void probe_tracepoints_events(struct amdtp_stream *s,
-                                    const struct pkt_desc *descs,
-                                    unsigned int packets)
+static void probe_tracepoints_events(struct amdtp_stream *s, const struct pkt_desc *desc,
+                                    unsigned int count)
 {
        int i;
 
-       for (i = 0; i < packets; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __be32 *buf = desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
 
                trace_data_block_sph(s, data_blocks, buf);
                trace_data_block_message(s, data_blocks, buf);
+
+               desc = amdtp_stream_next_packet_desc(s, desc);
        }
 }
 
@@ -329,12 +329,13 @@ static void cache_event_offsets(struct amdtp_motu_cache *cache, const __be32 *bu
 }
 
 static unsigned int process_ir_ctx_payloads(struct amdtp_stream *s,
-                                           const struct pkt_desc *descs,
-                                           unsigned int packets,
+                                           const struct pkt_desc *desc,
+                                           unsigned int count,
                                            struct snd_pcm_substream *pcm)
 {
        struct snd_motu *motu = container_of(s, struct snd_motu, tx_stream);
        struct amdtp_motu *p = s->protocol;
+       const struct pkt_desc *cursor = desc;
        unsigned int pcm_frames = 0;
        int i;
 
@@ -342,8 +343,7 @@ static unsigned int process_ir_ctx_payloads(struct amdtp_stream *s,
                p->cache->tx_cycle_count = (s->domain->processing_cycle.tx_start % CYCLES_PER_SECOND);
 
        // For data block processing.
-       for (i = 0; i < packets; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __be32 *buf = desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
 
@@ -356,20 +356,20 @@ static unsigned int process_ir_ctx_payloads(struct amdtp_stream *s,
 
                if (p->midi_ports)
                        read_midi_messages(s, buf, data_blocks);
-       }
 
-       if (motu->spec->flags & SND_MOTU_SPEC_REGISTER_DSP) {
-               snd_motu_register_dsp_message_parser_parse(motu, descs, packets,
-                                                          s->data_block_quadlets);
-       } else if (motu->spec->flags & SND_MOTU_SPEC_COMMAND_DSP) {
-               snd_motu_command_dsp_message_parser_parse(motu, descs, packets,
-                                                         s->data_block_quadlets);
+               desc = amdtp_stream_next_packet_desc(s, desc);
        }
 
+       desc = cursor;
+       if (motu->spec->flags & SND_MOTU_SPEC_REGISTER_DSP)
+               snd_motu_register_dsp_message_parser_parse(s, desc, count);
+       else if (motu->spec->flags & SND_MOTU_SPEC_COMMAND_DSP)
+               snd_motu_command_dsp_message_parser_parse(s, desc, count);
+
        // For tracepoints.
        if (trace_data_block_sph_enabled() ||
            trace_data_block_message_enabled())
-               probe_tracepoints_events(s, descs, packets);
+               probe_tracepoints_events(s, desc, count);
 
        return pcm_frames;
 }
@@ -397,11 +397,12 @@ static void write_sph(struct amdtp_motu_cache *cache, __be32 *buffer, unsigned i
 }
 
 static unsigned int process_it_ctx_payloads(struct amdtp_stream *s,
-                                           const struct pkt_desc *descs,
-                                           unsigned int packets,
+                                           const struct pkt_desc *desc,
+                                           unsigned int count,
                                            struct snd_pcm_substream *pcm)
 {
        struct amdtp_motu *p = s->protocol;
+       const struct pkt_desc *cursor = desc;
        unsigned int pcm_frames = 0;
        int i;
 
@@ -409,8 +410,7 @@ static unsigned int process_it_ctx_payloads(struct amdtp_stream *s,
                p->cache->rx_cycle_count = (s->domain->processing_cycle.rx_start % CYCLES_PER_SECOND);
 
        // For data block processing.
-       for (i = 0; i < packets; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __be32 *buf = desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
 
@@ -425,12 +425,16 @@ static unsigned int process_it_ctx_payloads(struct amdtp_stream *s,
                        write_midi_messages(s, buf, data_blocks);
 
                write_sph(p->cache, buf, data_blocks, s->data_block_quadlets);
+
+               desc = amdtp_stream_next_packet_desc(s, desc);
        }
 
+       desc = cursor;
+
        // For tracepoints.
        if (trace_data_block_sph_enabled() ||
            trace_data_block_message_enabled())
-               probe_tracepoints_events(s, descs, packets);
+               probe_tracepoints_events(s, desc, count);
 
        return pcm_frames;
 }
index 9efe4d364baf5cc2de602d4be8b9c9c4f03156ec..5d8a86a12f1f4534af29b58c1ea589dffcf75535 100644 (file)
@@ -80,9 +80,11 @@ int snd_motu_command_dsp_message_parser_init(struct snd_motu *motu, enum cip_sfc
 #define FRAGMENTS_PER_VALUE            4
 #define VALUES_AT_IMAGE_END            0xffffffffffffffff
 
-void snd_motu_command_dsp_message_parser_parse(struct snd_motu *motu, const struct pkt_desc *descs,
-                                       unsigned int desc_count, unsigned int data_block_quadlets)
+void snd_motu_command_dsp_message_parser_parse(const struct amdtp_stream *s,
+                                       const struct pkt_desc *desc, unsigned int count)
 {
+       struct snd_motu *motu = container_of(s, struct snd_motu, tx_stream);
+       unsigned int data_block_quadlets = s->data_block_quadlets;
        struct msg_parser *parser = motu->message_parser;
        unsigned int interval = parser->interval;
        unsigned long flags;
@@ -90,12 +92,13 @@ void snd_motu_command_dsp_message_parser_parse(struct snd_motu *motu, const stru
 
        spin_lock_irqsave(&parser->lock, flags);
 
-       for (i = 0; i < desc_count; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __be32 *buffer = desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
                int j;
 
+               desc = amdtp_stream_next_packet_desc(s, desc);
+
                for (j = 0; j < data_blocks; ++j) {
                        u8 *b = (u8 *)buffer;
                        buffer += data_block_quadlets;
index 0c587567540f22d1f6c77a647a4f015d86014a05..ef3b0b0f0dab9a63421fe48454e1eb1bfdee6ab7 100644 (file)
@@ -142,9 +142,11 @@ static void queue_event(struct snd_motu *motu, u8 msg_type, u8 identifier0, u8 i
        parser->push_pos = pos;
 }
 
-void snd_motu_register_dsp_message_parser_parse(struct snd_motu *motu, const struct pkt_desc *descs,
-                                       unsigned int desc_count, unsigned int data_block_quadlets)
+void snd_motu_register_dsp_message_parser_parse(const struct amdtp_stream *s,
+                                               const struct pkt_desc *desc, unsigned int count)
 {
+       struct snd_motu *motu = container_of(s, struct snd_motu, tx_stream);
+       unsigned int data_block_quadlets = s->data_block_quadlets;
        struct msg_parser *parser = motu->message_parser;
        bool meter_pos_quirk = parser->meter_pos_quirk;
        unsigned int pos = parser->push_pos;
@@ -153,12 +155,13 @@ void snd_motu_register_dsp_message_parser_parse(struct snd_motu *motu, const str
 
        spin_lock_irqsave(&parser->lock, flags);
 
-       for (i = 0; i < desc_count; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __be32 *buffer = desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
                int j;
 
+               desc = amdtp_stream_next_packet_desc(s, desc);
+
                for (j = 0; j < data_blocks; ++j) {
                        u8 *b = (u8 *)buffer;
                        u8 msg_type = (b[MSG_FLAG_POS] & MSG_FLAG_TYPE_MASK) >> MSG_FLAG_TYPE_SHIFT;
index 4189f2192284aba110280069028a72e915e7f7da..3b1dc98a7be023231fe041611778e178bd8b8793 100644 (file)
@@ -279,8 +279,8 @@ static inline int snd_motu_protocol_cache_packet_formats(struct snd_motu *motu)
 
 int snd_motu_register_dsp_message_parser_new(struct snd_motu *motu);
 int snd_motu_register_dsp_message_parser_init(struct snd_motu *motu);
-void snd_motu_register_dsp_message_parser_parse(struct snd_motu *motu, const struct pkt_desc *descs,
-                                       unsigned int desc_count, unsigned int data_block_quadlets);
+void snd_motu_register_dsp_message_parser_parse(const struct amdtp_stream *s,
+                                       const struct pkt_desc *descs, unsigned int count);
 void snd_motu_register_dsp_message_parser_copy_meter(struct snd_motu *motu,
                                        struct snd_firewire_motu_register_dsp_meter *meter);
 void snd_motu_register_dsp_message_parser_copy_parameter(struct snd_motu *motu,
@@ -290,8 +290,8 @@ bool snd_motu_register_dsp_message_parser_copy_event(struct snd_motu *motu, u32
 
 int snd_motu_command_dsp_message_parser_new(struct snd_motu *motu);
 int snd_motu_command_dsp_message_parser_init(struct snd_motu *motu, enum cip_sfc sfc);
-void snd_motu_command_dsp_message_parser_parse(struct snd_motu *motu, const struct pkt_desc *descs,
-                                       unsigned int desc_count, unsigned int data_block_quadlets);
+void snd_motu_command_dsp_message_parser_parse(const struct amdtp_stream *s,
+                                       const struct pkt_desc *descs, unsigned int count);
 void snd_motu_command_dsp_message_parser_copy_meter(struct snd_motu *motu,
                                        struct snd_firewire_motu_command_dsp_meter *meter);
 
index 64d66a8025455f38c27521cf47153e97f2573dba..c367a6ee61217f3226ce29a0090d83ddbc5525a3 100644 (file)
@@ -177,15 +177,14 @@ static void read_status_messages(struct amdtp_stream *s,
 }
 
 static unsigned int process_ir_ctx_payloads(struct amdtp_stream *s,
-                                           const struct pkt_desc *descs,
-                                           unsigned int packets,
+                                           const struct pkt_desc *desc,
+                                           unsigned int count,
                                            struct snd_pcm_substream *pcm)
 {
        unsigned int pcm_frames = 0;
        int i;
 
-       for (i = 0; i < packets; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __be32 *buf = desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
 
@@ -195,21 +194,22 @@ static unsigned int process_ir_ctx_payloads(struct amdtp_stream *s,
                }
 
                read_status_messages(s, buf, data_blocks);
+
+               desc = amdtp_stream_next_packet_desc(s, desc);
        }
 
        return pcm_frames;
 }
 
 static unsigned int process_it_ctx_payloads(struct amdtp_stream *s,
-                                           const struct pkt_desc *descs,
-                                           unsigned int packets,
+                                           const struct pkt_desc *desc,
+                                           unsigned int count,
                                            struct snd_pcm_substream *pcm)
 {
        unsigned int pcm_frames = 0;
        int i;
 
-       for (i = 0; i < packets; ++i) {
-               const struct pkt_desc *desc = descs + i;
+       for (i = 0; i < count; ++i) {
                __be32 *buf = desc->ctx_payload;
                unsigned int data_blocks = desc->data_blocks;
 
@@ -219,6 +219,8 @@ static unsigned int process_it_ctx_payloads(struct amdtp_stream *s,
                } else {
                        write_pcm_silence(s, buf, data_blocks);
                }
+
+               desc = amdtp_stream_next_packet_desc(s, desc);
        }
 
        return pcm_frames;