aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2014-11-25 16:52:24 -0500
committerTakashi Iwai <tiwai@suse.de>2015-01-16 16:50:45 -0500
commit5c697e5b46efea2c0a5da55208bc71db46698fd1 (patch)
tree65264f081f2dc54c44214a5e163be5ddaa18c7e9
parent92cb46584e104e2f4b14a44959109ffe13524a26 (diff)
ALSA: firewire-lib: remove rx_blocks_for_midi quirk
There are several devices that expect to receive MIDI data only in the first eight data blocks of a packet. If the driver restricts the data rate to the allowed rate (as mandated by the specification, but not yet implemented by this driver), this happens naturally. Therefore, there is no reason to ever try to use more data packets with any device. Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Tested-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
-rw-r--r--sound/firewire/amdtp.c12
-rw-r--r--sound/firewire/amdtp.h3
-rw-r--r--sound/firewire/bebob/bebob_stream.c7
-rw-r--r--sound/firewire/fireworks/fireworks_stream.c5
4 files changed, 8 insertions, 19 deletions
diff --git a/sound/firewire/amdtp.c b/sound/firewire/amdtp.c
index 3badc70124ab..ef399cadb8a5 100644
--- a/sound/firewire/amdtp.c
+++ b/sound/firewire/amdtp.c
@@ -21,7 +21,13 @@
21#define CYCLES_PER_SECOND 8000 21#define CYCLES_PER_SECOND 8000
22#define TICKS_PER_SECOND (TICKS_PER_CYCLE * CYCLES_PER_SECOND) 22#define TICKS_PER_SECOND (TICKS_PER_CYCLE * CYCLES_PER_SECOND)
23 23
24#define TRANSFER_DELAY_TICKS 0x2e00 /* 479.17 µs */ 24/*
25 * Several devices look only at the first eight data blocks.
26 * In any case, this is more than enough for the MIDI data rate.
27 */
28#define MAX_MIDI_RX_BLOCKS 8
29
30#define TRANSFER_DELAY_TICKS 0x2e00 /* 479.17 µs */
25 31
26/* isochronous header parameters */ 32/* isochronous header parameters */
27#define ISO_DATA_LENGTH_SHIFT 16 33#define ISO_DATA_LENGTH_SHIFT 16
@@ -78,8 +84,6 @@ int amdtp_stream_init(struct amdtp_stream *s, struct fw_unit *unit,
78 s->callbacked = false; 84 s->callbacked = false;
79 s->sync_slave = NULL; 85 s->sync_slave = NULL;
80 86
81 s->rx_blocks_for_midi = UINT_MAX;
82
83 return 0; 87 return 0;
84} 88}
85EXPORT_SYMBOL(amdtp_stream_init); 89EXPORT_SYMBOL(amdtp_stream_init);
@@ -474,7 +478,7 @@ static void amdtp_fill_midi(struct amdtp_stream *s,
474 b = (u8 *)&buffer[s->midi_position]; 478 b = (u8 *)&buffer[s->midi_position];
475 479
476 port = (s->data_block_counter + f) % 8; 480 port = (s->data_block_counter + f) % 8;
477 if ((f >= s->rx_blocks_for_midi) || 481 if ((f >= MAX_MIDI_RX_BLOCKS) ||
478 (s->midi[port] == NULL) || 482 (s->midi[port] == NULL) ||
479 (snd_rawmidi_transmit(s->midi[port], b + 1, 1) <= 0)) 483 (snd_rawmidi_transmit(s->midi[port], b + 1, 1) <= 0))
480 b[0] = 0x80; 484 b[0] = 0x80;
diff --git a/sound/firewire/amdtp.h b/sound/firewire/amdtp.h
index e6e8926275b0..cd4c4dfb3951 100644
--- a/sound/firewire/amdtp.h
+++ b/sound/firewire/amdtp.h
@@ -152,9 +152,6 @@ struct amdtp_stream {
152 /* quirk: fixed interval of dbc between previos/current packets. */ 152 /* quirk: fixed interval of dbc between previos/current packets. */
153 unsigned int tx_dbc_interval; 153 unsigned int tx_dbc_interval;
154 154
155 /* quirk: the first count of data blocks in an rx packet for MIDI */
156 unsigned int rx_blocks_for_midi;
157
158 bool callbacked; 155 bool callbacked;
159 wait_queue_head_t callback_wait; 156 wait_queue_head_t callback_wait;
160 struct amdtp_stream *sync_slave; 157 struct amdtp_stream *sync_slave;
diff --git a/sound/firewire/bebob/bebob_stream.c b/sound/firewire/bebob/bebob_stream.c
index 1aab0a32870c..0ebcabfdc7ce 100644
--- a/sound/firewire/bebob/bebob_stream.c
+++ b/sound/firewire/bebob/bebob_stream.c
@@ -484,13 +484,6 @@ int snd_bebob_stream_init_duplex(struct snd_bebob *bebob)
484 amdtp_stream_destroy(&bebob->rx_stream); 484 amdtp_stream_destroy(&bebob->rx_stream);
485 destroy_both_connections(bebob); 485 destroy_both_connections(bebob);
486 } 486 }
487 /*
488 * The firmware for these devices ignore MIDI messages in more than
489 * first 8 data blocks of an received AMDTP packet.
490 */
491 if (bebob->spec == &maudio_fw410_spec ||
492 bebob->spec == &maudio_special_spec)
493 bebob->rx_stream.rx_blocks_for_midi = 8;
494end: 487end:
495 return err; 488 return err;
496} 489}
diff --git a/sound/firewire/fireworks/fireworks_stream.c b/sound/firewire/fireworks/fireworks_stream.c
index b985fc5ebdc6..4f440e163667 100644
--- a/sound/firewire/fireworks/fireworks_stream.c
+++ b/sound/firewire/fireworks/fireworks_stream.c
@@ -179,11 +179,6 @@ int snd_efw_stream_init_duplex(struct snd_efw *efw)
179 destroy_stream(efw, &efw->tx_stream); 179 destroy_stream(efw, &efw->tx_stream);
180 goto end; 180 goto end;
181 } 181 }
182 /*
183 * Fireworks ignores MIDI messages in more than first 8 data
184 * blocks of an received AMDTP packet.
185 */
186 efw->rx_stream.rx_blocks_for_midi = 8;
187 182
188 /* set IEC61883 compliant mode (actually not fully compliant...) */ 183 /* set IEC61883 compliant mode (actually not fully compliant...) */
189 err = snd_efw_command_set_tx_mode(efw, SND_EFW_TRANSPORT_MODE_IEC61883); 184 err = snd_efw_command_set_tx_mode(efw, SND_EFW_TRANSPORT_MODE_IEC61883);