diff options
Diffstat (limited to 'sound/usb/usbmidi.c')
-rw-r--r-- | sound/usb/usbmidi.c | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c index 99295f9b7691..6330788c1c2b 100644 --- a/sound/usb/usbmidi.c +++ b/sound/usb/usbmidi.c | |||
@@ -407,6 +407,20 @@ static void snd_usbmidi_maudio_broken_running_status_input( | |||
407 | } | 407 | } |
408 | 408 | ||
409 | /* | 409 | /* |
410 | * CME protocol: like the standard protocol, but SysEx commands are sent as a | ||
411 | * single USB packet preceded by a 0x0F byte. | ||
412 | */ | ||
413 | static void snd_usbmidi_cme_input(struct snd_usb_midi_in_endpoint *ep, | ||
414 | uint8_t *buffer, int buffer_length) | ||
415 | { | ||
416 | if (buffer_length < 2 || (buffer[0] & 0x0f) != 0x0f) | ||
417 | snd_usbmidi_standard_input(ep, buffer, buffer_length); | ||
418 | else | ||
419 | snd_usbmidi_input_data(ep, buffer[0] >> 4, | ||
420 | &buffer[1], buffer_length - 1); | ||
421 | } | ||
422 | |||
423 | /* | ||
410 | * Adds one USB MIDI packet to the output buffer. | 424 | * Adds one USB MIDI packet to the output buffer. |
411 | */ | 425 | */ |
412 | static void snd_usbmidi_output_standard_packet(struct urb* urb, uint8_t p0, | 426 | static void snd_usbmidi_output_standard_packet(struct urb* urb, uint8_t p0, |
@@ -572,6 +586,12 @@ static struct usb_protocol_ops snd_usbmidi_maudio_broken_running_status_ops = { | |||
572 | .output_packet = snd_usbmidi_output_standard_packet, | 586 | .output_packet = snd_usbmidi_output_standard_packet, |
573 | }; | 587 | }; |
574 | 588 | ||
589 | static struct usb_protocol_ops snd_usbmidi_cme_ops = { | ||
590 | .input = snd_usbmidi_cme_input, | ||
591 | .output = snd_usbmidi_standard_output, | ||
592 | .output_packet = snd_usbmidi_output_standard_packet, | ||
593 | }; | ||
594 | |||
575 | /* | 595 | /* |
576 | * Novation USB MIDI protocol: number of data bytes is in the first byte | 596 | * Novation USB MIDI protocol: number of data bytes is in the first byte |
577 | * (when receiving) (+1!) or in the second byte (when sending); data begins | 597 | * (when receiving) (+1!) or in the second byte (when sending); data begins |
@@ -963,8 +983,10 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi* umidi, | |||
963 | snd_usbmidi_out_endpoint_delete(ep); | 983 | snd_usbmidi_out_endpoint_delete(ep); |
964 | return -ENOMEM; | 984 | return -ENOMEM; |
965 | } | 985 | } |
966 | /* we never use interrupt output pipes */ | 986 | if (ep_info->out_interval) |
967 | pipe = usb_sndbulkpipe(umidi->chip->dev, ep_info->out_ep); | 987 | pipe = usb_sndintpipe(umidi->chip->dev, ep_info->out_ep); |
988 | else | ||
989 | pipe = usb_sndbulkpipe(umidi->chip->dev, ep_info->out_ep); | ||
968 | if (umidi->chip->usb_id == USB_ID(0x0a92, 0x1020)) /* ESI M4U */ | 990 | if (umidi->chip->usb_id == USB_ID(0x0a92, 0x1020)) /* ESI M4U */ |
969 | /* FIXME: we need more URBs to get reasonable bandwidth here: */ | 991 | /* FIXME: we need more URBs to get reasonable bandwidth here: */ |
970 | ep->max_transfer = 4; | 992 | ep->max_transfer = 4; |
@@ -976,8 +998,14 @@ static int snd_usbmidi_out_endpoint_create(struct snd_usb_midi* umidi, | |||
976 | snd_usbmidi_out_endpoint_delete(ep); | 998 | snd_usbmidi_out_endpoint_delete(ep); |
977 | return -ENOMEM; | 999 | return -ENOMEM; |
978 | } | 1000 | } |
979 | usb_fill_bulk_urb(ep->urb, umidi->chip->dev, pipe, buffer, | 1001 | if (ep_info->out_interval) |
980 | ep->max_transfer, snd_usbmidi_out_urb_complete, ep); | 1002 | usb_fill_int_urb(ep->urb, umidi->chip->dev, pipe, buffer, |
1003 | ep->max_transfer, snd_usbmidi_out_urb_complete, | ||
1004 | ep, ep_info->out_interval); | ||
1005 | else | ||
1006 | usb_fill_bulk_urb(ep->urb, umidi->chip->dev, | ||
1007 | pipe, buffer, ep->max_transfer, | ||
1008 | snd_usbmidi_out_urb_complete, ep); | ||
981 | ep->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; | 1009 | ep->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; |
982 | 1010 | ||
983 | spin_lock_init(&ep->buffer_lock); | 1011 | spin_lock_init(&ep->buffer_lock); |
@@ -1323,6 +1351,13 @@ static int snd_usbmidi_get_ms_info(struct snd_usb_midi* umidi, | |||
1323 | endpoints[epidx].out_ep = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; | 1351 | endpoints[epidx].out_ep = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; |
1324 | if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) | 1352 | if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) |
1325 | endpoints[epidx].out_interval = ep->bInterval; | 1353 | endpoints[epidx].out_interval = ep->bInterval; |
1354 | else if (snd_usb_get_speed(umidi->chip->dev) == USB_SPEED_LOW) | ||
1355 | /* | ||
1356 | * Low speed bulk transfers don't exist, so | ||
1357 | * force interrupt transfers for devices like | ||
1358 | * ESI MIDI Mate that try to use them anyway. | ||
1359 | */ | ||
1360 | endpoints[epidx].out_interval = 1; | ||
1326 | endpoints[epidx].out_cables = (1 << ms_ep->bNumEmbMIDIJack) - 1; | 1361 | endpoints[epidx].out_cables = (1 << ms_ep->bNumEmbMIDIJack) - 1; |
1327 | snd_printdd(KERN_INFO "EP %02X: %d jack(s)\n", | 1362 | snd_printdd(KERN_INFO "EP %02X: %d jack(s)\n", |
1328 | ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); | 1363 | ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); |
@@ -1336,6 +1371,8 @@ static int snd_usbmidi_get_ms_info(struct snd_usb_midi* umidi, | |||
1336 | endpoints[epidx].in_ep = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; | 1371 | endpoints[epidx].in_ep = ep->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK; |
1337 | if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) | 1372 | if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT) |
1338 | endpoints[epidx].in_interval = ep->bInterval; | 1373 | endpoints[epidx].in_interval = ep->bInterval; |
1374 | else if (snd_usb_get_speed(umidi->chip->dev) == USB_SPEED_LOW) | ||
1375 | endpoints[epidx].in_interval = 1; | ||
1339 | endpoints[epidx].in_cables = (1 << ms_ep->bNumEmbMIDIJack) - 1; | 1376 | endpoints[epidx].in_cables = (1 << ms_ep->bNumEmbMIDIJack) - 1; |
1340 | snd_printdd(KERN_INFO "EP %02X: %d jack(s)\n", | 1377 | snd_printdd(KERN_INFO "EP %02X: %d jack(s)\n", |
1341 | ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); | 1378 | ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); |
@@ -1690,6 +1727,7 @@ int snd_usb_create_midi_interface(struct snd_usb_audio* chip, | |||
1690 | err = snd_usbmidi_detect_endpoints(umidi, &endpoints[0], 1); | 1727 | err = snd_usbmidi_detect_endpoints(umidi, &endpoints[0], 1); |
1691 | break; | 1728 | break; |
1692 | case QUIRK_MIDI_CME: | 1729 | case QUIRK_MIDI_CME: |
1730 | umidi->usb_protocol_ops = &snd_usbmidi_cme_ops; | ||
1693 | err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); | 1731 | err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); |
1694 | break; | 1732 | break; |
1695 | default: | 1733 | default: |