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); |
