ath10k: make warm reset a bit safer and faster
[cascardo/linux.git] / sound / firewire / amdtp.c
1 /*
2  * Audio and Music Data Transmission Protocol (IEC 61883-6) streams
3  * with Common Isochronous Packet (IEC 61883-1) headers
4  *
5  * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
6  * Licensed under the terms of the GNU General Public License, version 2.
7  */
8
9 #include <linux/device.h>
10 #include <linux/err.h>
11 #include <linux/firewire.h>
12 #include <linux/module.h>
13 #include <linux/slab.h>
14 #include <linux/sched.h>
15 #include <sound/pcm.h>
16 #include <sound/pcm_params.h>
17 #include <sound/rawmidi.h>
18 #include "amdtp.h"
19
20 #define TICKS_PER_CYCLE         3072
21 #define CYCLES_PER_SECOND       8000
22 #define TICKS_PER_SECOND        (TICKS_PER_CYCLE * CYCLES_PER_SECOND)
23
24 #define TRANSFER_DELAY_TICKS    0x2e00 /* 479.17 µs */
25
26 /* isochronous header parameters */
27 #define ISO_DATA_LENGTH_SHIFT   16
28 #define TAG_CIP                 1
29
30 /* common isochronous packet header parameters */
31 #define CIP_EOH                 (1u << 31)
32 #define CIP_EOH_MASK            0x80000000
33 #define CIP_FMT_AM              (0x10 << 24)
34 #define CIP_FMT_MASK            0x3f000000
35 #define CIP_SYT_MASK            0x0000ffff
36 #define CIP_SYT_NO_INFO         0xffff
37 #define CIP_FDF_MASK            0x00ff0000
38 #define CIP_FDF_SFC_SHIFT       16
39
40 /*
41  * Audio and Music transfer protocol specific parameters
42  * only "Clock-based rate control mode" is supported
43  */
44 #define AMDTP_FDF_AM824         (0 << (CIP_FDF_SFC_SHIFT + 3))
45 #define AMDTP_FDF_NO_DATA       0xff
46 #define AMDTP_DBS_MASK          0x00ff0000
47 #define AMDTP_DBS_SHIFT         16
48 #define AMDTP_DBC_MASK          0x000000ff
49
50 /* TODO: make these configurable */
51 #define INTERRUPT_INTERVAL      16
52 #define QUEUE_LENGTH            48
53
54 #define IN_PACKET_HEADER_SIZE   4
55 #define OUT_PACKET_HEADER_SIZE  0
56
57 static void pcm_period_tasklet(unsigned long data);
58
59 /**
60  * amdtp_stream_init - initialize an AMDTP stream structure
61  * @s: the AMDTP stream to initialize
62  * @unit: the target of the stream
63  * @dir: the direction of stream
64  * @flags: the packet transmission method to use
65  */
66 int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit,
67                       enum amdtp_stream_direction dir, enum cip_flags flags)
68 {
69         s->unit = fw_unit_get(unit);
70         s->direction = dir;
71         s->flags = flags;
72         s->context = ERR_PTR(-1);
73         mutex_init(&s->mutex);
74         tasklet_init(&s->period_tasklet, pcm_period_tasklet, (unsigned long)s);
75         s->packet_index = 0;
76
77         init_waitqueue_head(&s->callback_wait);
78         s->callbacked = false;
79         s->sync_slave = NULL;
80
81         s->rx_blocks_for_midi = UINT_MAX;
82
83         return 0;
84 }
85 EXPORT_SYMBOL(amdtp_stream_init);
86
87 /**
88  * amdtp_stream_destroy - free stream resources
89  * @s: the AMDTP stream to destroy
90  */
91 void amdtp_stream_destroy(struct amdtp_stream *s)
92 {
93         WARN_ON(amdtp_stream_running(s));
94         mutex_destroy(&s->mutex);
95         fw_unit_put(s->unit);
96 }
97 EXPORT_SYMBOL(amdtp_stream_destroy);
98
99 const unsigned int amdtp_syt_intervals[CIP_SFC_COUNT] = {
100         [CIP_SFC_32000]  =  8,
101         [CIP_SFC_44100]  =  8,
102         [CIP_SFC_48000]  =  8,
103         [CIP_SFC_88200]  = 16,
104         [CIP_SFC_96000]  = 16,
105         [CIP_SFC_176400] = 32,
106         [CIP_SFC_192000] = 32,
107 };
108 EXPORT_SYMBOL(amdtp_syt_intervals);
109
110 const unsigned int amdtp_rate_table[CIP_SFC_COUNT] = {
111         [CIP_SFC_32000]  =  32000,
112         [CIP_SFC_44100]  =  44100,
113         [CIP_SFC_48000]  =  48000,
114         [CIP_SFC_88200]  =  88200,
115         [CIP_SFC_96000]  =  96000,
116         [CIP_SFC_176400] = 176400,
117         [CIP_SFC_192000] = 192000,
118 };
119 EXPORT_SYMBOL(amdtp_rate_table);
120
121 /**
122  * amdtp_stream_add_pcm_hw_constraints - add hw constraints for PCM substream
123  * @s:          the AMDTP stream, which must be initialized.
124  * @runtime:    the PCM substream runtime
125  */
126 int amdtp_stream_add_pcm_hw_constraints(struct amdtp_stream *s,
127                                         struct snd_pcm_runtime *runtime)
128 {
129         int err;
130
131         /* AM824 in IEC 61883-6 can deliver 24bit data */
132         err = snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
133         if (err < 0)
134                 goto end;
135
136         /*
137          * Currently firewire-lib processes 16 packets in one software
138          * interrupt callback. This equals to 2msec but actually the
139          * interval of the interrupts has a jitter.
140          * Additionally, even if adding a constraint to fit period size to
141          * 2msec, actual calculated frames per period doesn't equal to 2msec,
142          * depending on sampling rate.
143          * Anyway, the interval to call snd_pcm_period_elapsed() cannot 2msec.
144          * Here let us use 5msec for safe period interrupt.
145          */
146         err = snd_pcm_hw_constraint_minmax(runtime,
147                                            SNDRV_PCM_HW_PARAM_PERIOD_TIME,
148                                            5000, UINT_MAX);
149         if (err < 0)
150                 goto end;
151
152         /* Non-Blocking stream has no more constraints */
153         if (!(s->flags & CIP_BLOCKING))
154                 goto end;
155
156         /*
157          * One AMDTP packet can include some frames. In blocking mode, the
158          * number equals to SYT_INTERVAL. So the number is 8, 16 or 32,
159          * depending on its sampling rate. For accurate period interrupt, it's
160          * preferrable to aligh period/buffer sizes to current SYT_INTERVAL.
161          *
162          * TODO: These constraints can be improved with propper rules.
163          * Currently apply LCM of SYT_INTEVALs.
164          */
165         err = snd_pcm_hw_constraint_step(runtime, 0,
166                                          SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 32);
167         if (err < 0)
168                 goto end;
169         err = snd_pcm_hw_constraint_step(runtime, 0,
170                                          SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 32);
171 end:
172         return err;
173 }
174 EXPORT_SYMBOL(amdtp_stream_add_pcm_hw_constraints);
175
176 /**
177  * amdtp_stream_set_parameters - set stream parameters
178  * @s: the AMDTP stream to configure
179  * @rate: the sample rate
180  * @pcm_channels: the number of PCM samples in each data block, to be encoded
181  *                as AM824 multi-bit linear audio
182  * @midi_ports: the number of MIDI ports (i.e., MPX-MIDI Data Channels)
183  *
184  * The parameters must be set before the stream is started, and must not be
185  * changed while the stream is running.
186  */
187 void amdtp_stream_set_parameters(struct amdtp_stream *s,
188                                  unsigned int rate,
189                                  unsigned int pcm_channels,
190                                  unsigned int midi_ports)
191 {
192         unsigned int i, sfc, midi_channels;
193
194         midi_channels = DIV_ROUND_UP(midi_ports, 8);
195
196         if (WARN_ON(amdtp_stream_running(s)) |
197             WARN_ON(pcm_channels > AMDTP_MAX_CHANNELS_FOR_PCM) |
198             WARN_ON(midi_channels > AMDTP_MAX_CHANNELS_FOR_MIDI))
199                 return;
200
201         for (sfc = 0; sfc < ARRAY_SIZE(amdtp_rate_table); ++sfc)
202                 if (amdtp_rate_table[sfc] == rate)
203                         goto sfc_found;
204         WARN_ON(1);
205         return;
206
207 sfc_found:
208         s->pcm_channels = pcm_channels;
209         s->sfc = sfc;
210         s->data_block_quadlets = s->pcm_channels + midi_channels;
211         s->midi_ports = midi_ports;
212
213         s->syt_interval = amdtp_syt_intervals[sfc];
214
215         /* default buffering in the device */
216         s->transfer_delay = TRANSFER_DELAY_TICKS - TICKS_PER_CYCLE;
217         if (s->flags & CIP_BLOCKING)
218                 /* additional buffering needed to adjust for no-data packets */
219                 s->transfer_delay += TICKS_PER_SECOND * s->syt_interval / rate;
220
221         /* init the position map for PCM and MIDI channels */
222         for (i = 0; i < pcm_channels; i++)
223                 s->pcm_positions[i] = i;
224         s->midi_position = s->pcm_channels;
225 }
226 EXPORT_SYMBOL(amdtp_stream_set_parameters);
227
228 /**
229  * amdtp_stream_get_max_payload - get the stream's packet size
230  * @s: the AMDTP stream
231  *
232  * This function must not be called before the stream has been configured
233  * with amdtp_stream_set_parameters().
234  */
235 unsigned int amdtp_stream_get_max_payload(struct amdtp_stream *s)
236 {
237         return 8 + s->syt_interval * s->data_block_quadlets * 4;
238 }
239 EXPORT_SYMBOL(amdtp_stream_get_max_payload);
240
241 static void amdtp_write_s16(struct amdtp_stream *s,
242                             struct snd_pcm_substream *pcm,
243                             __be32 *buffer, unsigned int frames);
244 static void amdtp_write_s32(struct amdtp_stream *s,
245                             struct snd_pcm_substream *pcm,
246                             __be32 *buffer, unsigned int frames);
247 static void amdtp_read_s32(struct amdtp_stream *s,
248                            struct snd_pcm_substream *pcm,
249                            __be32 *buffer, unsigned int frames);
250
251 /**
252  * amdtp_stream_set_pcm_format - set the PCM format
253  * @s: the AMDTP stream to configure
254  * @format: the format of the ALSA PCM device
255  *
256  * The sample format must be set after the other paramters (rate/PCM channels/
257  * MIDI) and before the stream is started, and must not be changed while the
258  * stream is running.
259  */
260 void amdtp_stream_set_pcm_format(struct amdtp_stream *s,
261                                  snd_pcm_format_t format)
262 {
263         if (WARN_ON(amdtp_stream_pcm_running(s)))
264                 return;
265
266         switch (format) {
267         default:
268                 WARN_ON(1);
269                 /* fall through */
270         case SNDRV_PCM_FORMAT_S16:
271                 if (s->direction == AMDTP_OUT_STREAM) {
272                         s->transfer_samples = amdtp_write_s16;
273                         break;
274                 }
275                 WARN_ON(1);
276                 /* fall through */
277         case SNDRV_PCM_FORMAT_S32:
278                 if (s->direction == AMDTP_OUT_STREAM)
279                         s->transfer_samples = amdtp_write_s32;
280                 else
281                         s->transfer_samples = amdtp_read_s32;
282                 break;
283         }
284 }
285 EXPORT_SYMBOL(amdtp_stream_set_pcm_format);
286
287 /**
288  * amdtp_stream_pcm_prepare - prepare PCM device for running
289  * @s: the AMDTP stream
290  *
291  * This function should be called from the PCM device's .prepare callback.
292  */
293 void amdtp_stream_pcm_prepare(struct amdtp_stream *s)
294 {
295         tasklet_kill(&s->period_tasklet);
296         s->pcm_buffer_pointer = 0;
297         s->pcm_period_pointer = 0;
298         s->pointer_flush = true;
299 }
300 EXPORT_SYMBOL(amdtp_stream_pcm_prepare);
301
302 static unsigned int calculate_data_blocks(struct amdtp_stream *s)
303 {
304         unsigned int phase, data_blocks;
305
306         if (s->flags & CIP_BLOCKING)
307                 data_blocks = s->syt_interval;
308         else if (!cip_sfc_is_base_44100(s->sfc)) {
309                 /* Sample_rate / 8000 is an integer, and precomputed. */
310                 data_blocks = s->data_block_state;
311         } else {
312                 phase = s->data_block_state;
313
314                 /*
315                  * This calculates the number of data blocks per packet so that
316                  * 1) the overall rate is correct and exactly synchronized to
317                  *    the bus clock, and
318                  * 2) packets with a rounded-up number of blocks occur as early
319                  *    as possible in the sequence (to prevent underruns of the
320                  *    device's buffer).
321                  */
322                 if (s->sfc == CIP_SFC_44100)
323                         /* 6 6 5 6 5 6 5 ... */
324                         data_blocks = 5 + ((phase & 1) ^
325                                            (phase == 0 || phase >= 40));
326                 else
327                         /* 12 11 11 11 11 ... or 23 22 22 22 22 ... */
328                         data_blocks = 11 * (s->sfc >> 1) + (phase == 0);
329                 if (++phase >= (80 >> (s->sfc >> 1)))
330                         phase = 0;
331                 s->data_block_state = phase;
332         }
333
334         return data_blocks;
335 }
336
337 static unsigned int calculate_syt(struct amdtp_stream *s,
338                                   unsigned int cycle)
339 {
340         unsigned int syt_offset, phase, index, syt;
341
342         if (s->last_syt_offset < TICKS_PER_CYCLE) {
343                 if (!cip_sfc_is_base_44100(s->sfc))
344                         syt_offset = s->last_syt_offset + s->syt_offset_state;
345                 else {
346                 /*
347                  * The time, in ticks, of the n'th SYT_INTERVAL sample is:
348                  *   n * SYT_INTERVAL * 24576000 / sample_rate
349                  * Modulo TICKS_PER_CYCLE, the difference between successive
350                  * elements is about 1386.23.  Rounding the results of this
351                  * formula to the SYT precision results in a sequence of
352                  * differences that begins with:
353                  *   1386 1386 1387 1386 1386 1386 1387 1386 1386 1386 1387 ...
354                  * This code generates _exactly_ the same sequence.
355                  */
356                         phase = s->syt_offset_state;
357                         index = phase % 13;
358                         syt_offset = s->last_syt_offset;
359                         syt_offset += 1386 + ((index && !(index & 3)) ||
360                                               phase == 146);
361                         if (++phase >= 147)
362                                 phase = 0;
363                         s->syt_offset_state = phase;
364                 }
365         } else
366                 syt_offset = s->last_syt_offset - TICKS_PER_CYCLE;
367         s->last_syt_offset = syt_offset;
368
369         if (syt_offset < TICKS_PER_CYCLE) {
370                 syt_offset += s->transfer_delay;
371                 syt = (cycle + syt_offset / TICKS_PER_CYCLE) << 12;
372                 syt += syt_offset % TICKS_PER_CYCLE;
373
374                 return syt & CIP_SYT_MASK;
375         } else {
376                 return CIP_SYT_NO_INFO;
377         }
378 }
379
380 static void amdtp_write_s32(struct amdtp_stream *s,
381                             struct snd_pcm_substream *pcm,
382                             __be32 *buffer, unsigned int frames)
383 {
384         struct snd_pcm_runtime *runtime = pcm->runtime;
385         unsigned int channels, remaining_frames, i, c;
386         const u32 *src;
387
388         channels = s->pcm_channels;
389         src = (void *)runtime->dma_area +
390                         frames_to_bytes(runtime, s->pcm_buffer_pointer);
391         remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer;
392
393         for (i = 0; i < frames; ++i) {
394                 for (c = 0; c < channels; ++c) {
395                         buffer[s->pcm_positions[c]] =
396                                         cpu_to_be32((*src >> 8) | 0x40000000);
397                         src++;
398                 }
399                 buffer += s->data_block_quadlets;
400                 if (--remaining_frames == 0)
401                         src = (void *)runtime->dma_area;
402         }
403 }
404
405 static void amdtp_write_s16(struct amdtp_stream *s,
406                             struct snd_pcm_substream *pcm,
407                             __be32 *buffer, unsigned int frames)
408 {
409         struct snd_pcm_runtime *runtime = pcm->runtime;
410         unsigned int channels, remaining_frames, i, c;
411         const u16 *src;
412
413         channels = s->pcm_channels;
414         src = (void *)runtime->dma_area +
415                         frames_to_bytes(runtime, s->pcm_buffer_pointer);
416         remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer;
417
418         for (i = 0; i < frames; ++i) {
419                 for (c = 0; c < channels; ++c) {
420                         buffer[s->pcm_positions[c]] =
421                                         cpu_to_be32((*src << 8) | 0x42000000);
422                         src++;
423                 }
424                 buffer += s->data_block_quadlets;
425                 if (--remaining_frames == 0)
426                         src = (void *)runtime->dma_area;
427         }
428 }
429
430 static void amdtp_read_s32(struct amdtp_stream *s,
431                            struct snd_pcm_substream *pcm,
432                            __be32 *buffer, unsigned int frames)
433 {
434         struct snd_pcm_runtime *runtime = pcm->runtime;
435         unsigned int channels, remaining_frames, i, c;
436         u32 *dst;
437
438         channels = s->pcm_channels;
439         dst  = (void *)runtime->dma_area +
440                         frames_to_bytes(runtime, s->pcm_buffer_pointer);
441         remaining_frames = runtime->buffer_size - s->pcm_buffer_pointer;
442
443         for (i = 0; i < frames; ++i) {
444                 for (c = 0; c < channels; ++c) {
445                         *dst = be32_to_cpu(buffer[s->pcm_positions[c]]) << 8;
446                         dst++;
447                 }
448                 buffer += s->data_block_quadlets;
449                 if (--remaining_frames == 0)
450                         dst = (void *)runtime->dma_area;
451         }
452 }
453
454 static void amdtp_fill_pcm_silence(struct amdtp_stream *s,
455                                    __be32 *buffer, unsigned int frames)
456 {
457         unsigned int i, c;
458
459         for (i = 0; i < frames; ++i) {
460                 for (c = 0; c < s->pcm_channels; ++c)
461                         buffer[s->pcm_positions[c]] = cpu_to_be32(0x40000000);
462                 buffer += s->data_block_quadlets;
463         }
464 }
465
466 static void amdtp_fill_midi(struct amdtp_stream *s,
467                             __be32 *buffer, unsigned int frames)
468 {
469         unsigned int f, port;
470         u8 *b;
471
472         for (f = 0; f < frames; f++) {
473                 buffer[s->midi_position] = 0;
474                 b = (u8 *)&buffer[s->midi_position];
475
476                 port = (s->data_block_counter + f) % 8;
477                 if ((f >= s->rx_blocks_for_midi) ||
478                     (s->midi[port] == NULL) ||
479                     (snd_rawmidi_transmit(s->midi[port], b + 1, 1) <= 0))
480                         b[0] = 0x80;
481                 else
482                         b[0] = 0x81;
483
484                 buffer += s->data_block_quadlets;
485         }
486 }
487
488 static void amdtp_pull_midi(struct amdtp_stream *s,
489                             __be32 *buffer, unsigned int frames)
490 {
491         unsigned int f, port;
492         int len;
493         u8 *b;
494
495         for (f = 0; f < frames; f++) {
496                 port = (s->data_block_counter + f) % 8;
497                 b = (u8 *)&buffer[s->midi_position];
498
499                 len = b[0] - 0x80;
500                 if ((1 <= len) &&  (len <= 3) && (s->midi[port]))
501                         snd_rawmidi_receive(s->midi[port], b + 1, len);
502
503                 buffer += s->data_block_quadlets;
504         }
505 }
506
507 static void update_pcm_pointers(struct amdtp_stream *s,
508                                 struct snd_pcm_substream *pcm,
509                                 unsigned int frames)
510 {       unsigned int ptr;
511
512         ptr = s->pcm_buffer_pointer + frames;
513         if (ptr >= pcm->runtime->buffer_size)
514                 ptr -= pcm->runtime->buffer_size;
515         ACCESS_ONCE(s->pcm_buffer_pointer) = ptr;
516
517         s->pcm_period_pointer += frames;
518         if (s->pcm_period_pointer >= pcm->runtime->period_size) {
519                 s->pcm_period_pointer -= pcm->runtime->period_size;
520                 s->pointer_flush = false;
521                 tasklet_hi_schedule(&s->period_tasklet);
522         }
523 }
524
525 static void pcm_period_tasklet(unsigned long data)
526 {
527         struct amdtp_stream *s = (void *)data;
528         struct snd_pcm_substream *pcm = ACCESS_ONCE(s->pcm);
529
530         if (pcm)
531                 snd_pcm_period_elapsed(pcm);
532 }
533
534 static int queue_packet(struct amdtp_stream *s,
535                         unsigned int header_length,
536                         unsigned int payload_length, bool skip)
537 {
538         struct fw_iso_packet p = {0};
539         int err = 0;
540
541         if (IS_ERR(s->context))
542                 goto end;
543
544         p.interrupt = IS_ALIGNED(s->packet_index + 1, INTERRUPT_INTERVAL);
545         p.tag = TAG_CIP;
546         p.header_length = header_length;
547         p.payload_length = (!skip) ? payload_length : 0;
548         p.skip = skip;
549         err = fw_iso_context_queue(s->context, &p, &s->buffer.iso_buffer,
550                                    s->buffer.packets[s->packet_index].offset);
551         if (err < 0) {
552                 dev_err(&s->unit->device, "queueing error: %d\n", err);
553                 goto end;
554         }
555
556         if (++s->packet_index >= QUEUE_LENGTH)
557                 s->packet_index = 0;
558 end:
559         return err;
560 }
561
562 static inline int queue_out_packet(struct amdtp_stream *s,
563                                    unsigned int payload_length, bool skip)
564 {
565         return queue_packet(s, OUT_PACKET_HEADER_SIZE,
566                             payload_length, skip);
567 }
568
569 static inline int queue_in_packet(struct amdtp_stream *s)
570 {
571         return queue_packet(s, IN_PACKET_HEADER_SIZE,
572                             amdtp_stream_get_max_payload(s), false);
573 }
574
575 static void handle_out_packet(struct amdtp_stream *s, unsigned int syt)
576 {
577         __be32 *buffer;
578         unsigned int data_blocks, payload_length;
579         struct snd_pcm_substream *pcm;
580
581         if (s->packet_index < 0)
582                 return;
583
584         /* this module generate empty packet for 'no data' */
585         if (!(s->flags & CIP_BLOCKING) || (syt != CIP_SYT_NO_INFO))
586                 data_blocks = calculate_data_blocks(s);
587         else
588                 data_blocks = 0;
589
590         buffer = s->buffer.packets[s->packet_index].buffer;
591         buffer[0] = cpu_to_be32(ACCESS_ONCE(s->source_node_id_field) |
592                                 (s->data_block_quadlets << AMDTP_DBS_SHIFT) |
593                                 s->data_block_counter);
594         buffer[1] = cpu_to_be32(CIP_EOH | CIP_FMT_AM | AMDTP_FDF_AM824 |
595                                 (s->sfc << CIP_FDF_SFC_SHIFT) | syt);
596         buffer += 2;
597
598         pcm = ACCESS_ONCE(s->pcm);
599         if (pcm)
600                 s->transfer_samples(s, pcm, buffer, data_blocks);
601         else
602                 amdtp_fill_pcm_silence(s, buffer, data_blocks);
603         if (s->midi_ports)
604                 amdtp_fill_midi(s, buffer, data_blocks);
605
606         s->data_block_counter = (s->data_block_counter + data_blocks) & 0xff;
607
608         payload_length = 8 + data_blocks * 4 * s->data_block_quadlets;
609         if (queue_out_packet(s, payload_length, false) < 0) {
610                 s->packet_index = -1;
611                 amdtp_stream_pcm_abort(s);
612                 return;
613         }
614
615         if (pcm)
616                 update_pcm_pointers(s, pcm, data_blocks);
617 }
618
619 static void handle_in_packet(struct amdtp_stream *s,
620                              unsigned int payload_quadlets,
621                              __be32 *buffer)
622 {
623         u32 cip_header[2];
624         unsigned int data_blocks, data_block_quadlets, data_block_counter,
625                      dbc_interval;
626         struct snd_pcm_substream *pcm = NULL;
627         bool lost;
628
629         cip_header[0] = be32_to_cpu(buffer[0]);
630         cip_header[1] = be32_to_cpu(buffer[1]);
631
632         /*
633          * This module supports 'Two-quadlet CIP header with SYT field'.
634          * For convenience, also check FMT field is AM824 or not.
635          */
636         if (((cip_header[0] & CIP_EOH_MASK) == CIP_EOH) ||
637             ((cip_header[1] & CIP_EOH_MASK) != CIP_EOH) ||
638             ((cip_header[1] & CIP_FMT_MASK) != CIP_FMT_AM)) {
639                 dev_info_ratelimited(&s->unit->device,
640                                 "Invalid CIP header for AMDTP: %08X:%08X\n",
641                                 cip_header[0], cip_header[1]);
642                 goto end;
643         }
644
645         /* Calculate data blocks */
646         if (payload_quadlets < 3 ||
647             ((cip_header[1] & CIP_FDF_MASK) ==
648                                 (AMDTP_FDF_NO_DATA << CIP_FDF_SFC_SHIFT))) {
649                 data_blocks = 0;
650         } else {
651                 data_block_quadlets =
652                         (cip_header[0] & AMDTP_DBS_MASK) >> AMDTP_DBS_SHIFT;
653                 /* avoid division by zero */
654                 if (data_block_quadlets == 0) {
655                         dev_info_ratelimited(&s->unit->device,
656                                 "Detect invalid value in dbs field: %08X\n",
657                                 cip_header[0]);
658                         goto err;
659                 }
660                 if (s->flags & CIP_WRONG_DBS)
661                         data_block_quadlets = s->data_block_quadlets;
662
663                 data_blocks = (payload_quadlets - 2) / data_block_quadlets;
664         }
665
666         /* Check data block counter continuity */
667         data_block_counter = cip_header[0] & AMDTP_DBC_MASK;
668         if (data_blocks == 0 && (s->flags & CIP_EMPTY_HAS_WRONG_DBC) &&
669             s->data_block_counter != UINT_MAX)
670                 data_block_counter = s->data_block_counter;
671
672         if (((s->flags & CIP_SKIP_DBC_ZERO_CHECK) && data_block_counter == 0) ||
673             (s->data_block_counter == UINT_MAX)) {
674                 lost = false;
675         } else if (!(s->flags & CIP_DBC_IS_END_EVENT)) {
676                 lost = data_block_counter != s->data_block_counter;
677         } else {
678                 if ((data_blocks > 0) && (s->tx_dbc_interval > 0))
679                         dbc_interval = s->tx_dbc_interval;
680                 else
681                         dbc_interval = data_blocks;
682
683                 lost = data_block_counter !=
684                        ((s->data_block_counter + dbc_interval) & 0xff);
685         }
686
687         if (lost) {
688                 dev_info(&s->unit->device,
689                          "Detect discontinuity of CIP: %02X %02X\n",
690                          s->data_block_counter, data_block_counter);
691                 goto err;
692         }
693
694         if (data_blocks > 0) {
695                 buffer += 2;
696
697                 pcm = ACCESS_ONCE(s->pcm);
698                 if (pcm)
699                         s->transfer_samples(s, pcm, buffer, data_blocks);
700
701                 if (s->midi_ports)
702                         amdtp_pull_midi(s, buffer, data_blocks);
703         }
704
705         if (s->flags & CIP_DBC_IS_END_EVENT)
706                 s->data_block_counter = data_block_counter;
707         else
708                 s->data_block_counter =
709                                 (data_block_counter + data_blocks) & 0xff;
710 end:
711         if (queue_in_packet(s) < 0)
712                 goto err;
713
714         if (pcm)
715                 update_pcm_pointers(s, pcm, data_blocks);
716
717         return;
718 err:
719         s->packet_index = -1;
720         amdtp_stream_pcm_abort(s);
721 }
722
723 static void out_stream_callback(struct fw_iso_context *context, u32 cycle,
724                                 size_t header_length, void *header,
725                                 void *private_data)
726 {
727         struct amdtp_stream *s = private_data;
728         unsigned int i, syt, packets = header_length / 4;
729
730         /*
731          * Compute the cycle of the last queued packet.
732          * (We need only the four lowest bits for the SYT, so we can ignore
733          * that bits 0-11 must wrap around at 3072.)
734          */
735         cycle += QUEUE_LENGTH - packets;
736
737         for (i = 0; i < packets; ++i) {
738                 syt = calculate_syt(s, ++cycle);
739                 handle_out_packet(s, syt);
740         }
741         fw_iso_context_queue_flush(s->context);
742 }
743
744 static void in_stream_callback(struct fw_iso_context *context, u32 cycle,
745                                size_t header_length, void *header,
746                                void *private_data)
747 {
748         struct amdtp_stream *s = private_data;
749         unsigned int p, syt, packets, payload_quadlets;
750         __be32 *buffer, *headers = header;
751
752         /* The number of packets in buffer */
753         packets = header_length / IN_PACKET_HEADER_SIZE;
754
755         for (p = 0; p < packets; p++) {
756                 if (s->packet_index < 0)
757                         break;
758
759                 buffer = s->buffer.packets[s->packet_index].buffer;
760
761                 /* Process sync slave stream */
762                 if (s->sync_slave && s->sync_slave->callbacked) {
763                         syt = be32_to_cpu(buffer[1]) & CIP_SYT_MASK;
764                         handle_out_packet(s->sync_slave, syt);
765                 }
766
767                 /* The number of quadlets in this packet */
768                 payload_quadlets =
769                         (be32_to_cpu(headers[p]) >> ISO_DATA_LENGTH_SHIFT) / 4;
770                 handle_in_packet(s, payload_quadlets, buffer);
771         }
772
773         /* Queueing error or detecting discontinuity */
774         if (s->packet_index < 0) {
775                 /* Abort sync slave. */
776                 if (s->sync_slave) {
777                         s->sync_slave->packet_index = -1;
778                         amdtp_stream_pcm_abort(s->sync_slave);
779                 }
780                 return;
781         }
782
783         /* when sync to device, flush the packets for slave stream */
784         if (s->sync_slave && s->sync_slave->callbacked)
785                 fw_iso_context_queue_flush(s->sync_slave->context);
786
787         fw_iso_context_queue_flush(s->context);
788 }
789
790 /* processing is done by master callback */
791 static void slave_stream_callback(struct fw_iso_context *context, u32 cycle,
792                                   size_t header_length, void *header,
793                                   void *private_data)
794 {
795         return;
796 }
797
798 /* this is executed one time */
799 static void amdtp_stream_first_callback(struct fw_iso_context *context,
800                                         u32 cycle, size_t header_length,
801                                         void *header, void *private_data)
802 {
803         struct amdtp_stream *s = private_data;
804
805         /*
806          * For in-stream, first packet has come.
807          * For out-stream, prepared to transmit first packet
808          */
809         s->callbacked = true;
810         wake_up(&s->callback_wait);
811
812         if (s->direction == AMDTP_IN_STREAM)
813                 context->callback.sc = in_stream_callback;
814         else if ((s->flags & CIP_BLOCKING) && (s->flags & CIP_SYNC_TO_DEVICE))
815                 context->callback.sc = slave_stream_callback;
816         else
817                 context->callback.sc = out_stream_callback;
818
819         context->callback.sc(context, cycle, header_length, header, s);
820 }
821
822 /**
823  * amdtp_stream_start - start transferring packets
824  * @s: the AMDTP stream to start
825  * @channel: the isochronous channel on the bus
826  * @speed: firewire speed code
827  *
828  * The stream cannot be started until it has been configured with
829  * amdtp_stream_set_parameters() and it must be started before any PCM or MIDI
830  * device can be started.
831  */
832 int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
833 {
834         static const struct {
835                 unsigned int data_block;
836                 unsigned int syt_offset;
837         } initial_state[] = {
838                 [CIP_SFC_32000]  = {  4, 3072 },
839                 [CIP_SFC_48000]  = {  6, 1024 },
840                 [CIP_SFC_96000]  = { 12, 1024 },
841                 [CIP_SFC_192000] = { 24, 1024 },
842                 [CIP_SFC_44100]  = {  0,   67 },
843                 [CIP_SFC_88200]  = {  0,   67 },
844                 [CIP_SFC_176400] = {  0,   67 },
845         };
846         unsigned int header_size;
847         enum dma_data_direction dir;
848         int type, tag, err;
849
850         mutex_lock(&s->mutex);
851
852         if (WARN_ON(amdtp_stream_running(s) ||
853                     (s->data_block_quadlets < 1))) {
854                 err = -EBADFD;
855                 goto err_unlock;
856         }
857
858         if (s->direction == AMDTP_IN_STREAM &&
859             s->flags & CIP_SKIP_INIT_DBC_CHECK)
860                 s->data_block_counter = UINT_MAX;
861         else
862                 s->data_block_counter = 0;
863         s->data_block_state = initial_state[s->sfc].data_block;
864         s->syt_offset_state = initial_state[s->sfc].syt_offset;
865         s->last_syt_offset = TICKS_PER_CYCLE;
866
867         /* initialize packet buffer */
868         if (s->direction == AMDTP_IN_STREAM) {
869                 dir = DMA_FROM_DEVICE;
870                 type = FW_ISO_CONTEXT_RECEIVE;
871                 header_size = IN_PACKET_HEADER_SIZE;
872         } else {
873                 dir = DMA_TO_DEVICE;
874                 type = FW_ISO_CONTEXT_TRANSMIT;
875                 header_size = OUT_PACKET_HEADER_SIZE;
876         }
877         err = iso_packets_buffer_init(&s->buffer, s->unit, QUEUE_LENGTH,
878                                       amdtp_stream_get_max_payload(s), dir);
879         if (err < 0)
880                 goto err_unlock;
881
882         s->context = fw_iso_context_create(fw_parent_device(s->unit)->card,
883                                            type, channel, speed, header_size,
884                                            amdtp_stream_first_callback, s);
885         if (IS_ERR(s->context)) {
886                 err = PTR_ERR(s->context);
887                 if (err == -EBUSY)
888                         dev_err(&s->unit->device,
889                                 "no free stream on this controller\n");
890                 goto err_buffer;
891         }
892
893         amdtp_stream_update(s);
894
895         s->packet_index = 0;
896         do {
897                 if (s->direction == AMDTP_IN_STREAM)
898                         err = queue_in_packet(s);
899                 else
900                         err = queue_out_packet(s, 0, true);
901                 if (err < 0)
902                         goto err_context;
903         } while (s->packet_index > 0);
904
905         /* NOTE: TAG1 matches CIP. This just affects in stream. */
906         tag = FW_ISO_CONTEXT_MATCH_TAG1;
907         if (s->flags & CIP_EMPTY_WITH_TAG0)
908                 tag |= FW_ISO_CONTEXT_MATCH_TAG0;
909
910         s->callbacked = false;
911         err = fw_iso_context_start(s->context, -1, 0, tag);
912         if (err < 0)
913                 goto err_context;
914
915         mutex_unlock(&s->mutex);
916
917         return 0;
918
919 err_context:
920         fw_iso_context_destroy(s->context);
921         s->context = ERR_PTR(-1);
922 err_buffer:
923         iso_packets_buffer_destroy(&s->buffer, s->unit);
924 err_unlock:
925         mutex_unlock(&s->mutex);
926
927         return err;
928 }
929 EXPORT_SYMBOL(amdtp_stream_start);
930
931 /**
932  * amdtp_stream_pcm_pointer - get the PCM buffer position
933  * @s: the AMDTP stream that transports the PCM data
934  *
935  * Returns the current buffer position, in frames.
936  */
937 unsigned long amdtp_stream_pcm_pointer(struct amdtp_stream *s)
938 {
939         /* this optimization is allowed to be racy */
940         if (s->pointer_flush && amdtp_stream_running(s))
941                 fw_iso_context_flush_completions(s->context);
942         else
943                 s->pointer_flush = true;
944
945         return ACCESS_ONCE(s->pcm_buffer_pointer);
946 }
947 EXPORT_SYMBOL(amdtp_stream_pcm_pointer);
948
949 /**
950  * amdtp_stream_update - update the stream after a bus reset
951  * @s: the AMDTP stream
952  */
953 void amdtp_stream_update(struct amdtp_stream *s)
954 {
955         ACCESS_ONCE(s->source_node_id_field) =
956                 (fw_parent_device(s->unit)->card->node_id & 0x3f) << 24;
957 }
958 EXPORT_SYMBOL(amdtp_stream_update);
959
960 /**
961  * amdtp_stream_stop - stop sending packets
962  * @s: the AMDTP stream to stop
963  *
964  * All PCM and MIDI devices of the stream must be stopped before the stream
965  * itself can be stopped.
966  */
967 void amdtp_stream_stop(struct amdtp_stream *s)
968 {
969         mutex_lock(&s->mutex);
970
971         if (!amdtp_stream_running(s)) {
972                 mutex_unlock(&s->mutex);
973                 return;
974         }
975
976         tasklet_kill(&s->period_tasklet);
977         fw_iso_context_stop(s->context);
978         fw_iso_context_destroy(s->context);
979         s->context = ERR_PTR(-1);
980         iso_packets_buffer_destroy(&s->buffer, s->unit);
981
982         s->callbacked = false;
983
984         mutex_unlock(&s->mutex);
985 }
986 EXPORT_SYMBOL(amdtp_stream_stop);
987
988 /**
989  * amdtp_stream_pcm_abort - abort the running PCM device
990  * @s: the AMDTP stream about to be stopped
991  *
992  * If the isochronous stream needs to be stopped asynchronously, call this
993  * function first to stop the PCM device.
994  */
995 void amdtp_stream_pcm_abort(struct amdtp_stream *s)
996 {
997         struct snd_pcm_substream *pcm;
998
999         pcm = ACCESS_ONCE(s->pcm);
1000         if (pcm) {
1001                 snd_pcm_stream_lock_irq(pcm);
1002                 if (snd_pcm_running(pcm))
1003                         snd_pcm_stop(pcm, SNDRV_PCM_STATE_XRUN);
1004                 snd_pcm_stream_unlock_irq(pcm);
1005         }
1006 }
1007 EXPORT_SYMBOL(amdtp_stream_pcm_abort);