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: Damien Zammit <damien@zamaudio.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
8f7f3ab15e
commit
b7b435e81b
|
@ -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;
|
||||
/*
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue