amdtp-stream.c 26.8 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
static inline int queue_in_packet(struct amdtp_stream *s)
{
415
	return queue_packet(s, IN_PACKET_HEADER_SIZE, s->max_payload_length);
416 417
}

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

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

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

437
	buffer[0] = cpu_to_be32(ACCESS_ONCE(s->source_node_id_field) |
438
				(s->data_block_quadlets << CIP_DBS_SHIFT) |
439
				((s->sph << CIP_SPH_SHIFT) & CIP_SPH_MASK) |
440
				s->data_block_counter);
441 442 443 444
	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));
445

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

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

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

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

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

464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480
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;
481 482 483 484

	trace_out_packet_without_header(s, cycle, payload_length, data_blocks,
					index);

485 486 487 488 489 490 491 492 493 494 495
	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;
}

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

509
	buffer = s->buffer.packets[s->packet_index].buffer;
510 511 512
	cip_header[0] = be32_to_cpu(buffer[0]);
	cip_header[1] = be32_to_cpu(buffer[1]);

513
	trace_in_packet(s, cycle, cip_header, payload_length, index);
514

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

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

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

560 561
		data_blocks = (payload_length / 4 - 2) /
							data_block_quadlets;
562 563 564
	}

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

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

582
		lost = data_block_counter !=
583 584
		       ((s->data_block_counter + dbc_interval) & 0xff);
	}
585 586

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

593 594
	syt = be32_to_cpu(buffer[1]) & CIP_SYT_MASK;
	pcm_frames = s->process_data_blocks(s, buffer + 2, data_blocks, &syt);
595

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

605 606 607
	pcm = ACCESS_ONCE(s->pcm);
	if (pcm && pcm_frames > 0)
		update_pcm_pointers(s, pcm, pcm_frames);
608

609
	return 0;
610 611
}

612 613 614 615 616 617 618 619 620 621 622
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;
623 624 625 626

	trace_in_packet_without_header(s, cycle, payload_quadlets, data_blocks,
				       index);

627 628 629 630 631 632 633 634 635 636 637 638 639
	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;
}

640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657
/*
 * 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;
}

658 659 660 661 662 663 664
static inline u32 decrement_cycle_count(u32 cycle, unsigned int subtrahend)
{
	if (cycle < subtrahend)
		cycle += 8 * CYCLES_PER_SECOND;
	return cycle - subtrahend;
}

665
static void out_stream_callback(struct fw_iso_context *context, u32 tstamp,
666 667
				size_t header_length, void *header,
				void *private_data)
668
{
669
	struct amdtp_stream *s = private_data;
670
	unsigned int i, packets = header_length / 4;
671
	u32 cycle;
672

673 674 675
	if (s->packet_index < 0)
		return;

676 677 678 679
	cycle = compute_cycle_count(tstamp);

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

681
	for (i = 0; i < packets; ++i) {
682
		cycle = increment_cycle_count(cycle, 1);
683
		if (s->handle_packet(s, 0, cycle, i) < 0) {
684 685 686 687
			s->packet_index = -1;
			amdtp_stream_pcm_abort(s);
			return;
		}
688
	}
689

690
	fw_iso_context_queue_flush(s->context);
691 692
}

693
static void in_stream_callback(struct fw_iso_context *context, u32 tstamp,
694 695 696 697
			       size_t header_length, void *header,
			       void *private_data)
{
	struct amdtp_stream *s = private_data;
698
	unsigned int i, packets;
699
	unsigned int payload_length, max_payload_length;
700
	__be32 *headers = header;
701
	u32 cycle;
702

703 704 705
	if (s->packet_index < 0)
		return;

706 707 708
	/* The number of packets in buffer */
	packets = header_length / IN_PACKET_HEADER_SIZE;

709 710 711 712 713
	cycle = compute_cycle_count(tstamp);

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

714
	/* For buffer-over-run prevention. */
715
	max_payload_length = s->max_payload_length;
716

717
	for (i = 0; i < packets; i++) {
718
		cycle = increment_cycle_count(cycle, 1);
719

720
		/* The number of bytes in this packet */
721 722 723
		payload_length =
			(be32_to_cpu(headers[i]) >> ISO_DATA_LENGTH_SHIFT);
		if (payload_length > max_payload_length) {
724
			dev_err(&s->unit->device,
725 726
				"Detect jumbo payload: %04x %04x\n",
				payload_length, max_payload_length);
727 728 729
			break;
		}

730
		if (s->handle_packet(s, payload_length, cycle, i) < 0)
731
			break;
732 733
	}

734
	/* Queueing error or detecting invalid payload. */
735
	if (i < packets) {
736
		s->packet_index = -1;
737
		amdtp_stream_pcm_abort(s);
738 739 740
		return;
	}

741 742 743
	fw_iso_context_queue_flush(s->context);
}

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

753 754
	s->max_payload_length = amdtp_stream_get_max_payload(s);

755 756 757 758 759 760 761
	/*
	 * For in-stream, first packet has come.
	 * For out-stream, prepared to transmit first packet
	 */
	s->callbacked = true;
	wake_up(&s->callback_wait);

762 763 764 765 766
	cycle = compute_cycle_count(tstamp);

	if (s->direction == AMDTP_IN_STREAM) {
		packets = header_length / IN_PACKET_HEADER_SIZE;
		cycle = decrement_cycle_count(cycle, packets);
767
		context->callback.sc = in_stream_callback;
768 769 770 771
		if (s->flags & CIP_NO_HEADER)
			s->handle_packet = handle_in_packet_without_header;
		else
			s->handle_packet = handle_in_packet;
772 773 774
	} else {
		packets = header_length / 4;
		cycle = increment_cycle_count(cycle, QUEUE_LENGTH - packets);
775
		context->callback.sc = out_stream_callback;
776 777 778 779
		if (s->flags & CIP_NO_HEADER)
			s->handle_packet = handle_out_packet_without_header;
		else
			s->handle_packet = handle_out_packet;
780 781 782
	}

	s->start_cycle = cycle;
