(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;
        }