summaryrefslogtreecommitdiff
path: root/sound/usb
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2010-02-15 07:55:28 (GMT)
committerJaroslav Kysela <perex@perex.cz>2010-02-16 07:08:01 (GMT)
commitf167e1d073278fe231bbdd5d6c24fb9d091aa544 (patch)
tree98eea3aa4c5a559a608d375c4a8d269f333a5cb8 /sound/usb
parent9d4c7464458770d309169f7a7ce1ea6f8a4a7de5 (diff)
downloadlinux-f167e1d073278fe231bbdd5d6c24fb9d091aa544.tar.xz
ALSA: usb-audio: reduce MIDI packet size to work around broken firmware
Extend the list of devices whose firmware does not expect more than one USB MIDI packet in one USB packet. bug report: https://bugtrack.alsa-project.org/alsa-bug/view.php?id=3752 Signed-off-by: Clemens Ladisch <clemens@ladisch.de> Cc: <stable@kernel.org> Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'sound/usb')
-rw-r--r--sound/usb/usbmidi.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c
index 6e89b83..aae50df 100644
--- a/sound/usb/usbmidi.c
+++ b/sound/usb/usbmidi.c
@@ -1162,10 +1162,22 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi* umidi,
pipe = usb_sndintpipe(umidi->dev, ep_info->out_ep);
else
pipe = usb_sndbulkpipe(umidi->dev, ep_info->out_ep);
- if (umidi->usb_id == USB_ID(0x0a92, 0x1020)) /* ESI M4U */
- ep->max_transfer = 4;
- else
+ switch (umidi->usb_id) {
+ default:
ep->max_transfer = usb_maxpacket(umidi->dev, pipe, 1);
+ break;
+ /*
+ * Various chips declare a packet size larger than 4 bytes, but
+ * do not actually work with larger packets:
+ */
+ case USB_ID(0x0a92, 0x1020): /* ESI M4U */
+ case USB_ID(0x1430, 0x474b): /* RedOctane GH MIDI INTERFACE */
+ case USB_ID(0x15ca, 0x0101): /* Textech USB Midi Cable */
+ case USB_ID(0x15ca, 0x1806): /* Textech USB Midi Cable */
+ case USB_ID(0x1a86, 0x752d): /* QinHeng CH345 "USB2.0-MIDI" */
+ ep->max_transfer = 4;
+ break;
+ }
for (i = 0; i < OUTPUT_URBS; ++i) {
buffer = usb_buffer_alloc(umidi->dev,
ep->max_transfer, GFP_KERNEL,