amdtp-stream.c 26.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * Audio and Music Data Transmission Protocol (IEC 61883-6) streams
 * with Common Isochronous Packet (IEC 61883-1) headers
 *
 * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
 * Licensed under the terms of the GNU General Public License, version 2.
 */

#include <linux/device.h>
#include <linux/err.h>
#include <linux/firewire.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <sound/pcm.h>
15
#include <sound/pcm_params.h>
16
#include "amdtp-stream.h"
17 18 19 20 21

#define TICKS_PER_CYCLE		3072
#define CYCLES_PER_SECOND	8000
#define TICKS_PER_SECOND	(TICKS_PER_CYCLE * CYCLES_PER_SECOND)

22 23 24 25
/* Always support Linux tracing subsystem. */
#define CREATE_TRACE_POINTS
#include "amdtp-stream-trace.h"

26
#define TRANSFER_DELAY_TICKS	0x2e00 /* 479.17 microseconds */
27

28 29
/* isochronous header parameters */
#define ISO_DATA_LENGTH_SHIFT	16
30
#define TAG_NO_CIP_HEADER	0
31 32
#define TAG_CIP			1

33
/* common isochronous packet header parameters */
34 35
#define CIP_EOH_SHIFT		31
#define CIP_EOH			(1u << CIP_EOH_SHIFT)
36
#define CIP_EOH_MASK		0x80000000
37 38 39 40
#define CIP_SID_SHIFT		24
#define CIP_SID_MASK		0x3f000000
#define CIP_DBS_MASK		0x00ff0000
#define CIP_DBS_SHIFT		16
41 42
#define CIP_SPH_MASK		0x00000400
#define CIP_SPH_SHIFT		10
43 44
#define CIP_DBC_MASK		0x000000ff
#define CIP_FMT_SHIFT		24
45
#define CIP_FMT_MASK		0x3f000000
46 47
#define CIP_FDF_MASK		0x00ff0000
#define CIP_FDF_SHIFT		16
48 49 50
#define CIP_SYT_MASK		0x0000ffff
#define CIP_SYT_NO_INFO		0xffff

51
/* Audio and Music transfer protocol specific parameters */
52
#define CIP_FMT_AM		0x10
53
#define AMDTP_FDF_NO_DATA	0xff
54 55 56 57 58

/* TODO: make these configurable */
#define INTERRUPT_INTERVAL	16
#define QUEUE_LENGTH		48

59
#define IN_PACKET_HEADER_SIZE	4
60 61
#define OUT_PACKET_HEADER_SIZE	0

62 63
static void pcm_period_tasklet(unsigned long data);

64
/**
65 66
 * amdtp_stream_init - initialize an AMDTP stream structure
 * @s: the AMDTP stream to initialize
67
 * @unit: the target of the stream
68
 * @dir: the direction of stream
69
 * @flags: the packet transmission method to use
70
 * @fmt: the value of fmt field in CIP header
71 72
 * @process_data_blocks: callback handler to process data blocks
 * @protocol_size: the size to allocate newly for protocol
73
 */
74
int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit,
75
		      enum amdtp_stream_direction dir, enum cip_flags flags,
76 77 78
		      unsigned int fmt,
		      amdtp_stream_process_data_blocks_t process_data_blocks,
		      unsigned int protocol_size)
79
{
80 81 82 83 84 85 86
	if (process_data_blocks == NULL)
		return -EINVAL;

	s->protocol = kzalloc(protocol_size, GFP_KERNEL);
	if (!s->protocol)
		return -ENOMEM;

87
	s->unit = unit;
88
	s->direction = dir;
89 90 91
	s->flags = flags;
	s->context = ERR_PTR(-1);
	mutex_init(&s->mutex);
92
	tasklet_init(&s->period_tasklet, pcm_period_tasklet, (unsigned long)s);
93
	s->packet_index = 0;
94

95 96 97
	init_waitqueue_head(&s->callback_wait);
	s->callbacked = false;

98
	s->fmt = fmt;
99
	s->process_data_blocks = process_data_blocks;
100

101 102
	return 0;
}
103
EXPORT_SYMBOL(amdtp_stream_init);
104 105

/**
106 107
 * amdtp_stream_destroy - free stream resources
 * @s: the AMDTP stream to destroy
108
 */
109
void amdtp_stream_destroy(struct amdtp_stream *s)
110
{
111 112 113 114
	/* Not initialized. */
	if (s->protocol == NULL)
		return;

115
	WARN_ON(amdtp_stream_running(s));
116
	kfree(s->protocol);
117 118
	mutex_destroy(&s->mutex);
}
119
EXPORT_SYMBOL(amdtp_stream_destroy);
120

