diff options
-rw-r--r-- | sound/usb/card.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/sound/usb/card.c b/sound/usb/card.c index 7ecd0e8a5c51..f61ebb17cc64 100644 --- a/sound/usb/card.c +++ b/sound/usb/card.c | |||
@@ -591,18 +591,19 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, | |||
591 | { | 591 | { |
592 | struct snd_card *card; | 592 | struct snd_card *card; |
593 | struct list_head *p; | 593 | struct list_head *p; |
594 | bool was_shutdown; | ||
594 | 595 | ||
595 | if (chip == (void *)-1L) | 596 | if (chip == (void *)-1L) |
596 | return; | 597 | return; |
597 | 598 | ||
598 | card = chip->card; | 599 | card = chip->card; |
599 | down_write(&chip->shutdown_rwsem); | 600 | down_write(&chip->shutdown_rwsem); |
601 | was_shutdown = chip->shutdown; | ||
600 | chip->shutdown = 1; | 602 | chip->shutdown = 1; |
601 | up_write(&chip->shutdown_rwsem); | 603 | up_write(&chip->shutdown_rwsem); |
602 | 604 | ||
603 | mutex_lock(®ister_mutex); | 605 | mutex_lock(®ister_mutex); |
604 | chip->num_interfaces--; | 606 | if (!was_shutdown) { |
605 | if (chip->num_interfaces <= 0) { | ||
606 | struct snd_usb_endpoint *ep; | 607 | struct snd_usb_endpoint *ep; |
607 | 608 | ||
608 | snd_card_disconnect(card); | 609 | snd_card_disconnect(card); |
@@ -622,6 +623,10 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, | |||
622 | list_for_each(p, &chip->mixer_list) { | 623 | list_for_each(p, &chip->mixer_list) { |
623 | snd_usb_mixer_disconnect(p); | 624 | snd_usb_mixer_disconnect(p); |
624 | } | 625 | } |
626 | } | ||
627 | |||
628 | chip->num_interfaces--; | ||
629 | if (chip->num_interfaces <= 0) { | ||
625 | usb_chip[chip->index] = NULL; | 630 | usb_chip[chip->index] = NULL; |
626 | mutex_unlock(®ister_mutex); | 631 | mutex_unlock(®ister_mutex); |
627 | snd_card_free_when_closed(card); | 632 | snd_card_free_when_closed(card); |