Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b7b435e8 authored by Damien Zammit's avatar Damien Zammit Committed by Takashi Iwai
Browse files

ALSA: usb-audio: Fix kernel panic of Digidesign Mbox2 quirk



This patch is based on 3.8-rc1. It fixes two things:
1) A kernel panic caused by incorrect allocation of a u8 variable
   "bootresponse".
2) A noisy dmesg (urb status -32) caused by broken pipe to an
   invalid midi endpoint.

It is also a little cleaner because there is no need for a new
QUIRK_MIDI type as suggested by kernel developers, since the device
follows exactly the MIDIMAN protocol.

Signed-off-by: default avatarDamien Zammit <damien@zamaudio.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 8f7f3ab1
Loading
Loading
Loading
Loading
+0 −4
Original line number Diff line number Diff line
@@ -2181,10 +2181,6 @@ int snd_usbmidi_create(struct snd_card *card,
		umidi->usb_protocol_ops = &snd_usbmidi_novation_ops;
		err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
		break;
	case QUIRK_MIDI_MBOX2:
		umidi->usb_protocol_ops = &snd_usbmidi_midiman_ops;
		err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
		break;
	case QUIRK_MIDI_RAW_BYTES:
		umidi->usb_protocol_ops = &snd_usbmidi_raw_ops;
		/*
+1 −1
Original line number Diff line number Diff line
@@ -3015,7 +3015,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
			},
			{
				.ifnum = 6,
				.type = QUIRK_MIDI_MBOX2,
				.type = QUIRK_MIDI_MIDIMAN,
				.data = &(const struct snd_usb_midi_endpoint_info) {
					.out_ep =  0x02,
					.out_cables = 0x0001,
+7 −9
Original line number Diff line number Diff line
@@ -306,7 +306,6 @@ int snd_usb_create_quirk(struct snd_usb_audio *chip,
		[QUIRK_MIDI_YAMAHA] = create_any_midi_quirk,
		[QUIRK_MIDI_MIDIMAN] = create_any_midi_quirk,
		[QUIRK_MIDI_NOVATION] = create_any_midi_quirk,
		[QUIRK_MIDI_MBOX2] = create_any_midi_quirk,
		[QUIRK_MIDI_RAW_BYTES] = create_any_midi_quirk,
		[QUIRK_MIDI_EMAGIC] = create_any_midi_quirk,
		[QUIRK_MIDI_CME] = create_any_midi_quirk,
@@ -528,11 +527,11 @@ static void mbox2_setup_48_24_magic(struct usb_device *dev)
#define MBOX2_BOOT_LOADING     0x01 /* Hard coded into the device */
#define MBOX2_BOOT_READY       0x02 /* Hard coded into the device */

int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
static int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
{
	struct usb_host_config *config = dev->actconfig;
	int err;
	u8 bootresponse;
	u8 bootresponse[12];
	int fwsize;
	int count;

@@ -546,20 +545,20 @@ int snd_usb_mbox2_boot_quirk(struct usb_device *dev)
	snd_printd("usb-audio: Sending Digidesign Mbox 2 boot sequence...\n");

	count = 0;
	bootresponse = MBOX2_BOOT_LOADING;
	while ((bootresponse == MBOX2_BOOT_LOADING) && (count < 10)) {
	bootresponse[0] = MBOX2_BOOT_LOADING;
	while ((bootresponse[0] == MBOX2_BOOT_LOADING) && (count < 10)) {
		msleep(500); /* 0.5 second delay */
		snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
			/* Control magic - load onboard firmware */
			0x85, 0xc0, 0x0001, 0x0000, &bootresponse, 0x0012);
		if (bootresponse == MBOX2_BOOT_READY)
		if (bootresponse[0] == MBOX2_BOOT_READY)
			break;
		snd_printd("usb-audio: device not ready, resending boot sequence...\n");
		count++;
	}

	if (bootresponse != MBOX2_BOOT_READY) {
		snd_printk(KERN_ERR "usb-audio: Unknown bootresponse=%d, or timed out, ignoring device.\n", bootresponse);
	if (bootresponse[0] != MBOX2_BOOT_READY) {
		snd_printk(KERN_ERR "usb-audio: Unknown bootresponse=%d, or timed out, ignoring device.\n", bootresponse[0]);
		return -ENODEV;
	}

@@ -660,7 +659,6 @@ static int audiophile_skip_setting_quirk(struct snd_usb_audio *chip,
	return 0; /* keep this altsetting */
}


static int fasttrackpro_skip_setting_quirk(struct snd_usb_audio *chip,
					   int iface, int altno)
{
+0 −1
Original line number Diff line number Diff line
@@ -76,7 +76,6 @@ enum quirk_type {
	QUIRK_MIDI_YAMAHA,
	QUIRK_MIDI_MIDIMAN,
	QUIRK_MIDI_NOVATION,
	QUIRK_MIDI_MBOX2,
	QUIRK_MIDI_RAW_BYTES,
	QUIRK_MIDI_EMAGIC,
	QUIRK_MIDI_CME,