121
const unsigned int amdtp_syt_intervals[CIP_SFC_COUNT] = {
122 123 124 125 126 127 128 129 130 131
	[CIP_SFC_32000]  =  8,
	[CIP_SFC_44100]  =  8,
	[CIP_SFC_48000]  =  8,
	[CIP_SFC_88200]  = 16,
	[CIP_SFC_96000]  = 16,
	[CIP_SFC_176400] = 32,
	[CIP_SFC_192000] = 32,
};
EXPORT_SYMBOL(amdtp_syt_intervals);

132
const unsigned int amdtp_rate_table[CIP_SFC_COUNT] = {
133 134 135 136 137 138 139 140 141 142
	[CIP_SFC_32000]  =  32000,
	[CIP_SFC_44100]  =  44100,
	[CIP_SFC_48000]  =  48000,
	[CIP_SFC_88200]  =  88200,
	[CIP_SFC_96000]  =  96000,
	[CIP_SFC_176400] = 176400,
	[CIP_SFC_192000] = 192000,
};
EXPORT_SYMBOL(amdtp_rate_table);

143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176
/**
 * amdtp_stream_add_pcm_hw_constraints - add hw constraints for PCM substream
 * @s:		the AMDTP stream, which must be initialized.
 * @runtime:	the PCM substream runtime
 */
int amdtp_stream_add_pcm_hw_constraints(struct amdtp_stream *s,
					struct snd_pcm_runtime *runtime)
{
	int err;

	/*
	 * Currently firewire-lib processes 16 packets in one software
	 * interrupt callback. This equals to 2msec but actually the
	 * interval of the interrupts has a jitter.
	 * Additionally, even if adding a constraint to fit period size to
	 * 2msec, actual calculated frames per period doesn't equal to 2msec,
	 * depending on sampling rate.
	 * Anyway, the interval to call snd_pcm_period_elapsed() cannot 2msec.
	 * Here let us use 5msec for safe period interrupt.
	 */
	err = snd_pcm_hw_constraint_minmax(runtime,
					   SNDRV_PCM_HW_PARAM_PERIOD_TIME,
					   5000, UINT_MAX);
	if (err < 0)
		goto end;

	/* Non-Blocking stream has no more constraints */
	if (!(s->flags & CIP_BLOCKING))
		goto end;

	/*
	 * One AMDTP packet can include some frames. In blocking mode, the
	 * number equals to SYT_INTERVAL. So the number is 8, 16 or 32,
	 * depending on its sampling rate. For accurate period interrupt, it's
177
	 * preferrable to align period/buffer sizes to current SYT_INTERVAL.
178
	 *
179 180
	 * TODO: These constraints can be improved with proper rules.
	 * Currently apply LCM of SYT_INTERVALs.
181 182 183 184 185 186 187 188 189 190 191 192
	 */
	err = snd_pcm_hw_constraint_step(runtime, 0,
					 SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 32);
	if (err < 0)
		goto end;
	err = snd_pcm_hw_constraint_step(runtime, 0,
					 SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 32);
end:
	return err;
}
EXPORT_SYMBOL(amdtp_stream_add_pcm_hw_constraints);

193
/**
194 195
 * amdtp_stream_set_parameters - set stream parameters
 * @s: the AMDTP stream to configure
196
 * @rate: the sample rate
197
 * @data_block_quadlets: the size of a data block in quadlet unit
198
 *
199
 * The parameters must be set before the stream is started, and must not be
200 201
 * changed while the stream is running.
 */
202 203
int amdtp_stream_set_parameters(struct amdtp_stream *s, unsigned int rate,
				unsigned int data_block_quadlets)
204
{
205
	unsigned int sfc;
206

207
	for (sfc = 0; sfc < ARRAY_SIZE(amdtp_rate_table); ++sfc) {
208
		if (amdtp_rate_table[sfc] == rate)
209 210 211 212
			break;
	}
	if (sfc == ARRAY_SIZE(amdtp_rate_table))
		return -EINVAL;
213 214

	s->sfc = sfc;
215
	s->data_block_quadlets = data_block_quadlets;
216
	s->syt_interval = amdtp_syt_intervals[sfc];
217 218 219 220 221 222

	/* default buffering in the device */
	s->transfer_delay = TRANSFER_DELAY_TICKS - TICKS_PER_CYCLE;
	if (s->flags & CIP_BLOCKING)
		/* additional buffering needed to adjust for no-data packets */
		s->transfer_delay += TICKS_PER_SECOND * s->syt_interval / rate;
223

224
	return 0;
225
}
226
EXPORT_SYMBOL(amdtp_stream_set_parameters);
227 228

