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
|
else
|
||||||
s->tag = TAG_CIP;
|
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;
|
s->packet_index = 0;
|
||||||
do {
|
do {
|
||||||
struct fw_iso_packet params;
|
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);
|
err = queue_out_packet(s, ¶ms);
|
||||||
}
|
}
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto err_context;
|
goto err_pkt_descs;
|
||||||
} while (s->packet_index > 0);
|
} while (s->packet_index > 0);
|
||||||
|
|
||||||
/* NOTE: TAG1 matches CIP. This just affects in stream. */
|
/* 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;
|
s->callbacked = false;
|
||||||
err = fw_iso_context_start(s->context, -1, 0, tag);
|
err = fw_iso_context_start(s->context, -1, 0, tag);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto err_context;
|
goto err_pkt_descs;
|
||||||
|
|
||||||
mutex_unlock(&s->mutex);
|
mutex_unlock(&s->mutex);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
err_pkt_descs:
|
||||||
|
kfree(s->pkt_descs);
|
||||||
err_context:
|
err_context:
|
||||||
fw_iso_context_destroy(s->context);
|
fw_iso_context_destroy(s->context);
|
||||||
s->context = ERR_PTR(-1);
|
s->context = ERR_PTR(-1);
|
||||||
@ -1059,6 +1067,7 @@ void amdtp_stream_stop(struct amdtp_stream *s)
|
|||||||
fw_iso_context_destroy(s->context);
|
fw_iso_context_destroy(s->context);
|
||||||
s->context = ERR_PTR(-1);
|
s->context = ERR_PTR(-1);
|
||||||
iso_packets_buffer_destroy(&s->buffer, s->unit);
|
iso_packets_buffer_destroy(&s->buffer, s->unit);
|
||||||
|
kfree(s->pkt_descs);
|
||||||
|
|
||||||
s->callbacked = false;
|
s->callbacked = false;
|
||||||
|
|
||||||
|
@ -94,6 +94,14 @@ enum amdtp_stream_direction {
|
|||||||
AMDTP_IN_STREAM
|
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;
|
struct amdtp_stream;
|
||||||
typedef unsigned int (*amdtp_stream_process_data_blocks_t)(
|
typedef unsigned int (*amdtp_stream_process_data_blocks_t)(
|
||||||
struct amdtp_stream *s,
|
struct amdtp_stream *s,
|
||||||
@ -110,6 +118,7 @@ struct amdtp_stream {
|
|||||||
struct fw_iso_context *context;
|
struct fw_iso_context *context;
|
||||||
struct iso_packets_buffer buffer;
|
struct iso_packets_buffer buffer;
|
||||||
int packet_index;
|
int packet_index;
|
||||||
|
struct pkt_desc *pkt_descs;
|
||||||
int tag;
|
int tag;
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user