diff options
| -rw-r--r-- | sound/usb/endpoint.c | 11 | ||||
| -rw-r--r-- | sound/usb/endpoint.h | 2 | ||||
| -rw-r--r-- | sound/usb/pcm.c | 9 | 
3 files changed, 13 insertions, 9 deletions
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c index 6db2143350d..f487d26f8d4 100644 --- a/sound/usb/endpoint.c +++ b/sound/usb/endpoint.c @@ -896,8 +896,11 @@ __error:   * actually be deactivated.   *   * Must be balanced to calls of snd_usb_endpoint_start(). + * + * The caller needs to synchronize the pending stop operation via + * snd_usb_endpoint_sync_pending_stop().   */ -void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, bool wait) +void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep)  {  	if (!ep)  		return; @@ -911,11 +914,7 @@ void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, bool wait)  		ep->sync_slave = NULL;  		ep->retire_data_urb = NULL;  		ep->prepare_data_urb = NULL; - -		if (wait) -			wait_clear_urbs(ep); -		else -			set_bit(EP_FLAG_STOPPING, &ep->flags); +		set_bit(EP_FLAG_STOPPING, &ep->flags);  	}  } diff --git a/sound/usb/endpoint.h b/sound/usb/endpoint.h index f1e451da9a6..447902dd8a4 100644 --- a/sound/usb/endpoint.h +++ b/sound/usb/endpoint.h @@ -17,7 +17,7 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,  				struct snd_usb_endpoint *sync_ep);  int  snd_usb_endpoint_start(struct snd_usb_endpoint *ep, bool can_sleep); -void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, bool wait); +void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep);  void snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint *ep);  int  snd_usb_endpoint_activate(struct snd_usb_endpoint *ep);  int  snd_usb_endpoint_deactivate(struct snd_usb_endpoint *ep); diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c index d90604aa513..4750d3d5c0c 100644 --- a/sound/usb/pcm.c +++ b/sound/usb/pcm.c @@ -266,10 +266,15 @@ static int start_endpoints(struct snd_usb_substream *subs, bool can_sleep)  static void stop_endpoints(struct snd_usb_substream *subs, bool wait)  {  	if (test_and_clear_bit(SUBSTREAM_FLAG_SYNC_EP_STARTED, &subs->flags)) -		snd_usb_endpoint_stop(subs->sync_endpoint, wait); +		snd_usb_endpoint_stop(subs->sync_endpoint);  	if (test_and_clear_bit(SUBSTREAM_FLAG_DATA_EP_STARTED, &subs->flags)) -		snd_usb_endpoint_stop(subs->data_endpoint, wait); +		snd_usb_endpoint_stop(subs->data_endpoint); + +	if (wait) { +		snd_usb_endpoint_sync_pending_stop(subs->sync_endpoint); +		snd_usb_endpoint_sync_pending_stop(subs->data_endpoint); +	}  }  static int deactivate_endpoints(struct snd_usb_substream *subs)  |