/**
229 230
 * amdtp_stream_get_max_payload - get the stream's packet size
 * @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
	unsigned int multiplier = 1;
238
	unsigned int header_size = 0;
239 240 241

	if (s->flags & CIP_JUMBO_PAYLOAD)
		multiplier = 5;
242 243
	if (!(s->flags & CIP_NO_HEADER))
		header_size = 8;
244

245 246
	return header_size +
		s->syt_interval * s->data_block_quadlets * 4 * multiplier;
247
}
248
EXPORT_SYMBOL(amdtp_stream_get_max_payload);
249

250
/**
251 252
 * amdtp_stream_pcm_prepare - prepare PCM device for running
 * @s: the AMDTP stream
253 254 255
 *
 * This function should be called from the PCM device's .prepare callback.
 */
256
void amdtp_stream_pcm_prepare(struct amdtp_stream *s)
257 258 259 260 261
{
	tasklet_kill(&s->period_tasklet);
	s->pcm_buffer_pointer = 0;
	s->pcm_period_pointer = 0;
}
262
EXPORT_SYMBOL(amdtp_stream_pcm_prepare);
263

264 265
static unsigned int calculate_data_blocks(struct amdtp_stream *s,
					  unsigned int syt)
266 267 268
{
	unsigned int phase, data_blocks;

269 270 271 272 273 274 275 276
	/* Blocking mode. */
	if (s->flags & CIP_BLOCKING) {
		/* This module generate empty packet for 'no data'. */
		if (syt == CIP_SYT_NO_INFO)
			data_blocks = 0;
		else
			data_blocks = s->syt_interval;
	/* Non-blocking mode. */
277
	} else {
278 279 280 281 282
		if (!cip_sfc_is_base_44100(s->sfc)) {
			/* Sample_rate / 8000 is an integer, and precomputed. */
			data_blocks = s->data_block_state;
		} else {
			phase = s->data_block_state;
283 284 285 286 287 288 289 290 291

		/*
		 * This calculates the number of data blocks per packet so that
		 * 1) the overall rate is correct and exactly synchronized to
		 *    the bus clock, and
		 * 2) packets with a rounded-up number of blocks occur as early
		 *    as possible in the sequence (to prevent underruns of the
		 *    device's buffer).
		 */
292 293 294 295 296 297 298 299 300 301 302
			if (s->sfc == CIP_SFC_44100)
				/* 6 6 5 6 5 6 5 ... */
				data_blocks = 5 + ((phase & 1) ^
						   (phase == 0 || phase >= 40));
			else
				/* 12 11 11 11 11 ... or 23 22 22 22 22 ... */
				data_blocks = 11 * (s->sfc >> 1) + (phase == 0);
			if (++phase >= (80 >> (s->sfc >> 1)))
				phase = 0;
			s->data_block_state = phase;
		}
303 304 305 306 307
	}

	return data_blocks;
}

308
static unsigned int calculate_syt(struct amdtp_stream *s,
309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339
				  unsigned int cycle)
{
	unsigned int syt_offset, phase, index, syt;

	if (s->last_syt_offset < TICKS_PER_CYCLE) {
		if (!cip_sfc_is_base_44100(s->sfc))
			syt_offset = s->last_syt_offset + s->syt_offset_state;
		else {
		/*
		 * The time, in ticks, of the n'th SYT_INTERVAL sample is:
		 *   n * SYT_INTERVAL * 24576000 / sample_rate
		 * Modulo TICKS_PER_CYCLE, the difference between successive
		 * elements is about 1386.23.  Rounding the results of this
		 * formula to the SYT precision results in a sequence of
		 * differences that begins with:
		 *   1386 1386 1387 1386 1386 1386 1387 1386 1386 1386 1387 ...
		 * This code generates _exactly_ the same sequence.
		 */
			phase = s->syt_offset_state;
			index = phase % 13;
			syt_offset = s->last_syt_offset;
			syt_offset += 1386 + ((index && !(index & 3)) ||
					      phase == 146);
			if (++phase >= 147)
				phase = 0;
			s->syt_offset_state = phase;
		}
	} else
		syt_offset = s->last_syt_offset - TICKS_PER_CYCLE;
	s->last_syt_offset = syt_offset;

340
	if (syt_offset < TICKS_PER_CYCLE) {
341
		syt_offset += s->transfer_delay;
342 343
		syt = (cycle + syt_offset / TICKS_PER_CYCLE) << 12;
		syt += syt_offset % TICKS_PER_CYCLE;
344

345
		return syt & CIP_SYT_MASK;
346
	} else {
347
		return CIP_SYT_NO_INFO;
348
	}
349 350
}

351 352 353
static void update_pcm_pointers(struct amdtp_stream *s,
				struct snd_pcm_substream *pcm,
				unsigned int frames)
354 355 356
{
	unsigned int ptr;

357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377
	ptr = s->pcm_buffer_pointer + frames;
	if (ptr >= pcm->runtime->buffer_size)
		ptr -= pcm->runtime->buffer_size;
	ACCESS_ONCE(s->pcm_buffer_pointer) = ptr;

	s->pcm_period_pointer += frames;
	if (s->pcm_period_pointer >= pcm->runtime->period_size) {
		s->pcm_period_pointer -= pcm->runtime->period_size;
		tasklet_hi_schedule(&s->period_tasklet);
	}
}

