diff --git a/sound/usb/usb_audio_qmi_svc.c b/sound/usb/usb_audio_qmi_svc.c index c3e5ea683081..4b91dbaec7b7 100644 --- a/sound/usb/usb_audio_qmi_svc.c +++ b/sound/usb/usb_audio_qmi_svc.c @@ -933,10 +933,13 @@ static void uaudio_disconnect_cb(struct snd_usb_audio *chip) ret = wait_event_interruptible_timeout(dev->disconnect_wq, !atomic_read(&dev->in_use), msecs_to_jiffies(DEV_RELEASE_WAIT_TIMEOUT)); - if (!ret) + if (!ret) { uaudio_err("timeout while waiting for dev_release\n"); - else if (ret < 0) + atomic_set(&dev->in_use, 0); + } else if (ret < 0) { uaudio_err("failed with ret %d\n", ret); + atomic_set(&dev->in_use, 0); + } mutex_lock(&chip->dev_lock); } @@ -1201,18 +1204,16 @@ static void handle_uaudio_stream_req(struct qmi_handle *handle, mutex_unlock(&chip->dev_lock); response: - if (!req_msg->enable && ret != -EINVAL) { - if (ret != -ENODEV) { - if (info_idx >= 0) { - mutex_lock(&chip->dev_lock); - info = &uadev[pcm_card_num].info[info_idx]; - uaudio_dev_intf_cleanup( - uadev[pcm_card_num].udev, - info); - uaudio_dbg("release resources: intf# %d card# %d\n", - subs->interface, pcm_card_num); - mutex_unlock(&chip->dev_lock); - } + if (!req_msg->enable && (ret != -EINVAL || ret != -ENODEV)) { + if (info_idx >= 0) { + mutex_lock(&chip->dev_lock); + info = &uadev[pcm_card_num].info[info_idx]; + uaudio_dev_intf_cleanup( + uadev[pcm_card_num].udev, + info); + uaudio_dbg("release resources: intf# %d card# %d\n", + subs->interface, pcm_card_num); + mutex_unlock(&chip->dev_lock); } if (atomic_read(&uadev[pcm_card_num].in_use)) kref_put(&uadev[pcm_card_num].kref,