Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3800e6f9 authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai
Browse files

ALSA: bebob: give up updating streams at bus reset handler



DM1000/DM1100/DM1500 chipsets transfer packets with discontinue value in
'dbc' field of CIP header. For ALSA bebob driver, this makes its bus-reset
handler meaningless, because the discontinuity is detected quite earlier
than executing the handler.

This commit gives up updating streams at the bus reset handler.

Signed-off-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 4fd6c6c7
Loading
Loading
Loading
Loading
+16 −4
Original line number Diff line number Diff line
@@ -300,6 +300,22 @@ bebob_probe(struct fw_unit *unit,
	return err;
}

/*
 * This driver doesn't update streams in bus reset handler.
 *
 * DM1000/ DM1100/DM1500 chipsets with BeBoB firmware transfer packets with
 * discontinued counter at bus reset. This discontinuity is immediately
 * detected in packet streaming layer, then it sets XRUN to PCM substream.
 *
 * ALSA PCM applications can know the XRUN by getting -EPIPE from PCM operation.
 * Then, they can recover the PCM substream by executing ioctl(2) with
 * SNDRV_PCM_IOCTL_PREPARE. 'struct snd_pcm_ops.prepare' is called and drivers
 * restart packet streaming.
 *
 * The above processing may be executed before this bus-reset handler is
 * executed. When this handler updates streams with current isochronous
 * channels, the streams already have the current ones.
 */
static void
bebob_update(struct fw_unit *unit)
{
@@ -310,10 +326,6 @@ bebob_update(struct fw_unit *unit)

	fcp_bus_reset(bebob->unit);

	mutex_lock(&bebob->mutex);
	snd_bebob_stream_update_duplex(bebob);
	mutex_unlock(&bebob->mutex);

	if (bebob->deferred_registration) {
		if (snd_card_register(bebob->card) < 0) {
			snd_bebob_stream_destroy_duplex(bebob);
+0 −1
Original line number Diff line number Diff line
@@ -217,7 +217,6 @@ int snd_bebob_stream_discover(struct snd_bebob *bebob);
int snd_bebob_stream_init_duplex(struct snd_bebob *bebob);
int snd_bebob_stream_start_duplex(struct snd_bebob *bebob, unsigned int rate);
void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob);
void snd_bebob_stream_update_duplex(struct snd_bebob *bebob);
void snd_bebob_stream_destroy_duplex(struct snd_bebob *bebob);

void snd_bebob_stream_lock_changed(struct snd_bebob *bebob);
+0 −15
Original line number Diff line number Diff line
@@ -746,21 +746,6 @@ void snd_bebob_stream_stop_duplex(struct snd_bebob *bebob)
	}
}

void snd_bebob_stream_update_duplex(struct snd_bebob *bebob)
{
	if ((cmp_connection_update(&bebob->in_conn) < 0) ||
	    (cmp_connection_update(&bebob->out_conn) < 0)) {
		amdtp_stream_pcm_abort(&bebob->rx_stream);
		amdtp_stream_pcm_abort(&bebob->tx_stream);
		amdtp_stream_stop(&bebob->rx_stream);
		amdtp_stream_stop(&bebob->tx_stream);
		break_both_connections(bebob);
	} else {
		amdtp_stream_update(&bebob->rx_stream);
		amdtp_stream_update(&bebob->tx_stream);
	}
}

/*
 * This function should be called before starting streams or after stopping
 * streams.