static void pcm_period_tasklet(unsigned long data)
{
	struct amdtp_stream *s = (void *)data;
	struct snd_pcm_substream *pcm = ACCESS_ONCE(s->pcm);

	if (pcm)
		snd_pcm_period_elapsed(pcm);
}

378 379
static int queue_packet(struct amdtp_stream *s, unsigned int header_length,
			unsigned int payload_length)
380 381
{
	struct fw_iso_packet p = {0};
382 383 384 385
	int err = 0;

	if (IS_ERR(s->context))
		goto end;
386 387

	p.interrupt = IS_ALIGNED(s->packet_index + 1, INTERRUPT_INTERVAL);
388
	p.tag = s->tag;
389
	p.header_length = header_length;
390 391 392 393
	if (payload_length > 0)
		p.payload_length = payload_length;
	else
		p.skip = true;
394 395 396 397 398 399 400 401 402 403 404 405 406 407
	err = fw_iso_context_queue(s->context, &p, &s->buffer.iso_buffer,
				   s->buffer.packets[s->packet_index].offset);
	if (err < 0) {
		dev_err(&s->unit->device, "queueing error: %d\n", err);
		goto end;
	}

	if (++s->packet_index >= QUEUE_LENGTH)
		s->packet_index = 0;
end:
	return err;
}

static inline int queue_out_packet(struct amdtp_stream *s,
408
				   unsigned int payload_length)
409
{
410
	return queue_packet(s, OUT_PACKET_HEADER_SIZE, payload_length);
411 412
}

413 414 415
static inline int queue_in_packet(struct amdtp_stream *s)
{
	return queue_packet(s, IN_PACKET_HEADER_SIZE,
416
			    amdtp_stream_get_max_payload(s));
417 418
}

419 420
static int handle_out_packet(struct amdtp_stream *s,
			     unsigned int payload_length, unsigned int cycle,
421
			     unsigned int index)
422 423
{
	__be32 *buffer;
424 425
	unsigned int syt;
	unsigned int data_blocks;
426
	unsigned int pcm_frames;
427 428
	struct snd_pcm_substream *pcm;

429
	buffer = s->buffer.packets[s->packet_index].buffer;
430 431
	syt = calculate_syt(s, cycle);
	data_blocks = calculate_data_blocks(s, syt);
432
	pcm_frames = s->process_data_blocks(s, buffer + 2, data_blocks, &syt);
433

434 435 436 437
	if (s->flags & CIP_DBC_IS_END_EVENT)
		s->data_block_counter =
				(s->data_block_counter + data_blocks) & 0xff;

438
	buffer[0] = cpu_to_be32(ACCESS_ONCE(s->source_node_id_field) |
439
				(s->data_block_quadlets << CIP_DBS_SHIFT) |
440
				((s->sph << CIP_SPH_SHIFT) & CIP_SPH_MASK) |
441
				s->data_block_counter);
442 443 444 445
	buffer[1] = cpu_to_be32(CIP_EOH |
				((s->fmt << CIP_FMT_SHIFT) & CIP_FMT_MASK) |
				((s->fdf << CIP_FDF_SHIFT) & CIP_FDF_MASK) |
				(syt & CIP_SYT_MASK));
446

447 448 449
	if (!(s->flags & CIP_DBC_IS_END_EVENT))
		s->data_block_counter =
				(s->data_block_counter + data_blocks) & 0xff;
450
	payload_length = 8 + data_blocks * 4 * s->data_block_quadlets;
451

452
	trace_out_packet(s, cycle, buffer, payload_length, index);
453

454
	if (queue_out_packet(s, payload_length) < 0)
455
		return -EIO;
456

457 458 459
	pcm = ACCESS_ONCE(s->pcm);
	if (pcm && pcm_frames > 0)
		update_pcm_pointers(s, pcm, pcm_frames);
460 461 462

	/* No need to return the number of handled data blocks. */
	return 0;
463 464
}

465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492
static int handle_out_packet_without_header(struct amdtp_stream *s,
			unsigned int payload_length, unsigned int cycle,
			unsigned int index)
{
	__be32 *buffer;
	unsigned int syt;
	unsigned int data_blocks;
	unsigned int pcm_frames;
	struct snd_pcm_substream *pcm;

	buffer = s->buffer.packets[s->packet_index].buffer;
	syt = calculate_syt(s, cycle);
	data_blocks = calculate_data_blocks(s, syt);
	pcm_frames = s->process_data_blocks(s, buffer, data_blocks, &syt);
	s->data_block_counter = (s->data_block_counter + data_blocks) & 0xff;

	payload_length = data_blocks * 4 * s->data_block_quadlets;
	if (queue_out_packet(s, payload_length) < 0)
		return -EIO;

	pcm = ACCESS_ONCE(s->pcm);
	if (pcm && pcm_frames > 0)
		update_pcm_pointers(s, pcm, pcm_frames);

	/* No need to return the number of handled data blocks. */
	return 0;
}

