Skip to content

Commit ff0fb5a

Browse files
takaswietiwai
authored andcommitted
ALSA: firewire-lib: use the same prototype for functions to handle packet
Audio and music units of RME Fireface series use its own protocol for isochronous packets to transfer data. This protocol requires ALSA IEC 61883-1/6 engine to have alternative functions. This commit is a preparation for the protocol. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
1 parent d3fc7aa commit ff0fb5a

File tree

2 files changed

+19
-18
lines changed

2 files changed

+19
-18
lines changed

sound/firewire/amdtp-stream-trace.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
#include <linux/tracepoint.h>
1515

1616
TRACE_EVENT(in_packet,
17-
TP_PROTO(const struct amdtp_stream *s, u32 cycles, u32 cip_header[2], unsigned int payload_quadlets, unsigned int index),
18-
TP_ARGS(s, cycles, cip_header, payload_quadlets, index),
17+
TP_PROTO(const struct amdtp_stream *s, u32 cycles, u32 cip_header[2], unsigned int payload_length, unsigned int index),
18+
TP_ARGS(s, cycles, cip_header, payload_length, index),
1919
TP_STRUCT__entry(
2020
__field(unsigned int, second)
2121
__field(unsigned int, cycle)
@@ -37,7 +37,7 @@ TRACE_EVENT(in_packet,
3737
__entry->dest = fw_parent_device(s->unit)->card->node_id;
3838
__entry->cip_header0 = cip_header[0];
3939
__entry->cip_header1 = cip_header[1];
40-
__entry->payload_quadlets = payload_quadlets;
40+
__entry->payload_quadlets = payload_length / 4;
4141
__entry->packet_index = s->packet_index;
4242
__entry->irq = !!in_interrupt();
4343
__entry->index = index;

sound/firewire/amdtp-stream.c

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -411,13 +411,13 @@ static inline int queue_in_packet(struct amdtp_stream *s)
411411
amdtp_stream_get_max_payload(s));
412412
}
413413

414-
static int handle_out_packet(struct amdtp_stream *s, unsigned int cycle,
414+
static int handle_out_packet(struct amdtp_stream *s,
415+
unsigned int payload_length, unsigned int cycle,
415416
unsigned int index)
416417
{
417418
__be32 *buffer;
418419
unsigned int syt;
419420
unsigned int data_blocks;
420-
unsigned int payload_length;
421421
unsigned int pcm_frames;
422422
struct snd_pcm_substream *pcm;
423423

@@ -458,7 +458,7 @@ static int handle_out_packet(struct amdtp_stream *s, unsigned int cycle,
458458
}
459459

460460
static int handle_in_packet(struct amdtp_stream *s,
461-
unsigned int payload_quadlets, unsigned int cycle,
461+
unsigned int payload_length, unsigned int cycle,
462462
unsigned int index)
463463
{
464464
__be32 *buffer;
@@ -474,7 +474,7 @@ static int handle_in_packet(struct amdtp_stream *s,
474474
cip_header[0] = be32_to_cpu(buffer[0]);
475475
cip_header[1] = be32_to_cpu(buffer[1]);
476476

477-
trace_in_packet(s, cycle, cip_header, payload_quadlets, index);
477+
trace_in_packet(s, cycle, cip_header, payload_length, index);
478478

479479
/*
480480
* This module supports 'Two-quadlet CIP header with SYT field'.
@@ -505,7 +505,7 @@ static int handle_in_packet(struct amdtp_stream *s,
505505

506506
/* Calculate data blocks */
507507
fdf = (cip_header[1] & CIP_FDF_MASK) >> CIP_FDF_SHIFT;
508-
if (payload_quadlets < 3 ||
508+
if (payload_length < 12 ||
509509
(fmt == CIP_FMT_AM && fdf == AMDTP_FDF_NO_DATA)) {
510510
data_blocks = 0;
511511
} else {
@@ -521,7 +521,8 @@ static int handle_in_packet(struct amdtp_stream *s,
521521
if (s->flags & CIP_WRONG_DBS)
522522
data_block_quadlets = s->data_block_quadlets;
523523

524-
data_blocks = (payload_quadlets - 2) / data_block_quadlets;
524+
data_blocks = (payload_length / 4 - 2) /
525+
data_block_quadlets;
525526
}
526527

527528
/* Check data block counter continuity */
@@ -615,7 +616,7 @@ static void out_stream_callback(struct fw_iso_context *context, u32 tstamp,
615616

616617
for (i = 0; i < packets; ++i) {
617618
cycle = increment_cycle_count(cycle, 1);
618-
if (handle_out_packet(s, cycle, i) < 0) {
619+
if (handle_out_packet(s, 0, cycle, i) < 0) {
619620
s->packet_index = -1;
620621
amdtp_stream_pcm_abort(s);
621622
return;
@@ -631,7 +632,7 @@ static void in_stream_callback(struct fw_iso_context *context, u32 tstamp,
631632
{
632633
struct amdtp_stream *s = private_data;
633634
unsigned int i, packets;
634-
unsigned int payload_quadlets, max_payload_quadlets;
635+
unsigned int payload_length, max_payload_length;
635636
__be32 *headers = header;
636637
u32 cycle;
637638

@@ -647,22 +648,22 @@ static void in_stream_callback(struct fw_iso_context *context, u32 tstamp,
647648
cycle = decrement_cycle_count(cycle, packets);
648649

649650
/* For buffer-over-run prevention. */
650-
max_payload_quadlets = amdtp_stream_get_max_payload(s) / 4;
651+
max_payload_length = amdtp_stream_get_max_payload(s);
651652

652653
for (i = 0; i < packets; i++) {
653654
cycle = increment_cycle_count(cycle, 1);
654655

655656
/* The number of quadlets in this packet */
656-
payload_quadlets =
657-
(be32_to_cpu(headers[i]) >> ISO_DATA_LENGTH_SHIFT) / 4;
658-
if (payload_quadlets > max_payload_quadlets) {
657+
payload_length =
658+
(be32_to_cpu(headers[i]) >> ISO_DATA_LENGTH_SHIFT);
659+
if (payload_length > max_payload_length) {
659660
dev_err(&s->unit->device,
660-
"Detect jumbo payload: %02x %02x\n",
661-
payload_quadlets, max_payload_quadlets);
661+
"Detect jumbo payload: %04x %04x\n",
662+
payload_length, max_payload_length);
662663
break;
663664
}
664665

665-
if (handle_in_packet(s, payload_quadlets, cycle, i) < 0)
666+
if (handle_in_packet(s, payload_length, cycle, i) < 0)
666667
break;
667668
}
668669

0 commit comments

Comments
 (0)