Skip to content

Commit dbd0cf2

Browse files
committed
ALSA: firewire-tascam: reserve resources for transferred isochronous packets at S400
TASCAM FW-1884/FW-1804/FW-1082 have a quirk that they often freeze when receiving isochronous packets at S400. This behaviour is suppressed by a new quirk flag added in Linux FireWire core to restrict maximum speed. Consequently both of the asynchronous transactions and isochronous transmissions are done at S200. However, the device still transfers isochronous packet at S400, and the way to indicate the transmission speed is not cleared yet. This commit correctly reserves isochronous resources for the transferred packet stream at S400. As a beneficial side effect, the pair of isochronous transmissions for FW-1884 fits within the bandwidth capacity of the bus. Link: https://lore.kernel.org/r/20251018035532.287124-5-o-takashi@sakamocchi.jp Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
1 parent d52bb3d commit dbd0cf2

1 file changed

Lines changed: 11 additions & 10 deletions

File tree

sound/firewire/tascam/tascam-stream.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -282,20 +282,22 @@ static int keep_resources(struct snd_tscm *tscm, unsigned int rate,
282282
struct amdtp_stream *stream)
283283
{
284284
struct fw_iso_resources *resources;
285+
int speed;
285286
int err;
286287

287-
if (stream == &tscm->tx_stream)
288+
if (stream == &tscm->tx_stream) {
288289
resources = &tscm->tx_resources;
289-
else
290+
speed = fw_parent_device(tscm->unit)->max_speed;
291+
} else {
290292
resources = &tscm->rx_resources;
293+
speed = SCODE_400;
294+
}
291295

292296
err = amdtp_tscm_set_parameters(stream, rate);
293297
if (err < 0)
294298
return err;
295299

296-
return fw_iso_resources_allocate(resources,
297-
amdtp_stream_get_max_payload(stream),
298-
fw_parent_device(tscm->unit)->max_speed);
300+
return fw_iso_resources_allocate(resources, amdtp_stream_get_max_payload(stream), speed);
299301
}
300302

301303
static int init_stream(struct snd_tscm *tscm, struct amdtp_stream *s)
@@ -455,7 +457,6 @@ int snd_tscm_stream_start_duplex(struct snd_tscm *tscm, unsigned int rate)
455457
}
456458

457459
if (!amdtp_stream_running(&tscm->rx_stream)) {
458-
int spd = fw_parent_device(tscm->unit)->max_speed;
459460
unsigned int tx_init_skip_cycles;
460461

461462
err = set_stream_formats(tscm, rate);
@@ -466,13 +467,13 @@ int snd_tscm_stream_start_duplex(struct snd_tscm *tscm, unsigned int rate)
466467
if (err < 0)
467468
goto error;
468469

469-
err = amdtp_domain_add_stream(&tscm->domain, &tscm->rx_stream,
470-
tscm->rx_resources.channel, spd);
470+
err = amdtp_domain_add_stream(&tscm->domain, &tscm->rx_stream, tscm->rx_resources.channel,
471+
fw_parent_device(tscm->unit)->max_speed);
471472
if (err < 0)
472473
goto error;
473474

474-
err = amdtp_domain_add_stream(&tscm->domain, &tscm->tx_stream,
475-
tscm->tx_resources.channel, spd);
475+
err = amdtp_domain_add_stream(&tscm->domain, &tscm->tx_stream, tscm->tx_resources.channel,
476+
SCODE_400);
476477
if (err < 0)
477478
goto error;
478479

0 commit comments

Comments
 (0)