ALSA: firewire-lib: add list of packet descriptor
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>
This commit is contained in:
parent
600c8018df
commit
04130cf8e2
|
@ -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, ¶ms);
|
||||
}
|
||||
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;
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
Loading…
Reference in New Issue