|
@@ -591,18 +591,19 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
|
|
|
{
|
|
|
struct snd_card *card;
|
|
|
struct list_head *p;
|
|
|
+ bool was_shutdown;
|
|
|
|
|
|
if (chip == (void *)-1L)
|
|
|
return;
|
|
|
|
|
|
card = chip->card;
|
|
|
down_write(&chip->shutdown_rwsem);
|
|
|
+ was_shutdown = chip->shutdown;
|
|
|
chip->shutdown = 1;
|
|
|
up_write(&chip->shutdown_rwsem);
|
|
|
|
|
|
mutex_lock(®ister_mutex);
|
|
|
- chip->num_interfaces--;
|
|
|
- if (chip->num_interfaces <= 0) {
|
|
|
+ if (!was_shutdown) {
|
|
|
struct snd_usb_endpoint *ep;
|
|
|
|
|
|
snd_card_disconnect(card);
|
|
@@ -622,6 +623,10 @@ static void snd_usb_audio_disconnect(struct usb_device *dev,
|
|
|
list_for_each(p, &chip->mixer_list) {
|
|
|
snd_usb_mixer_disconnect(p);
|
|
|
}
|
|
|
+ }
|
|
|
+
|
|
|
+ chip->num_interfaces--;
|
|
|
+ if (chip->num_interfaces <= 0) {
|
|
|
usb_chip[chip->index] = NULL;
|
|
|
mutex_unlock(®ister_mutex);
|
|
|
snd_card_free_when_closed(card);
|