alsa-devel.alsa-project.org archive mirror
 help / color / mirror / Atom feed
From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
To: clemens@ladisch.de, tiwai@suse.de, perex@perex.cz
Cc: alsa-devel@alsa-project.org, ffado-devel@lists.sf.net
Subject: [PATCH 04/39] firewire-lib: Split some codes into functions to reuse for both streams
Date: Wed,  5 Mar 2014 19:47:52 +0900	[thread overview]
Message-ID: <1394016507-15761-5-git-send-email-o-takashi@sakamocchi.jp> (raw)
In-Reply-To: <1394016507-15761-1-git-send-email-o-takashi@sakamocchi.jp>

Some codes can be reused to handle in stream. This commit adds new functions.
This commit also renames some functions to keep naming consistency.
---
 sound/firewire/amdtp.c | 156 ++++++++++++++++++++++++++-----------------------
 1 file changed, 82 insertions(+), 74 deletions(-)

diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c
index 95c5a15..ca79cb4 100644
--- a/sound/firewire/amdtp.c
+++ b/sound/firewire/amdtp.c
@@ -47,6 +47,8 @@
 #define INTERRUPT_INTERVAL	16
 #define QUEUE_LENGTH		48
 
+#define OUT_PACKET_HEADER_SIZE	0
+
 static void pcm_period_tasklet(unsigned long data);
 
 /**
@@ -440,13 +442,74 @@ static void amdtp_fill_midi(struct amdtp_stream *s,
 						cpu_to_be32(0x80000000);
 }
 
-static void queue_out_packet(struct amdtp_stream *s, unsigned int cycle)
+static void update_pcm_pointers(struct amdtp_stream *s,
+				struct snd_pcm_substream *pcm,
+				unsigned int frames)
+{	unsigned int ptr;
+
+	if (s->dual_wire)
+		frames *= 2;
+
+	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;
+		s->pointer_flush = false;
+		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);
+}
+
+static int queue_packet(struct amdtp_stream *s,
+			unsigned int header_length,
+			unsigned int payload_length, bool skip)
+{
+	struct fw_iso_packet p = {0};
+	int err;
+
+	p.interrupt = IS_ALIGNED(s->packet_index + 1, INTERRUPT_INTERVAL);
+	p.tag = TAG_CIP;
+	p.header_length = header_length;
+	p.payload_length = (!skip) ? payload_length : 0;
+	p.skip = skip;
+	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);
+		s->packet_index = -1;
+		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,
+				   unsigned int payload_length, bool skip)
+{
+	return queue_packet(s, OUT_PACKET_HEADER_SIZE,
+			    payload_length, skip);
+}
+
+static void handle_out_packet(struct amdtp_stream *s, unsigned int cycle)
 {
 	__be32 *buffer;
-	unsigned int index, data_blocks, syt, ptr;
+	unsigned int index, data_blocks, syt, payload_length;
 	struct snd_pcm_substream *pcm;
-	struct fw_iso_packet packet;
-	int err;
 
 	if (s->packet_index < 0)
 		return;
@@ -479,55 +542,19 @@ static void queue_out_packet(struct amdtp_stream *s, unsigned int cycle)
 
 	s->data_block_counter = (s->data_block_counter + data_blocks) & 0xff;
 
-	packet.payload_length = 8 + data_blocks * 4 * s->data_block_quadlets;
-	packet.interrupt = IS_ALIGNED(index + 1, INTERRUPT_INTERVAL);
-	packet.skip = 0;
-	packet.tag = TAG_CIP;
-	packet.sy = 0;
-	packet.header_length = 0;
-
-	err = fw_iso_context_queue(s->context, &packet, &s->buffer.iso_buffer,
-				   s->buffer.packets[index].offset);
-	if (err < 0) {
-		dev_err(&s->unit->device, "queueing error: %d\n", err);
-		s->packet_index = -1;
+	payload_length = 8 + data_blocks * 4 * s->data_block_quadlets;
+	if (queue_out_packet(s, payload_length, false) < 0) {
 		amdtp_stream_pcm_abort(s);
 		return;
 	}
 
-	if (++index >= QUEUE_LENGTH)
-		index = 0;
-	s->packet_index = index;
-
-	if (pcm) {
-		if (s->dual_wire)
-			data_blocks *= 2;
-
-		ptr = s->pcm_buffer_pointer + data_blocks;
-		if (ptr >= pcm->runtime->buffer_size)
-			ptr -= pcm->runtime->buffer_size;
-		ACCESS_ONCE(s->pcm_buffer_pointer) = ptr;
-
-		s->pcm_period_pointer += data_blocks;
-		if (s->pcm_period_pointer >= pcm->runtime->period_size) {
-			s->pcm_period_pointer -= pcm->runtime->period_size;
-			s->pointer_flush = false;
-			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);
+		update_pcm_pointers(s, pcm, data_blocks);
 }
 
-static void out_packet_callback(struct fw_iso_context *context, u32 cycle,
-			size_t header_length, void *header, void *private_data)
+static void out_stream_callback(struct fw_iso_context *context, u32 cycle,
+				size_t header_length, void *header,
+				void *private_data)
 {
 	struct amdtp_stream *s = private_data;
 	unsigned int i, packets = header_length / 4;
@@ -540,31 +567,10 @@ static void out_packet_callback(struct fw_iso_context *context, u32 cycle,
 	cycle += QUEUE_LENGTH - packets;
 
 	for (i = 0; i < packets; ++i)
-		queue_out_packet(s, ++cycle);
+		handle_out_packet(s, ++cycle);
 	fw_iso_context_queue_flush(s->context);
 }
 
-static int queue_initial_skip_packets(struct amdtp_stream *s)
-{
-	struct fw_iso_packet skip_packet = {
-		.skip = 1,
-	};
-	unsigned int i;
-	int err;
-
-	for (i = 0; i < QUEUE_LENGTH; ++i) {
-		skip_packet.interrupt = IS_ALIGNED(s->packet_index + 1,
-						   INTERRUPT_INTERVAL);
-		err = fw_iso_context_queue(s->context, &skip_packet, NULL, 0);
-		if (err < 0)
-			return err;
-		if (++s->packet_index >= QUEUE_LENGTH)
-			s->packet_index = 0;
-	}
-
-	return 0;
-}
-
 /**
  * amdtp_stream_start - start transferring packets
  * @s: the AMDTP stream to start
@@ -594,7 +600,7 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
 	mutex_lock(&s->mutex);
 
 	if (WARN_ON(amdtp_stream_running(s) ||
-		    (!s->pcm_channels && !s->midi_ports))) {
+		    (s->data_block_quadlets < 1))) {
 		err = -EBADFD;
 		goto err_unlock;
 	}
@@ -612,7 +618,7 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
 	s->context = fw_iso_context_create(fw_parent_device(s->unit)->card,
 					   FW_ISO_CONTEXT_TRANSMIT,
 					   channel, speed, 0,
-					   out_packet_callback, s);
+					   out_stream_callback, s);
 	if (IS_ERR(s->context)) {
 		err = PTR_ERR(s->context);
 		if (err == -EBUSY)
@@ -624,11 +630,13 @@ int amdtp_stream_start(struct amdtp_stream *s, int channel, int speed)
 	amdtp_stream_update(s);
 
 	s->packet_index = 0;
-	s->data_block_counter = 0;
-	err = queue_initial_skip_packets(s);
-	if (err < 0)
-		goto err_context;
+	do {
+		err = queue_out_packet(s, 0, true);
+		if (err < 0)
+			goto err_context;
+	} while (s->packet_index > 0);
 
+	s->data_block_counter = 0;
 	err = fw_iso_context_start(s->context, -1, 0, 0);
 	if (err < 0)
 		goto err_context;
-- 
1.8.3.2

  parent reply	other threads:[~2014-03-05 10:48 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <5316963F.1000206@sakamocchi.jp>
2014-03-05  6:14 ` [GIT PULL v2] Enhancement of support for Firewire devices Takashi Iwai
2014-03-05 11:00   ` Takashi Sakamoto
2014-03-05 11:09     ` Takashi Iwai
2014-03-05 11:23       ` Takashi Sakamoto
2014-03-05 10:47 ` [GIT PULL][PATCH 00/39 " Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 01/39] firewire-lib: Rename functions, structure, member for AMDTP Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 02/39] firewire-lib: Add macros instead of fixed value " Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 03/39] firewire-lib: Add 'direction' member to 'amdtp_stream' structure Takashi Sakamoto
2014-03-05 10:47   ` Takashi Sakamoto [this message]
2014-03-05 10:47   ` [PATCH 05/39] firewire-lib: Add support for AMDTP in-stream and PCM capture Takashi Sakamoto
2014-03-09 20:37     ` Clemens Ladisch
2014-03-10  3:55       ` Takashi Sakamoto
2014-03-12  2:00       ` Takashi Sakamoto
2014-03-14 13:50       ` Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 06/39] firewire-lib: Add support for MIDI capture/playback Takashi Sakamoto
2014-03-09 20:48     ` Clemens Ladisch
2014-03-10  4:13       ` Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 07/39] firewire-lib: Give syt value as parameter to handle_out_packet() Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 08/39] firewire-lib: Add support for duplex streams synchronization in blocking mode Takashi Sakamoto
2014-03-09 20:55     ` Clemens Ladisch
2014-03-10 12:21       ` Takashi Sakamoto
2014-03-05 10:47   ` [PATCH 09/39] firewire-lib: Add sort function for transmitted packet Takashi Sakamoto
2014-03-09 21:07     ` Clemens Ladisch
2014-03-10 13:29       ` Takashi Sakamoto
2014-03-11  8:11         ` Clemens Ladisch
2014-03-12  1:23           ` Takashi Sakamoto
2014-03-12  7:21             ` Takashi Iwai
2014-03-05 10:47   ` [PATCH 10/39] firewire-lib: Add transfer delay to synchronized duplex streams Takashi Sakamoto
2014-03-09 21:13     ` Clemens Ladisch
2014-03-10 13:43       ` Takashi Sakamoto
2014-03-11  8:13         ` Clemens Ladisch
2014-03-05 10:47   ` [PATCH 11/39] firewire-lib: Add support for channel mapping Takashi Sakamoto
2014-03-09 21:20     ` Clemens Ladisch
2014-03-10 12:28       ` Takashi Sakamoto
2014-03-10 12:58         ` Takashi Sakamoto
2014-03-11  8:23         ` Clemens Ladisch
2014-03-11 16:03           ` Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 12/39] firewire-lib: Rename macros, variables and functions for CMP Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 13/39] firewire-lib: Add 'direction' member to 'cmp_connection' structure Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 14/39] firewire-lib: Add handling output connection by CMP Takashi Sakamoto
2014-03-09 21:27     ` Clemens Ladisch
2014-03-10 12:30       ` Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 15/39] firewire-lib: Add a new function to check others' connection Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 16/39] firewire-lib: Add some AV/C general commands Takashi Sakamoto
2014-03-09 21:32     ` Clemens Ladisch
2014-03-10 12:46       ` Takashi Sakamoto
2014-03-14 14:10       ` Takashi Sakamoto
2014-03-14 22:18         ` Clemens Ladisch
2014-03-05 10:48   ` [PATCH 17/39] firewire-lib: Add quirks for Fireworks Takashi Sakamoto
2014-03-09 21:39     ` Clemens Ladisch
2014-03-10 12:40       ` Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 18/39] firewire-lib: Add a fallback at RCODE_CANCELLED Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 19/39] fireworks: Add skelton for Fireworks based devices Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 20/39] fireworks: Add transaction and some commands Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 21/39] fireworks: Add connection and stream management Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 22/39] fireworks: Add proc interface for debugging purpose Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 23/39] fireworks: Add MIDI interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 24/39] fireworks: Add PCM interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 25/39] fireworks: Add hwdep interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 26/39] fireworks: Add command/response functionality into " Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 27/39] bebob: Add skelton for BeBoB based devices Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 28/39] bebob: Add commands and connections/streams management Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 29/39] bebob: Add proc interface for debugging purpose Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 30/39] bebob: Add MIDI interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 31/39] bebob: Add PCM interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 32/39] bebob: Add hwdep interface Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 33/39] bebob: Prepare for device specific operations Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 34/39] bebob: Add support for Terratec PHASE, EWS series and Aureon Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 35/39] bebob: Add support for Yamaha GO series Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 36/39] bebob: Add support for Focusrite Saffire/SaffirePro series Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 37/39] bebob: Add support for M-Audio usual Firewire series Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 38/39] bebob: Add support for M-Audio special " Takashi Sakamoto
2014-03-05 10:48   ` [PATCH 39/39] bebob: Send a cue to load firmware for M-Audio " Takashi Sakamoto
2014-03-07 11:44 ` [GIT PULL v2] Enhancement of support for Firewire devices Takashi Iwai
2014-03-07 14:46   ` Clemens Ladisch
2014-02-28  3:27 [GIT PULL][PATCH 00/39] " Takashi Sakamoto
2014-02-28  3:27 ` [PATCH 04/39] firewire-lib: Split some codes into functions to reuse for both streams Takashi Sakamoto

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1394016507-15761-5-git-send-email-o-takashi@sakamocchi.jp \
    --to=o-takashi@sakamocchi.jp \
    --cc=alsa-devel@alsa-project.org \
    --cc=clemens@ladisch.de \
    --cc=ffado-devel@lists.sf.net \
    --cc=perex@perex.cz \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).