783

784
	context->callback.sc(context, tstamp, header_length, header, s);
785 786
}

787
/**
788 789
 * amdtp_stream_start - start transferring packets
 * @s: the AMDTP stream to start
790 791 792 793
 * @channel: the isochronous channel on the bus
 * @speed: firewire speed code
 *
 * The stream cannot be started until it has been configured with
794 795
 * amdtp_stream_set_parameters() and it must be started before any PCM or MIDI
 * device can be started.
796
 */
797
int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
798 799 800 801 802 803 804 805 806 807 808 809 810
{
	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 },
	};
811 812
	unsigned int header_size;
	enum dma_data_direction dir;
813
	int type, tag, err;
814 815 816

	mutex_lock(&s->mutex);

817
	if (WARN_ON(amdtp_stream_running(s) ||
818
		    (s->data_block_quadlets < 1))) {
819 820 821 822
		err = -EBADFD;
		goto err_unlock;
	}

823
	if (s->direction == AMDTP_IN_STREAM)
824 825 826
		s->data_block_counter = UINT_MAX;
	else
		s->data_block_counter = 0;
827 828 829 830
	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;

831 832 833 834 835 836 837 838 839 840
	/* 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;
	}
841
	err = iso_packets_buffer_init(&s->buffer, s->unit, QUEUE_LENGTH,
842
				      amdtp_stream_get_max_payload(s), dir);
843 844 845 846
	if (err < 0)
		goto err_unlock;

	s->context = fw_iso_context_create(fw_parent_device(s->unit)->card,
847
					   type, channel, speed, header_size,
848
					   amdtp_stream_first_callback, s);
849 850 851 852
	if (IS_ERR(s->context)) {
		err = PTR_ERR(s->context);
		if (err == -EBUSY)
			dev_err(&s->unit->device,
853
				"no free stream on this controller\n");
854 855 856
		goto err_buffer;
	}

857
	amdtp_stream_update(s);
858

859 860 861 862 863
	if (s->flags & CIP_NO_HEADER)
		s->tag = TAG_NO_CIP_HEADER;
	else
		s->tag = TAG_CIP;

864
	s->packet_index = 0;
865
	do {
866 867 868
		if (s->direction == AMDTP_IN_STREAM)
			err = queue_in_packet(s);
		else
869
			err = queue_out_packet(s, 0);
870 871 872
		if (err < 0)
			goto err_context;
	} while (s->packet_index > 0);
873

874
	/* NOTE: TAG1 matches CIP. This just affects in stream. */
875
	tag = FW_ISO_CONTEXT_MATCH_TAG1;
876
	if ((s->flags & CIP_EMPTY_WITH_TAG0) || (s->flags & CIP_NO_HEADER))
877 878
		tag |= FW_ISO_CONTEXT_MATCH_TAG0;

879
	s->callbacked = false;
880
	err = fw_iso_context_start(s->context, -1, 0, tag);
881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897
	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;
}
898
EXPORT_SYMBOL(amdtp_stream_start);
899

900
/**
901 902
 * amdtp_stream_pcm_pointer - get the PCM buffer position
 * @s: the AMDTP stream that transports the PCM data
903 904 905
 *
 * Returns the current buffer position, in frames.
 */
906
unsigned long amdtp_stream_pcm_pointer(struct amdtp_stream *s)
907
{
908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924
	/*
	 * 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))
925
		fw_iso_context_flush_completions(s->context);
926 927 928

	return ACCESS_ONCE(s->pcm_buffer_pointer);
}
929
EXPORT_SYMBOL(amdtp_stream_pcm_pointer);
930

931
/**
932 933
 * amdtp_stream_update - update the stream after a bus reset
 * @s: the AMDTP stream
934
 */
935
void amdtp_stream_update(struct amdtp_stream *s)
936
{
937
	/* Precomputing. */
938
	ACCESS_ONCE(s->source_node_id_field) =
939 940
		(fw_parent_device(s->unit)->card->node_id << CIP_SID_SHIFT) &
								CIP_SID_MASK;
941
}
942
EXPORT_SYMBOL(amdtp_stream_update);
943 944

/**
945 946
 * amdtp_stream_stop - stop sending packets
 * @s: the AMDTP stream to stop
947 948 949 950
 *
 * All PCM and MIDI devices of the stream must be stopped before the stream
 * itself can be stopped.
 */
951
void amdtp_stream_stop(struct amdtp_stream *s)
952 953 954
{
	mutex_lock(&s->mutex);

955
	if (!amdtp_stream_running(s)) {
956 957 958 959
		mutex_unlock(&s->mutex);
		return;
	}

960
	tasklet_kill(&s->period_tasklet);
961 962 963 964 965
	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);

966 967
	s->callbacked = false;

968 969
	mutex_unlock(&s->mutex);
}
970
EXPORT_SYMBOL(amdtp_stream_stop);
971 972

/**
973
 * amdtp_stream_pcm_abort - abort the running PCM device
974 975 976 977 978
 * @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.
 */
979
void amdtp_stream_pcm_abort(struct amdtp_stream *s)
980 981 982 983
{
	struct snd_pcm_substream *pcm;

	pcm = ACCESS_ONCE(s->pcm);
984 985
	if (pcm)
		snd_pcm_stop_xrun(pcm);
986
}
987
EXPORT_SYMBOL(amdtp_stream_pcm_abort);