[alsa-devel] [PATCH 2/2] snd-usb-audio: Add duplex mode for Digidesign Mbox 1 and enable mixer

Takashi Iwai tiwai at suse.de
Mon Nov 10 07:47:13 CET 2014


At Mon, 10 Nov 2014 10:45:19 +1100,
Damien Zammit wrote:
> 
> On 10/11/14 04:27, Takashi Iwai wrote:
> > At Sun, 09 Nov 2014 15:04:42 +0100,
> > Clemens Ladisch wrote:
> >>
> >> Takashi Iwai wrote:
> >>> I think the only point is the check in create_composite_quirk(), where
> >>> it marks the iface as claimed and skips the next entry that has been
> >>> already claimed.  However, the current code looks inconsistent -- it
> >>> allows multiple entries only if the iface matches with the current
> >>> one.  Fixing it like below would make things working.
> >>>
> >>> It's a quick idea, so a bit more reviews would be needed, though.
> >>> Clemens, what do you think?
> >>
> >> Reviewed-by: Clemens Ladisch <clemens at ladisch.de>
> 
> 
> >>> ---
> >>> --- a/sound/usb/quirks.c
> >>> +++ b/sound/usb/quirks.c
> >>> @@ -58,9 +58,17 @@ static int create_composite_quirk(struct snd_usb_audio *chip,
> >>>  		err = snd_usb_create_quirk(chip, iface, driver, quirk);
> >>>  		if (err < 0)
> >>>  			return err;
> >>> -		if (quirk->ifnum != probed_ifnum)
> >>> +	}
> >>> +
> >>> +	for (quirk = quirk->data; quirk->ifnum >= 0; ++quirk) {
> >>> +		iface = usb_ifnum_to_if(chip->dev, quirk->ifnum);
> >>> +		if (!iface)
> >>> +			continue;
> >>> +		if (quirk->ifnum != probed_ifnum &&
> >>> +		    !usb_interface_claimed(iface))
> >>>  			usb_driver_claim_interface(driver, iface, (void *)-1L);
> >>>  	}
> >>> +
> >>>  	return 0;
> >>>  }
> >>>
> >>
> 
> When I tried the patch on the hardware with my quirk, I got a kernel oops.

My bad, take the additional fix patch below.


Takashi

-- 8< --
From: Takashi Iwai <tiwai at suse.de>
Subject: [PATCH] ALSA: usb-audio: Fix Oops by composite quirk enhancement

The quirk argument itself was used as iterator, so it cannot be taken
back to the original value, obviously.

Fixes: d4b8fc66f770 ('ALSA: usb-audio: Allow multiple entries for the same iface in composite quirk')
Signed-off-by: Takashi Iwai <tiwai at suse.de>
---
 sound/usb/quirks.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index e9ff3a6c60e4..809d7fab4633 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -43,12 +43,13 @@
 static int create_composite_quirk(struct snd_usb_audio *chip,
 				  struct usb_interface *iface,
 				  struct usb_driver *driver,
-				  const struct snd_usb_audio_quirk *quirk)
+				  const struct snd_usb_audio_quirk *quirk_comp)
 {
 	int probed_ifnum = get_iface_desc(iface->altsetting)->bInterfaceNumber;
+	const struct snd_usb_audio_quirk *quirk;
 	int err;
 
-	for (quirk = quirk->data; quirk->ifnum >= 0; ++quirk) {
+	for (quirk = quirk_comp->data; quirk->ifnum >= 0; ++quirk) {
 		iface = usb_ifnum_to_if(chip->dev, quirk->ifnum);
 		if (!iface)
 			continue;
@@ -60,7 +61,7 @@ static int create_composite_quirk(struct snd_usb_audio *chip,
 			return err;
 	}
 
-	for (quirk = quirk->data; quirk->ifnum >= 0; ++quirk) {
+	for (quirk = quirk_comp->data; quirk->ifnum >= 0; ++quirk) {
 		iface = usb_ifnum_to_if(chip->dev, quirk->ifnum);
 		if (!iface)
 			continue;
-- 
2.1.3



More information about the Alsa-devel mailing list