493
static int handle_in_packet(struct amdtp_stream *s,
494
			    unsigned int payload_length, unsigned int cycle,
495
			    unsigned int index)
496
{
497
	__be32 *buffer;
498
	u32 cip_header[2];
499
	unsigned int sph, fmt, fdf, syt;
500
	unsigned int data_block_quadlets, data_block_counter, dbc_interval;
501
	unsigned int data_blocks;
502 503
	struct snd_pcm_substream *pcm;
	unsigned int pcm_frames;
504
	bool lost;
505

506
	buffer = s->buffer.packets[s->packet_index].buffer;
507 508 509
	cip_header[0] = be32_to_cpu(buffer[0]);
	cip_header[1] = be32_to_cpu(buffer[1]);

510
	trace_in_packet(s, cycle, cip_header, payload_length, index);
511

512 513
	/*
	 * This module supports 'Two-quadlet CIP header with SYT field'.
514
	 * For convenience, also check FMT field is AM824 or not.
515
	 */
516 517 518
	if ((((cip_header[0] & CIP_EOH_MASK) == CIP_EOH) ||
	     ((cip_header[1] & CIP_EOH_MASK) != CIP_EOH)) &&
	    (!(s->flags & CIP_HEADER_WITHOUT_EOH))) {
519 520 521
		dev_info_ratelimited(&s->unit->device,
				"Invalid CIP header for AMDTP: %08X:%08X\n",
				cip_header[0], cip_header[1]);
522
		data_blocks = 0;
523
		pcm_frames = 0;
524 525 526
		goto end;
	}

527
	/* Check valid protocol or not. */
528
	sph = (cip_header[0] & CIP_SPH_MASK) >> CIP_SPH_SHIFT;
529
	fmt = (cip_header[1] & CIP_FMT_MASK) >> CIP_FMT_SHIFT;
530
	if (sph != s->sph || fmt != s->fmt) {
531 532 533
		dev_info_ratelimited(&s->unit->device,
				     "Detect unexpected protocol: %08x %08x\n",
				     cip_header[0], cip_header[1]);
534
		data_blocks = 0;
535 536
		pcm_frames = 0;
		goto end;
537 538
	}

539
	/* Calculate data blocks */
540
	fdf = (cip_header[1] & CIP_FDF_MASK) >> CIP_FDF_SHIFT;
541
	if (payload_length < 12 ||
542
	    (fmt == CIP_FMT_AM && fdf == AMDTP_FDF_NO_DATA)) {
543
		data_blocks = 0;
544 545
	} else {
		data_block_quadlets =
546
			(cip_header[0] & CIP_DBS_MASK) >> CIP_DBS_SHIFT;
547 548
		/* avoid division by zero */
		if (data_block_quadlets == 0) {
549
			dev_err(&s->unit->device,
550 551
				"Detect invalid value in dbs field: %08X\n",
				cip_header[0]);
552
			return -EPROTO;
553
		}
554 555
		if (s->flags & CIP_WRONG_DBS)
			data_block_quadlets = s->data_block_quadlets;
556

557 558
		data_blocks = (payload_length / 4 - 2) /
							data_block_quadlets;
559 560 561
	}

	/* Check data block counter continuity */
562
	data_block_counter = cip_header[0] & CIP_DBC_MASK;
563
	if (data_blocks == 0 && (s->flags & CIP_EMPTY_HAS_WRONG_DBC) &&
564 565 566
	    s->data_block_counter != UINT_MAX)
		data_block_counter = s->data_block_counter;

567 568 569
	if (((s->flags & CIP_SKIP_DBC_ZERO_CHECK) &&
	     data_block_counter == s->tx_first_dbc) ||
	    s->data_block_counter == UINT_MAX) {
570 571
		lost = false;
	} else if (!(s->flags & CIP_DBC_IS_END_EVENT)) {
572
		lost = data_block_counter != s->data_block_counter;
573
	} else {
574
		if (data_blocks > 0 && s->tx_dbc_interval > 0)
575 576
			dbc_interval = s->tx_dbc_interval;
		else
577
			dbc_interval = data_blocks;
578

579
		lost = data_block_counter !=
580 581
		       ((s->data_block_counter + dbc_interval) & 0xff);
	}
582 583

	if (lost) {
584 585 586
		dev_err(&s->unit->device,
			"Detect discontinuity of CIP: %02X %02X\n",
			s->data_block_counter, data_block_counter);
587
		return -EIO;
588 589
	}

590 591
	syt = be32_to_cpu(buffer[1]) & CIP_SYT_MASK;
	pcm_frames = s->process_data_blocks(s, buffer + 2, data_blocks, &syt);
592

593 594 595 596
	if (s->flags & CIP_DBC_IS_END_EVENT)
		s->data_block_counter = data_block_counter;
	else
		s->data_block_counter =
597
				(data_block_counter + data_blocks) & 0xff;
598 599
end:
	if (queue_in_packet(s) < 0)
600
		return -EIO;
601

602 603 604
	pcm = ACCESS_ONCE(s->pcm);
	if (pcm && pcm_frames > 0)
		update_pcm_pointers(s, pcm, pcm_frames);
605

606
	return 0;
607 608
}

