(syt & CIP_SYT_MASK));
}
-static int handle_out_packet(struct amdtp_stream *s, unsigned int cycle,
- const __be32 *ctx_header, __be32 *buffer,
- unsigned int index)
+static void build_it_pkt_header(struct amdtp_stream *s, unsigned int cycle,
+ struct fw_iso_packet *params,
+ unsigned int data_blocks, unsigned int syt,
+ unsigned int index)
{
- unsigned int syt;
- unsigned int data_blocks;
__be32 *cip_header;
- unsigned int pcm_frames;
- struct snd_pcm_substream *pcm;
- struct {
- struct fw_iso_packet params;
- __be32 header[IT_PKT_HEADER_SIZE_CIP / sizeof(__be32)];
- } template = { {0}, {0} };
- syt = calculate_syt(s, cycle);
- data_blocks = calculate_data_blocks(s, syt);
- pcm_frames = s->process_data_blocks(s, buffer, data_blocks, &syt);
-
- if (s->flags & CIP_DBC_IS_END_EVENT)
+ if (s->flags & CIP_DBC_IS_END_EVENT) {
s->data_block_counter =
(s->data_block_counter + data_blocks) & 0xff;
+ }
if (!(s->flags & CIP_NO_HEADER)) {
- cip_header = (__be32 *)template.params.header;
+ cip_header = (__be32 *)params->header;
generate_cip_header(s, cip_header, syt);
- template.params.header_length = 2 * sizeof(__be32);
+ params->header_length = 2 * sizeof(__be32);
} else {
cip_header = NULL;
}
- if (!(s->flags & CIP_DBC_IS_END_EVENT))
+ if (!(s->flags & CIP_DBC_IS_END_EVENT)) {
s->data_block_counter =
(s->data_block_counter + data_blocks) & 0xff;
+ }
- template.params.payload_length =
+ params->payload_length =
data_blocks * sizeof(__be32) * s->data_block_quadlets;
- trace_amdtp_packet(s, cycle, cip_header, template.params.payload_length,
+ trace_amdtp_packet(s, cycle, cip_header, params->payload_length,
data_blocks, index);
-
- if (queue_out_packet(s, &template.params) < 0)
- return -EIO;
-
- pcm = READ_ONCE(s->pcm);
- if (pcm && pcm_frames > 0)
- update_pcm_pointers(s, pcm, pcm_frames);
-
- return 0;
}
static int check_cip_header(struct amdtp_stream *s, const __be32 *buf,
for (i = 0; i < packets; ++i) {
u32 cycle;
+ unsigned int syt;
+ unsigned int data_block;
__be32 *buffer;
+ unsigned int pcm_frames;
+ struct {
+ struct fw_iso_packet params;
+ __be32 header[IT_PKT_HEADER_SIZE_CIP / sizeof(__be32)];
+ } template = { {0}, {0} };
+ struct snd_pcm_substream *pcm;
cycle = compute_it_cycle(*ctx_header);
+ syt = calculate_syt(s, cycle);
+ data_block = calculate_data_blocks(s, syt);
buffer = s->buffer.packets[s->packet_index].buffer;
+ pcm_frames = s->process_data_blocks(s, buffer, data_block, &syt);
- if (handle_out_packet(s, cycle, ctx_header, buffer, i) < 0) {
+ build_it_pkt_header(s, cycle, &template.params, data_block, syt,
+ i);
+
+ if (queue_out_packet(s, &template.params) < 0) {
cancel_stream(s);
return;
}
+ pcm = READ_ONCE(s->pcm);
+ if (pcm && pcm_frames > 0)
+ update_pcm_pointers(s, pcm, pcm_frames);
+
++ctx_header;
}