diff options
author | Takashi Iwai <tiwai@suse.de> | 2016-12-09 13:21:35 +0300 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2016-12-09 13:21:35 +0300 |
commit | d71bb23a81f80eeb5291e5c782377024e7265a23 (patch) | |
tree | 81aded55aceadd50ff2360df95f626d7bc35265c /sound/usb/endpoint.c | |
parent | 17f08b0d9aafccdb10038ab6dbd9ddb6433c13e2 (diff) | |
parent | 82ffb6fc637150b279f49e174166d2aa3853eaf4 (diff) | |
download | linux-d71bb23a81f80eeb5291e5c782377024e7265a23.tar.xz |
Merge branch 'for-linus' into for-next
Diffstat (limited to 'sound/usb/endpoint.c')
-rw-r--r-- | sound/usb/endpoint.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index a2931f49a1fc..57b0d9968ec2 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c @@ -384,6 +384,9 @@ static void snd_complete_urb(struct urb *urb) if (unlikely(atomic_read(&ep->chip->shutdown))) goto exit_clear; + if (unlikely(!test_bit(EP_FLAG_RUNNING, &ep->flags))) + goto exit_clear; + if (usb_pipeout(ep->pipe)) { retire_outbound_urb(ep, ctx); /* can be stopped during retire callback */ @@ -534,6 +537,11 @@ static int wait_clear_urbs(struct snd_usb_endpoint *ep) alive, ep->ep_num); clear_bit(EP_FLAG_STOPPING, &ep->flags); + ep->data_subs = NULL; + ep->sync_slave = NULL; + ep->retire_data_urb = NULL; + ep->prepare_data_urb = NULL; + return 0; } @@ -1006,10 +1014,6 @@ void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep) if (--ep->use_count == 0) { deactivate_urbs(ep, false); - ep->data_subs = NULL; - ep->sync_slave = NULL; - ep->retire_data_urb = NULL; - ep->prepare_data_urb = NULL; set_bit(EP_FLAG_STOPPING, &ep->flags); } } |