* [PATCH v2 7/9] ALSA: usb-audio: remove is_playback from implicit feedback quirks
@ 2013-08-03 8:51 Eldad Zack
2013-08-03 8:51 ` [PATCH v2 8/9] ALSA: usb-audio: remove implicit_fb from quirk Eldad Zack
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Eldad Zack @ 2013-08-03 8:51 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel, Clemens Ladisch, Eldad Zack, Daniel Mack
An implicit feedback endpoint can only be a capture source. The
consumer (sink) of the implicit feedback endpoint is therefore limited
to playback EPs.
Check if the target endpoint is a playback first and remove redundant
checks.
Signed-off-by: Eldad Zack <eldad@fogrefinery.com>
---
sound/usb/pcm.c | 40 +++++++++++++++++++---------------------
1 file changed, 19 insertions(+), 21 deletions(-)
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index bb2e0f5..af30e08 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -334,41 +334,39 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
{
struct usb_host_interface *alts;
struct usb_interface *iface;
- int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
int implicit_fb = 0;
unsigned int ep;
+ /* Implicit feedback sync EPs consumers are always playback EPs */
+ if (subs->direction != SNDRV_PCM_STREAM_PLAYBACK)
+ return 0;
+
switch (subs->stream->chip->usb_id) {
case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C600 */
- if (is_playback) {
- implicit_fb = 1;
- ep = 0x81;
- iface = usb_ifnum_to_if(dev, 3);
+ implicit_fb = 1;
+ ep = 0x81;
+ iface = usb_ifnum_to_if(dev, 3);
- if (!iface || iface->num_altsetting == 0)
- return -EINVAL;
+ if (!iface || iface->num_altsetting == 0)
+ return -EINVAL;
- alts = &iface->altsetting[1];
- goto add_sync_ep;
- }
+ alts = &iface->altsetting[1];
+ goto add_sync_ep;
break;
case USB_ID(0x0763, 0x2080): /* M-Audio FastTrack Ultra */
case USB_ID(0x0763, 0x2081):
- if (is_playback) {
- implicit_fb = 1;
- ep = 0x81;
- iface = usb_ifnum_to_if(dev, 2);
+ implicit_fb = 1;
+ ep = 0x81;
+ iface = usb_ifnum_to_if(dev, 2);
- if (!iface || iface->num_altsetting == 0)
- return -EINVAL;
+ if (!iface || iface->num_altsetting == 0)
+ return -EINVAL;
- alts = &iface->altsetting[1];
- goto add_sync_ep;
- }
+ alts = &iface->altsetting[1];
+ goto add_sync_ep;
}
- if (is_playback &&
- attr == USB_ENDPOINT_SYNC_ASYNC &&
+ if (attr == USB_ENDPOINT_SYNC_ASYNC &&
altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
altsd->bInterfaceProtocol == 2 &&
altsd->bNumEndpoints == 1 &&
--
1.8.1.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 8/9] ALSA: usb-audio: remove implicit_fb from quirk
2013-08-03 8:51 [PATCH v2 7/9] ALSA: usb-audio: remove is_playback from implicit feedback quirks Eldad Zack
@ 2013-08-03 8:51 ` Eldad Zack
2013-08-03 8:51 ` [PATCH v2 9/9] ALSA: usb-audio: WARN_ON when alts is passed as NULL Eldad Zack
2013-08-03 9:05 ` [PATCH v2 7/9] ALSA: usb-audio: remove is_playback from implicit feedback quirks Eldad Zack
2 siblings, 0 replies; 4+ messages in thread
From: Eldad Zack @ 2013-08-03 8:51 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel, Clemens Ladisch, Eldad Zack, Daniel Mack
Since the quirks all apply to implicit feedback (the source endpoint
is always a data endpoint), there's no need to set and check
a flag for it.
Signed-off-by: Eldad Zack <eldad@fogrefinery.com>
---
sound/usb/pcm.c | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index af30e08..b375d58 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -334,7 +334,6 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
{
struct usb_host_interface *alts;
struct usb_interface *iface;
- int implicit_fb = 0;
unsigned int ep;
/* Implicit feedback sync EPs consumers are always playback EPs */
@@ -344,7 +343,6 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
switch (subs->stream->chip->usb_id) {
case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C600 */
- implicit_fb = 1;
ep = 0x81;
iface = usb_ifnum_to_if(dev, 3);
@@ -356,7 +354,6 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
break;
case USB_ID(0x0763, 0x2080): /* M-Audio FastTrack Ultra */
case USB_ID(0x0763, 0x2081):
- implicit_fb = 1;
ep = 0x81;
iface = usb_ifnum_to_if(dev, 2);
@@ -374,7 +371,6 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
search_roland_implicit_fb(dev, altsd->bInterfaceNumber + 1,
altsd->bAlternateSetting,
&alts, &ep) >= 0) {
- implicit_fb = 1;
goto add_sync_ep;
}
@@ -384,9 +380,7 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
add_sync_ep:
subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip,
alts, ep, !subs->direction,
- implicit_fb ?
- SND_USB_ENDPOINT_TYPE_DATA :
- SND_USB_ENDPOINT_TYPE_SYNC);
+ SND_USB_ENDPOINT_TYPE_DATA);
if (!subs->sync_endpoint)
return -EINVAL;
--
1.8.1.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 9/9] ALSA: usb-audio: WARN_ON when alts is passed as NULL
2013-08-03 8:51 [PATCH v2 7/9] ALSA: usb-audio: remove is_playback from implicit feedback quirks Eldad Zack
2013-08-03 8:51 ` [PATCH v2 8/9] ALSA: usb-audio: remove implicit_fb from quirk Eldad Zack
@ 2013-08-03 8:51 ` Eldad Zack
2013-08-03 9:05 ` [PATCH v2 7/9] ALSA: usb-audio: remove is_playback from implicit feedback quirks Eldad Zack
2 siblings, 0 replies; 4+ messages in thread
From: Eldad Zack @ 2013-08-03 8:51 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel, Clemens Ladisch, Eldad Zack, Daniel Mack
Prevent NULL dereference in snd_usb_add_endpoints(), when
alts is passed as NULL. In this case, WARN (since this is
a non-fatal bug) and return NULL ep. Call sites treat a NULL
return value as an error.
Signed-off-by: Eldad Zack <eldad@fogrefinery.com>
---
sound/usb/endpoint.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/sound/usb/endpoint.c b/sound/usb/endpoint.c
index 7a444b5..92ea945 100644
--- a/sound/usb/endpoint.c
+++ b/sound/usb/endpoint.c
@@ -418,6 +418,9 @@ struct snd_usb_endpoint *snd_usb_add_endpoint(struct snd_usb_audio *chip,
struct snd_usb_endpoint *ep;
int is_playback = direction == SNDRV_PCM_STREAM_PLAYBACK;
+ if (WARN_ON(!alts))
+ return NULL;
+
mutex_lock(&chip->mutex);
list_for_each_entry(ep, &chip->ep_list, list) {
--
1.8.1.5
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v2 7/9] ALSA: usb-audio: remove is_playback from implicit feedback quirks
2013-08-03 8:51 [PATCH v2 7/9] ALSA: usb-audio: remove is_playback from implicit feedback quirks Eldad Zack
2013-08-03 8:51 ` [PATCH v2 8/9] ALSA: usb-audio: remove implicit_fb from quirk Eldad Zack
2013-08-03 8:51 ` [PATCH v2 9/9] ALSA: usb-audio: WARN_ON when alts is passed as NULL Eldad Zack
@ 2013-08-03 9:05 ` Eldad Zack
2 siblings, 0 replies; 4+ messages in thread
From: Eldad Zack @ 2013-08-03 9:05 UTC (permalink / raw)
To: Takashi Iwai; +Cc: alsa-devel, Clemens Ladisch, Daniel Mack
I had some error while sending, and this was sent twice.
On Sat, 3 Aug 2013, Eldad Zack wrote:
> An implicit feedback endpoint can only be a capture source. The
> consumer (sink) of the implicit feedback endpoint is therefore limited
> to playback EPs.
> Check if the target endpoint is a playback first and remove redundant
> checks.
>
> Signed-off-by: Eldad Zack <eldad@fogrefinery.com>
> ---
> sound/usb/pcm.c | 40 +++++++++++++++++++---------------------
> 1 file changed, 19 insertions(+), 21 deletions(-)
>
> diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
> index bb2e0f5..af30e08 100644
> --- a/sound/usb/pcm.c
> +++ b/sound/usb/pcm.c
> @@ -334,41 +334,39 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
> {
> struct usb_host_interface *alts;
> struct usb_interface *iface;
> - int is_playback = subs->direction == SNDRV_PCM_STREAM_PLAYBACK;
> int implicit_fb = 0;
> unsigned int ep;
>
> + /* Implicit feedback sync EPs consumers are always playback EPs */
> + if (subs->direction != SNDRV_PCM_STREAM_PLAYBACK)
> + return 0;
> +
> switch (subs->stream->chip->usb_id) {
> case USB_ID(0x0763, 0x2030): /* M-Audio Fast Track C400 */
> case USB_ID(0x0763, 0x2031): /* M-Audio Fast Track C600 */
> - if (is_playback) {
> - implicit_fb = 1;
> - ep = 0x81;
> - iface = usb_ifnum_to_if(dev, 3);
> + implicit_fb = 1;
> + ep = 0x81;
> + iface = usb_ifnum_to_if(dev, 3);
>
> - if (!iface || iface->num_altsetting == 0)
> - return -EINVAL;
> + if (!iface || iface->num_altsetting == 0)
> + return -EINVAL;
>
> - alts = &iface->altsetting[1];
> - goto add_sync_ep;
> - }
> + alts = &iface->altsetting[1];
> + goto add_sync_ep;
> break;
> case USB_ID(0x0763, 0x2080): /* M-Audio FastTrack Ultra */
> case USB_ID(0x0763, 0x2081):
> - if (is_playback) {
> - implicit_fb = 1;
> - ep = 0x81;
> - iface = usb_ifnum_to_if(dev, 2);
> + implicit_fb = 1;
> + ep = 0x81;
> + iface = usb_ifnum_to_if(dev, 2);
>
> - if (!iface || iface->num_altsetting == 0)
> - return -EINVAL;
> + if (!iface || iface->num_altsetting == 0)
> + return -EINVAL;
>
> - alts = &iface->altsetting[1];
> - goto add_sync_ep;
> - }
> + alts = &iface->altsetting[1];
> + goto add_sync_ep;
> }
> - if (is_playback &&
> - attr == USB_ENDPOINT_SYNC_ASYNC &&
> + if (attr == USB_ENDPOINT_SYNC_ASYNC &&
> altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
> altsd->bInterfaceProtocol == 2 &&
> altsd->bNumEndpoints == 1 &&
> --
> 1.8.1.5
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2013-08-03 9:05 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-08-03 8:51 [PATCH v2 7/9] ALSA: usb-audio: remove is_playback from implicit feedback quirks Eldad Zack
2013-08-03 8:51 ` [PATCH v2 8/9] ALSA: usb-audio: remove implicit_fb from quirk Eldad Zack
2013-08-03 8:51 ` [PATCH v2 9/9] ALSA: usb-audio: WARN_ON when alts is passed as NULL Eldad Zack
2013-08-03 9:05 ` [PATCH v2 7/9] ALSA: usb-audio: remove is_playback from implicit feedback quirks Eldad Zack
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.