609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632
static int handle_in_packet_without_header(struct amdtp_stream *s,
			unsigned int payload_quadlets, unsigned int cycle,
			unsigned int index)
{
	__be32 *buffer;
	unsigned int data_blocks;
	struct snd_pcm_substream *pcm;
	unsigned int pcm_frames;

	buffer = s->buffer.packets[s->packet_index].buffer;
	data_blocks = payload_quadlets / s->data_block_quadlets;
	pcm_frames = s->process_data_blocks(s, buffer, data_blocks, NULL);
	s->data_block_counter = (s->data_block_counter + data_blocks) & 0xff;

	if (queue_in_packet(s) < 0)
		return -EIO;

	pcm = ACCESS_ONCE(s->pcm);
	if (pcm && pcm_frames > 0)
		update_pcm_pointers(s, pcm, pcm_frames);

	return 0;
}

633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650
/*
 * In CYCLE_TIMER register of IEEE 1394, 7 bits are used to represent second. On
 * the other hand, in DMA descriptors of 1394 OHCI, 3 bits are used to represent
 * it. Thus, via Linux firewire subsystem, we can get the 3 bits for second.
 */
static inline u32 compute_cycle_count(u32 tstamp)
{
	return (((tstamp >> 13) & 0x07) * 8000) + (tstamp & 0x1fff);
}

static inline u32 increment_cycle_count(u32 cycle, unsigned int addend)
{
	cycle += addend;
	if (cycle >= 8 * CYCLES_PER_SECOND)
		cycle -= 8 * CYCLES_PER_SECOND;
	return cycle;
}

651 652 653 654 655 656 657
static inline u32 decrement_cycle_count(u32 cycle, unsigned int subtrahend)
{
	if (cycle < subtrahend)
		cycle += 8 * CYCLES_PER_SECOND;
	return cycle - subtrahend;
}

658
static void out_stream_callback(struct fw_iso_context *context, u32 tstamp,
659 660
				size_t header_length, void *header,
				void *private_data)
661
{
662
	struct amdtp_stream *s = private_data;
663
	unsigned int i, packets = header_length / 4;
664
	u32 cycle;
665

666 667 668
	if (s->packet_index < 0)
		return;

669 670 671 672
	cycle = compute_cycle_count(tstamp);

	/* Align to actual cycle count for the last packet. */
	cycle = increment_cycle_count(cycle, QUEUE_LENGTH - packets);
673

674
	for (i = 0; i < packets; ++i) {
675
		cycle = increment_cycle_count(cycle, 1);
676
		if (s->handle_packet(s, 0, cycle, i) < 0) {
677 678 679 680
			s->packet_index = -1;
			amdtp_stream_pcm_abort(s);
			return;
		}
681
	}
682

683
	fw_iso_context_queue_flush(s->context);
684 685
}

686
static void in_stream_callback(struct fw_iso_context *context, u32 tstamp,
687 688 689 690
			       size_t header_length, void *header,
			       void *private_data)
{
	struct amdtp_stream *s = private_data;
691
	unsigned int i, packets;
692
	unsigned int payload_length, max_payload_length;
693
	__be32 *headers = header;
694
	u32 cycle;
695

696 697 698
	if (s->packet_index < 0)
		return;

699 700 701
	/* The number of packets in buffer */
	packets = header_length / IN_PACKET_HEADER_SIZE;

702 703 704 705 706
	cycle = compute_cycle_count(tstamp);

	/* Align to actual cycle count for the last packet. */
	cycle = decrement_cycle_count(cycle, packets);

707
	/* For buffer-over-run prevention. */
708
	max_payload_length = amdtp_stream_get_max_payload(s);
709

710
	for (i = 0; i < packets; i++) {
711
		cycle = increment_cycle_count(cycle, 1);
712 713

		/* The number of quadlets in this packet */
714 715 716
		payload_length =
			(be32_to_cpu(headers[i]) >> ISO_DATA_LENGTH_SHIFT);
		if (payload_length > max_payload_length) {
717
			dev_err(&s->unit->device,
718 719
				"Detect jumbo payload: %04x %04x\n",
				payload_length, max_payload_length);
720 721 722
			break;
		}

723
		if (s->handle_packet(s, payload_length, cycle, i) < 0)
724
			break;
725 726
	}

727
	/* Queueing error or detecting invalid payload. */
728
	if (i < packets) {
729
		s->packet_index = -1;
730
		amdtp_stream_pcm_abort(s);
731 732 733
		return;
	}

734 735 736
	fw_iso_context_queue_flush(s->context);
}

