At Fri, 20 Apr 2007 15:26:38 -0700,
Pete Zaitcev wrote:
> 
> Dear Takashi:
> 
> Hans de Goede (on cc:) hits a problem when snd-usb-audio breaks with:
> "USB device is in the shutdown state, cannot create a card instance".
> 
> This is how the place looks:
> 
>       chip = NULL;
>       for (i = 0; i < SNDRV_CARDS; i++) {
>               if (usb_chip[i] && usb_chip[i]->dev == dev) {
>                       if (usb_chip[i]->shutdown) {
>                               snd_printk(KERN_ERR "USB device is in the 
> shutdown state, cannot create a card instance\n");
>                               goto __error;
>                       }
>                       chip = usb_chip[i];
>                       break;
>               }
>       }
> 
> The code looks broken to me, because dev at this time is a new device
> structure, freshly allocated. You cannot compare it with an old instance,
> and I don't know why you would want to.

This function was implemented in that way because some devices have
multiple audio control interfaces per device, and it results in the
multiple calls of probe function for each interface.

> Unfortunately (for fortunately), I have zero clue about the way ALSA
> works, specifically rules for snd_device_ops.dev_free, so I am asking
> you to look at this problem.

Hard to guess unless knowing what is exactly happening, but most
likely a race at disconnection.  Yes, potentially the check of
usb_device there is a problem indeed.  The (untested) patch below
might fix.


Takashi

diff -r aed6a15c9398 sound/usb/usbaudio.c
--- a/sound/usb/usbaudio.c      Mon Apr 23 11:54:41 2007 +0200
+++ b/sound/usb/usbaudio.c      Mon Apr 23 12:09:12 2007 +0200
@@ -3611,6 +3611,7 @@ static void snd_usb_audio_disconnect(str
                list_for_each(p, &chip->mixer_list) {
                        snd_usb_mixer_disconnect(p);
                }
+               chip->dev = NULL;
                mutex_unlock(&register_mutex);
                snd_card_free_when_closed(card);
        } else {

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to