u8 buffer[HSS1394_MAX_PACKET_SIZE];
        bool transaction_running;
        struct fw_transaction transaction;
+       unsigned int transaction_bytes;
        struct fw_device *fw_dev;
 };
 
 {
        struct fw_scs1x *scs = callback_data;
 
-       if (rcode == RCODE_GENERATION)
-               ;       /* TODO: retry this packet */
+       if (rcode != RCODE_GENERATION)
+               scs->transaction_bytes = 0;
 
        scs->transaction_running = false;
        schedule_work(&scs->work);
                return;
        }
 
+       if (scs->transaction_bytes > 0)
+               goto retry;
+
        i = scs->output_bytes;
        for (;;) {
                if (snd_rawmidi_transmit(stream, &byte, 1) != 1) {
        scs->output_bytes = 1;
        scs->output_escaped = false;
 
+       scs->transaction_bytes = i;
+retry:
        scs->transaction_running = true;
        generation = scs->fw_dev->generation;
        smp_rmb(); /* node_id vs. generation */
        fw_send_request(scs->fw_dev->card, &scs->transaction,
                        TCODE_WRITE_BLOCK_REQUEST, scs->fw_dev->node_id,
                        generation, scs->fw_dev->max_speed, HSS1394_ADDRESS,
-                       scs->buffer, i, scs_write_callback, scs);
+                       scs->buffer, scs->transaction_bytes,
+                       scs_write_callback, scs);
 }
 
 static int midi_capture_open(struct snd_rawmidi_substream *stream)
                scs->output_bytes = 1;
                scs->output_escaped = false;
                scs->output_idle = false;
+               scs->transaction_bytes = 0;
 
                ACCESS_ONCE(scs->output) = stream;
                schedule_work(&scs->work);