737 738
/* this is executed one time */
static void amdtp_stream_first_callback(struct fw_iso_context *context,
739
					u32 tstamp, size_t header_length,
740 741 742
					void *header, void *private_data)
{
	struct amdtp_stream *s = private_data;
743 744
	u32 cycle;
	unsigned int packets;
745 746 747 748 749 750 751 752

	/*
	 * For in-stream, first packet has come.
	 * For out-stream, prepared to transmit first packet
	 */
	s->callbacked = true;
	wake_up(&s->callback_wait);

753 754 755 756 757
	cycle = compute_cycle_count(tstamp);

	if (s->direction == AMDTP_IN_STREAM) {
		packets = header_length / IN_PACKET_HEADER_SIZE;
		cycle = decrement_cycle_count(cycle, packets);
758
		context->callback.sc = in_stream_callback;
759 760 761 762
		if (s->flags & CIP_NO_HEADER)
			s->handle_packet = handle_in_packet_without_header;
		else
			s->handle_packet = handle_in_packet;
763 764 765
	} else {
		packets = header_length / 4;
		cycle = increment_cycle_count(cycle, QUEUE_LENGTH - packets);
766
		context->callback.sc = out_stream_callback;
767 768 769 770
		if (s->flags & CIP_NO_HEADER)
			s->handle_packet = handle_out_packet_without_header;
		else
			s->handle_packet = handle_out_packet;
771 772 773
	}

	s->start_cycle = cycle;
774

775
	context->callback.sc(context, tstamp, header_length, header, s);
776 777
}

778
/**
779 780
 * amdtp_stream_start - start transferring packets
 * @s: the AMDTP stream to start
781 782 783 784
 * @channel: the isochronous channel on the bus
 * @speed: firewire speed code
 *
 * The stream cannot be started until it has been configured with
785 786
 * amdtp_stream_set_parameters() and it must be started before any PCM or MIDI
 * device can be started.
787
 */
788
int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
789 790 791 792 793 794 795 796 797 798 799 800 801
{
	static const struct {
		unsigned int data_block;
		unsigned int syt_offset;
	} initial_state[] = {
		[CIP_SFC_32000]  = {  4, 3072 },
		[CIP_SFC_48000]  = {  6, 1024 },
		[CIP_SFC_96000]  = { 12, 1024 },
		[CIP_SFC_192000] = { 24, 1024 },
		[CIP_SFC_44100]  = {  0,   67 },
		[CIP_SFC_88200]  = {  0,   67 },
		[CIP_SFC_176400] = {  0,   67 },
	};
802 803
	unsigned int header_size;
	enum dma_data_direction dir;
804
	int type, tag, err;
805 806 807

	mutex_lock(&s->mutex);

808
	if (WARN_ON(amdtp_stream_running(s) ||
809
		    (s->data_block_quadlets < 1))) {
810 811 812 813
		err = -EBADFD;
		goto err_unlock;
	}

814
	if (s->direction == AMDTP_IN_STREAM)
815 816 817
		s->data_block_counter = UINT_MAX;
	else
		s->data_block_counter = 0;
818 819 820 821
	s->data_block_state = initial_state[s->sfc].data_block;
	s->syt_offset_state = initial_state[s->sfc].syt_offset;
	s->last_syt_offset = TICKS_PER_CYCLE;

822 823 824 825 826 827 828 829 830 831
	/* initialize packet buffer */
	if (s->direction == AMDTP_IN_STREAM) {
		dir = DMA_FROM_DEVICE;
		type = FW_ISO_CONTEXT_RECEIVE;
		header_size = IN_PACKET_HEADER_SIZE;
	} else {
		dir = DMA_TO_DEVICE;
		type = FW_ISO_CONTEXT_TRANSMIT;
		header_size = OUT_PACKET_HEADER_SIZE;
	}
832
	err = iso_packets_buffer_init(&s->buffer, s->unit, QUEUE_LENGTH,
833
				      amdtp_stream_get_max_payload(s), dir);
834 835 836 837
	if (err < 0)
		goto err_unlock;

	s->context = fw_iso_context_create(fw_parent_device(s->unit)->card,
838
					   type, channel, speed, header_size,
839
					   amdtp_stream_first_callback, s);
840 841 842 843
	if (IS_ERR(s->context)) {
		err = PTR_ERR(s->context);
		if (err == -EBUSY)
			dev_err(&s->unit->device,
844
				"no free stream on this controller\n");
845 846 847
		goto err_buffer;
	}

848
	amdtp_stream_update(s);
849

850 851 852 853 854
	if (s->flags & CIP_NO_HEADER)
		s->tag = TAG_NO_CIP_HEADER;
	else
		s->tag = TAG_CIP;

855
	s->packet_index = 0;
856
	do {
857 858 859
		if (s->direction == AMDTP_IN_STREAM)
			err = queue_in_packet(s);
		else
860
			err = queue_out_packet(s, 0);
861 862 863
		if (err < 0)
			goto err_context;
	} while (s->packet_index > 0);
864

865
	/* NOTE: TAG1 matches CIP. This just affects in stream. */
866
	tag = FW_ISO_CONTEXT_MATCH_TAG1;
867
	if ((s->flags & CIP_EMPTY_WITH_TAG0) || (s->flags & CIP_NO_HEADER))
868 869
		tag |= FW_ISO_CONTEXT_MATCH_TAG0;

870
	s->callbacked = false;
871
	err = fw_iso_context_start(s->context, -1, 0, tag);
872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888
	if (err < 0)
		goto err_context;

	mutex_unlock(&s->mutex);

	return 0;

err_context:
	fw_iso_context_destroy(s->context);
	s->context = ERR_PTR(-1);
err_buffer:
	iso_packets_buffer_destroy(&s->buffer, s->unit);
err_unlock:
	mutex_unlock(&s->mutex);

	return err;
}
889
EXPORT_SYMBOL(amdtp_stream_start);
890

