|
@@ -2234,6 +2234,9 @@ static int parse_audio_unit(struct mixer_build *state, int unitid)
|
|
|
|
|
|
static void snd_usb_mixer_free(struct usb_mixer_interface *mixer)
|
|
|
{
|
|
|
+ /* kill pending URBs */
|
|
|
+ snd_usb_mixer_disconnect(mixer);
|
|
|
+
|
|
|
kfree(mixer->id_elems);
|
|
|
if (mixer->urb) {
|
|
|
kfree(mixer->urb->transfer_buffer);
|
|
@@ -2584,8 +2587,13 @@ _error:
|
|
|
|
|
|
void snd_usb_mixer_disconnect(struct usb_mixer_interface *mixer)
|
|
|
{
|
|
|
- usb_kill_urb(mixer->urb);
|
|
|
- usb_kill_urb(mixer->rc_urb);
|
|
|
+ if (mixer->disconnected)
|
|
|
+ return;
|
|
|
+ if (mixer->urb)
|
|
|
+ usb_kill_urb(mixer->urb);
|
|
|
+ if (mixer->rc_urb)
|
|
|
+ usb_kill_urb(mixer->rc_urb);
|
|
|
+ mixer->disconnected = true;
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PM
|