Unplugging devices can cause disorder by releasing streaming resources before stopping playbacking/capturing substreams. This commit forces the state of ALSA character devices into disconnect before releasing the resources.
Signed-off-by: Takashi Sakamoto o-takashi@sakamocchi.jp --- sound/firewire/bebob/bebob.c | 3 ++- sound/firewire/fireworks/fireworks.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/sound/firewire/bebob/bebob.c b/sound/firewire/bebob/bebob.c index fc19c99..41eb1ce 100644 --- a/sound/firewire/bebob/bebob.c +++ b/sound/firewire/bebob/bebob.c @@ -306,10 +306,11 @@ static void bebob_remove(struct fw_unit *unit) if (bebob == NULL) return;
+ snd_card_disconnect(bebob->card); + kfree(bebob->maudio_special_quirk);
snd_bebob_stream_destroy_duplex(bebob); - snd_card_disconnect(bebob->card); snd_card_free_when_closed(bebob->card); }
diff --git a/sound/firewire/fireworks/fireworks.c b/sound/firewire/fireworks/fireworks.c index 3e2ed8e..21fb50f 100644 --- a/sound/firewire/fireworks/fireworks.c +++ b/sound/firewire/fireworks/fireworks.c @@ -289,10 +289,11 @@ static void efw_remove(struct fw_unit *unit) { struct snd_efw *efw = dev_get_drvdata(&unit->device);
+ snd_card_disconnect(efw->card); + snd_efw_stream_destroy_duplex(efw); snd_efw_transaction_remove_instance(efw);
- snd_card_disconnect(efw->card); snd_card_free_when_closed(efw->card); }