ALSA: firewire-lib: add list of packet descriptor
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>
Mon, 22 Jul 2019 03:36:58 +0000 (12:36 +0900)
committerTakashi Iwai <tiwai@suse.de>
Mon, 22 Jul 2019 14:05:03 +0000 (16:05 +0200)
In current implementation of ALSA IEC 61883-1/6 packet streaming engine,
16 packets are handled in one interrupt of isochronous context of OHCI
1394.

Overall packet processing runs for each. However, this is not better in
a point to split the processing into several parts.

This commit is an attempt to add intermediate representation for
parameters required for the parts.

Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/firewire/amdtp-stream.c
sound/firewire/amdtp-stream.h

index c8543cdb3c8c0a9a3ecbac6ca1f3c0537d2d303a..2bea15151d4a85f300e50f18d28dc9c4352650e2 100644 (file)
@@ -936,6 +936,13 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
        else
                s->tag = TAG_CIP;
 
+       s->pkt_descs = kcalloc(INTERRUPT_INTERVAL, sizeof(*s->pkt_descs),
+                              GFP_KERNEL);
+       if (!s->pkt_descs) {
+               err = -ENOMEM;
+               goto err_context;
+       }
+
        s->packet_index = 0;
        do {
                struct fw_iso_packet params;
@@ -947,7 +954,7 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
                        err = queue_out_packet(s, &params);
                }
                if (err < 0)
-                       goto err_context;
+                       goto err_pkt_descs;
        } while (s->packet_index > 0);
 
        /* NOTE: TAG1 matches CIP. This just affects in stream. */
@@ -958,12 +965,13 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
        s->callbacked = false;
        err = fw_iso_context_start(s->context, -1, 0, tag);
        if (err < 0)
-               goto err_context;
+               goto err_pkt_descs;
 
        mutex_unlock(&s->mutex);
 
        return 0;
-
+err_pkt_descs:
+       kfree(s->pkt_descs);
 err_context:
        fw_iso_context_destroy(s->context);
        s->context = ERR_PTR(-1);
@@ -1059,6 +1067,7 @@ void amdtp_stream_stop(struct amdtp_stream *s)
        fw_iso_context_destroy(s->context);
        s->context = ERR_PTR(-1);
        iso_packets_buffer_destroy(&s->buffer, s->unit);
+       kfree(s->pkt_descs);
 
        s->callbacked = false;
 
index 5996cc60f1667d6712c9489d36bf9b17884e76bb..73c492c9a5d5953953250793d7e8aa09bdc738cd 100644 (file)
@@ -94,6 +94,14 @@ enum amdtp_stream_direction {
        AMDTP_IN_STREAM
 };
 
+struct pkt_desc {
+       u32 cycle;
+       u32 syt;
+       unsigned int data_blocks;
+       unsigned int data_block_counter;
+       __be32 *ctx_payload;
+};
+
 struct amdtp_stream;
 typedef unsigned int (*amdtp_stream_process_data_blocks_t)(
                                                struct amdtp_stream *s,
@@ -110,6 +118,7 @@ struct amdtp_stream {
        struct fw_iso_context *context;
        struct iso_packets_buffer buffer;
        int packet_index;
+       struct pkt_desc *pkt_descs;
        int tag;
        union {
                struct {