891
/**
892 893
 * amdtp_stream_pcm_pointer - get the PCM buffer position
 * @s: the AMDTP stream that transports the PCM data
894 895 896
 *
 * Returns the current buffer position, in frames.
 */
897
unsigned long amdtp_stream_pcm_pointer(struct amdtp_stream *s)
898
{
899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915
	/*
	 * This function is called in software IRQ context of period_tasklet or
	 * process context.
	 *
	 * When the software IRQ context was scheduled by software IRQ context
	 * of IR/IT contexts, queued packets were already handled. Therefore,
	 * no need to flush the queue in buffer anymore.
	 *
	 * When the process context reach here, some packets will be already
	 * queued in the buffer. These packets should be handled immediately
	 * to keep better granularity of PCM pointer.
	 *
	 * Later, the process context will sometimes schedules software IRQ
	 * context of the period_tasklet. Then, no need to flush the queue by
	 * the same reason as described for IR/IT contexts.
	 */
	if (!in_interrupt() && amdtp_stream_running(s))
916
		fw_iso_context_flush_completions(s->context);
917 918 919

	return ACCESS_ONCE(s->pcm_buffer_pointer);
}
920
EXPORT_SYMBOL(amdtp_stream_pcm_pointer);
921

922
/**
923 924
 * amdtp_stream_update - update the stream after a bus reset
 * @s: the AMDTP stream
925
 */
926
void amdtp_stream_update(struct amdtp_stream *s)
927
{
928
	/* Precomputing. */
929
	ACCESS_ONCE(s->source_node_id_field) =
930 931
		(fw_parent_device(s->unit)->card->node_id << CIP_SID_SHIFT) &
								CIP_SID_MASK;
932
}
933
EXPORT_SYMBOL(amdtp_stream_update);
934 935

/**
936 937
 * amdtp_stream_stop - stop sending packets
 * @s: the AMDTP stream to stop
938 939 940 941
 *
 * All PCM and MIDI devices of the stream must be stopped before the stream
 * itself can be stopped.
 */
942
void amdtp_stream_stop(struct amdtp_stream *s)
943 944 945
{
	mutex_lock(&s->mutex);

946
	if (!amdtp_stream_running(s)) {
947 948 949 950
		mutex_unlock(&s->mutex);
		return;
	}

951
	tasklet_kill(&s->period_tasklet);
952 953 954 955 956
	fw_iso_context_stop(s->context);
	fw_iso_context_destroy(s->context);
	s->context = ERR_PTR(-1);
	iso_packets_buffer_destroy(&s->buffer, s->unit);

957 958
	s->callbacked = false;

959 960
	mutex_unlock(&s->mutex);
}
961
EXPORT_SYMBOL(amdtp_stream_stop);
962 963

/**
964
 * amdtp_stream_pcm_abort - abort the running PCM device
965 966 967 968 969
 * @s: the AMDTP stream about to be stopped
 *
 * If the isochronous stream needs to be stopped asynchronously, call this
 * function first to stop the PCM device.
 */
970
void amdtp_stream_pcm_abort(struct amdtp_stream *s)
971 972 973 974
{
	struct snd_pcm_substream *pcm;

	pcm = ACCESS_ONCE(s->pcm);
975 976
	if (pcm)
		snd_pcm_stop_xrun(pcm);
977
}
978
EXPORT_SYMBOL(amdtp_stream_pcm_abort);