Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ccc1696d authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ALSA: usb-audio: simplify endpoint deactivation code



For further code simplification, drop the conditional call for
usb_kill_urb() with can_wait argument in deactivate_urbs(), and use
only usb_unlink_urb() and wait_clear_urbs() pairs.

Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent a9bb3626
Loading
Loading
Loading
Loading
+7 −16
Original line number Diff line number Diff line
@@ -515,33 +515,24 @@ void snd_usb_endpoint_sync_pending_stop(struct snd_usb_endpoint *ep)
/*
 * unlink active urbs.
 */
static int deactivate_urbs(struct snd_usb_endpoint *ep, bool force, bool can_sleep)
static int deactivate_urbs(struct snd_usb_endpoint *ep, bool force)
{
	unsigned int i;
	int async;

	if (!force && ep->chip->shutdown) /* to be sure... */
		return -EBADFD;

	async = !can_sleep;

	clear_bit(EP_FLAG_RUNNING, &ep->flags);

	INIT_LIST_HEAD(&ep->ready_playback_urbs);
	ep->next_packet_read_pos = 0;
	ep->next_packet_write_pos = 0;

	if (!async && in_interrupt())
		return 0;

	for (i = 0; i < ep->nurbs; i++) {
		if (test_bit(i, &ep->active_mask)) {
			if (!test_and_set_bit(i, &ep->unlink_mask)) {
				struct urb *u = ep->urb[i].urb;
				if (async)
				usb_unlink_urb(u);
				else
					usb_kill_urb(u);
			}
		}
	}
@@ -561,7 +552,7 @@ static void release_urbs(struct snd_usb_endpoint *ep, int force)
	ep->prepare_data_urb = NULL;

	/* stop urbs */
	deactivate_urbs(ep, force, true);
	deactivate_urbs(ep, force);
	wait_clear_urbs(ep);

	for (i = 0; i < ep->nurbs; i++)
@@ -837,7 +828,7 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, bool can_sleep)
		return 0;

	/* just to be sure */
	deactivate_urbs(ep, false, can_sleep);
	deactivate_urbs(ep, false);
	if (can_sleep)
		wait_clear_urbs(ep);

@@ -891,7 +882,7 @@ int snd_usb_endpoint_start(struct snd_usb_endpoint *ep, bool can_sleep)
__error:
	clear_bit(EP_FLAG_RUNNING, &ep->flags);
	ep->use_count--;
	deactivate_urbs(ep, false, false);
	deactivate_urbs(ep, false);
	return -EPIPE;
}

@@ -915,7 +906,7 @@ void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep, bool wait)
		return;

	if (--ep->use_count == 0) {
		deactivate_urbs(ep, false, wait);
		deactivate_urbs(ep, false);
		ep->data_subs = NULL;
		ep->sync_slave = NULL;
		ep->retire_data_urb = NULL;
@@ -946,7 +937,7 @@ int snd_usb_endpoint_deactivate(struct snd_usb_endpoint *ep)
	if (!ep)
		return -EINVAL;

	deactivate_urbs(ep, true, true);
	deactivate_urbs(ep, true);
	wait_clear_urbs(ep);

	if (ep->use_count != 0)