From: Eldad Zack <eldad@fogrefinery.com>
To: Clemens Ladisch <clemens@ladisch.de>,
Daniel Mack <zonque@gmail.com>, Takashi Iwai <tiwai@suse.de>
Cc: alsa-devel@alsa-project.org, Eldad Zack <eldad@fogrefinery.com>
Subject: [PATCH RFC 9/9] ALSA: usb-audio: correct ep use_count semantics (add set_param flag)
Date: Sun, 18 Aug 2013 22:25:54 +0200 [thread overview]
Message-ID: <1376857554-1303-2-git-send-email-eldad@fogrefinery.com> (raw)
In-Reply-To: <1376857554-1303-1-git-send-email-eldad@fogrefinery.com>
Currently, use_count is used in snd_usb_endpoint_set_params to
ensure the parameters don't get changed for an in-use endpoint.
However, there is a subtle condition where this check fails -
if hw_params is called on both substreams before calling prepare (for
playback) or start trigger (for capture): the endpoint is not yet
started, i.e., snd_usb_endpoint_start() does not yet increment use_count.
This adds a flag to check if the parameters are set, but does not
omit checking the use_count.
Signed-off-by: Eldad Zack <eldad@fogrefinery.com>
---
sound/usb/card.h | 1 +
sound/usb/endpoint.c | 11 ++++++++---
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/sound/usb/card.h b/sound/usb/card.h
index 5ecacaa..4061ee1 100644
--- a/sound/usb/card.h
+++ b/sound/usb/card.h
@@ -51,6 +51,7 @@ struct snd_usb_endpoint {
struct snd_usb_audio *chip;
int use_count;
+ bool param_set;
int ep_num; /* the referenced endpoint number */
int type; /* SND_USB_ENDPOINT_TYPE_* */
unsigned long flags;
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
index 4241154..a56e769 100644
--- a/sound/usb/endpoint.c
+++ b/sound/usb/endpoint.c
@@ -469,6 +469,8 @@ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip,
ep->syncmaxsize = le16_to_cpu(get_endpoint(alts, 1)->wMaxPacketSize);
}
+ ep->param_set = false;
+
list_add_tail(&ep->list, &chip->ep_list);
__exit_unlock:
@@ -792,13 +794,15 @@ int snd_usb_endpoint_set_params(struct snd_usb_endpoint *ep,
{
int err;
- if ((!subs && ep->use_count != 0) ||
- !snd_usb_endpoint_may_set_params(subs, pcm_format, channels,
- period_bytes, rate)) {
+ if (ep->param_set &&
+ ((!subs && ep->use_count != 0) ||
+ !snd_usb_endpoint_may_set_params(subs, pcm_format, channels,
+ period_bytes, rate))) {
snd_printk(KERN_WARNING "Unable to change format on ep #%x: already in use\n",
ep->ep_num);
return -EBUSY;
}
+ ep->param_set = true;
/* release old buffers, if any */
release_urbs(ep, 0);
@@ -950,6 +954,7 @@ void snd_usb_endpoint_stop(struct snd_usb_endpoint *ep)
ep->sync_slave = NULL;
ep->retire_data_urb = NULL;
ep->prepare_data_urb = NULL;
+ ep->param_set = false;
set_bit(EP_FLAG_STOPPING, &ep->flags);
}
}
--
1.8.1.5
prev parent reply other threads:[~2013-08-18 20:26 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-18 20:22 [PATCH RFC 0/9] ALSA: usb-audio: fix playback/capture concurrent usage Eldad Zack
2013-08-18 20:22 ` [PATCH RFC 1/9] ALSA: usb-audio: remove unused parameter from sync_ep_set_params Eldad Zack
2013-08-18 20:22 ` [PATCH RFC 2/9] ALSA: usb-audio: remove deactivate_endpoints() Eldad Zack
2013-08-18 20:22 ` [PATCH RFC 3/9] ALSA: usb-audio: prevent NULL dereference on stop trigger Eldad Zack
2013-08-18 20:22 ` [PATCH RFC 4/9] ALSA: usb-audio: don't deactivate URBs on in-use EP Eldad Zack
2013-08-18 20:22 ` [PATCH RFC 5/9] ALSA: usb-audio: void return type of snd_usb_endpoint_deactivate() Eldad Zack
2013-08-18 20:22 ` [PATCH RFC 6/9] ALSA: usb-audio: clear SUBSTREAM_FLAG_SYNC_EP_STARTED on error Eldad Zack
2013-08-18 20:22 ` [PATCH RFC 7/9] ALSA: usb-audio: conditional interface altsetting Eldad Zack
2013-08-19 10:08 ` Clemens Ladisch
2013-08-19 20:13 ` Eldad Zack
2013-08-18 20:25 ` [PATCH RFC 8/9] ALSA: usb-audio: conditional concurrent usage of endpoint Eldad Zack
2013-08-18 20:25 ` Eldad Zack [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1376857554-1303-2-git-send-email-eldad@fogrefinery.com \
--to=eldad@fogrefinery.com \
--cc=alsa-devel@alsa-project.org \
--cc=clemens@ladisch.de \
--cc=tiwai@suse.de \
--cc=zonque@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.