Lines Matching +full:reserved +full:- +full:endpoints
2 * usbmidi.c - ALSA USB MIDI driver
4 * Copyright (c) 2002-2009 Clemens Ladisch
5 * All rights reserved.
7 * Based on the OSS usb-midi driver by NAGANO Daisuke,
111 } endpoints[MIDI_MAX_ENDPOINTS]; member
179 if (err < 0 && err != -ENODEV) in snd_usbmidi_submit_urb()
180 dev_err(&urb->dev->dev, "usb_submit_urb: %d\n", err); in snd_usbmidi_submit_urb()
189 switch (urb->status) { in snd_usbmidi_urb_error()
191 case -ENOENT: in snd_usbmidi_urb_error()
192 case -ECONNRESET: in snd_usbmidi_urb_error()
193 case -ESHUTDOWN: in snd_usbmidi_urb_error()
194 case -ENODEV: in snd_usbmidi_urb_error()
195 return -ENODEV; in snd_usbmidi_urb_error()
197 case -EPROTO: in snd_usbmidi_urb_error()
198 case -ETIME: in snd_usbmidi_urb_error()
199 case -EILSEQ: in snd_usbmidi_urb_error()
200 return -EIO; in snd_usbmidi_urb_error()
202 dev_err(&urb->dev->dev, "urb status %d\n", urb->status); in snd_usbmidi_urb_error()
213 struct usbmidi_in_port *port = &ep->ports[portidx]; in snd_usbmidi_input_data()
215 if (!port->substream) { in snd_usbmidi_input_data()
216 dev_dbg(&ep->umidi->dev->dev, "unexpected port %d!\n", portidx); in snd_usbmidi_input_data()
219 if (!test_bit(port->substream->number, &ep->umidi->input_triggered)) in snd_usbmidi_input_data()
221 snd_rawmidi_receive(port->substream, data, length); in snd_usbmidi_input_data()
228 for (; length > 0; ++data, --length) in dump_urb()
241 struct snd_usb_midi_in_endpoint *ep = urb->context; in snd_usbmidi_in_urb_complete()
243 if (urb->status == 0) { in snd_usbmidi_in_urb_complete()
244 dump_urb("received", urb->transfer_buffer, urb->actual_length); in snd_usbmidi_in_urb_complete()
245 ep->umidi->usb_protocol_ops->input(ep, urb->transfer_buffer, in snd_usbmidi_in_urb_complete()
246 urb->actual_length); in snd_usbmidi_in_urb_complete()
250 if (err != -ENODEV) { in snd_usbmidi_in_urb_complete()
251 ep->error_resubmit = 1; in snd_usbmidi_in_urb_complete()
252 mod_timer(&ep->umidi->error_timer, in snd_usbmidi_in_urb_complete()
259 urb->dev = ep->umidi->dev; in snd_usbmidi_in_urb_complete()
265 struct out_urb_context *context = urb->context; in snd_usbmidi_out_urb_complete()
266 struct snd_usb_midi_out_endpoint *ep = context->ep; in snd_usbmidi_out_urb_complete()
270 spin_lock_irqsave(&ep->buffer_lock, flags); in snd_usbmidi_out_urb_complete()
271 urb_index = context - ep->urbs; in snd_usbmidi_out_urb_complete()
272 ep->active_urbs &= ~(1 << urb_index); in snd_usbmidi_out_urb_complete()
273 if (unlikely(ep->drain_urbs)) { in snd_usbmidi_out_urb_complete()
274 ep->drain_urbs &= ~(1 << urb_index); in snd_usbmidi_out_urb_complete()
275 wake_up(&ep->drain_wait); in snd_usbmidi_out_urb_complete()
277 spin_unlock_irqrestore(&ep->buffer_lock, flags); in snd_usbmidi_out_urb_complete()
278 if (urb->status < 0) { in snd_usbmidi_out_urb_complete()
281 if (err != -ENODEV) in snd_usbmidi_out_urb_complete()
282 mod_timer(&ep->umidi->error_timer, in snd_usbmidi_out_urb_complete()
300 spin_lock_irqsave(&ep->buffer_lock, flags); in snd_usbmidi_do_output()
301 if (ep->umidi->disconnected) { in snd_usbmidi_do_output()
302 spin_unlock_irqrestore(&ep->buffer_lock, flags); in snd_usbmidi_do_output()
306 urb_index = ep->next_urb; in snd_usbmidi_do_output()
308 if (!(ep->active_urbs & (1 << urb_index))) { in snd_usbmidi_do_output()
309 urb = ep->urbs[urb_index].urb; in snd_usbmidi_do_output()
310 urb->transfer_buffer_length = 0; in snd_usbmidi_do_output()
311 ep->umidi->usb_protocol_ops->output(ep, urb); in snd_usbmidi_do_output()
312 if (urb->transfer_buffer_length == 0) in snd_usbmidi_do_output()
315 dump_urb("sending", urb->transfer_buffer, in snd_usbmidi_do_output()
316 urb->transfer_buffer_length); in snd_usbmidi_do_output()
317 urb->dev = ep->umidi->dev; in snd_usbmidi_do_output()
320 ep->active_urbs |= 1 << urb_index; in snd_usbmidi_do_output()
324 if (urb_index == ep->next_urb) in snd_usbmidi_do_output()
327 ep->next_urb = urb_index; in snd_usbmidi_do_output()
328 spin_unlock_irqrestore(&ep->buffer_lock, flags); in snd_usbmidi_do_output()
345 spin_lock(&umidi->disc_lock); in snd_usbmidi_error_timer()
346 if (umidi->disconnected) { in snd_usbmidi_error_timer()
347 spin_unlock(&umidi->disc_lock); in snd_usbmidi_error_timer()
351 struct snd_usb_midi_in_endpoint *in = umidi->endpoints[i].in; in snd_usbmidi_error_timer()
352 if (in && in->error_resubmit) { in snd_usbmidi_error_timer()
353 in->error_resubmit = 0; in snd_usbmidi_error_timer()
355 if (atomic_read(&in->urbs[j]->use_count)) in snd_usbmidi_error_timer()
357 in->urbs[j]->dev = umidi->dev; in snd_usbmidi_error_timer()
358 snd_usbmidi_submit_urb(in->urbs[j], GFP_ATOMIC); in snd_usbmidi_error_timer()
361 if (umidi->endpoints[i].out) in snd_usbmidi_error_timer()
362 snd_usbmidi_do_output(umidi->endpoints[i].out); in snd_usbmidi_error_timer()
364 spin_unlock(&umidi->disc_lock); in snd_usbmidi_error_timer()
367 /* helper function to send static data that may not DMA-able */
374 return -ENOMEM; in send_bulk_static_data()
376 if (ep->urbs[0].urb) in send_bulk_static_data()
377 err = usb_bulk_msg(ep->umidi->dev, ep->urbs[0].urb->pipe, in send_bulk_static_data()
417 * Buggy M-Audio device: running status on input results in a packet that has
430 struct usbmidi_in_port *port = &ep->ports[cable]; in snd_usbmidi_maudio_broken_running_status_input()
438 port->running_status_length = length - 1; in snd_usbmidi_maudio_broken_running_status_input()
440 port->running_status_length != 0 && in snd_usbmidi_maudio_broken_running_status_input()
443 length = port->running_status_length; in snd_usbmidi_maudio_broken_running_status_input()
451 port->running_status_length = 0; in snd_usbmidi_maudio_broken_running_status_input()
470 if (ep->in_sysex && in ch345_broken_sysex_input()
471 cin == ep->last_cin && in ch345_broken_sysex_input()
477 * Either a corrupted running status or a real note-on in ch345_broken_sysex_input()
484 ep->in_sysex = cin == 0x4; in ch345_broken_sysex_input()
485 if (!ep->in_sysex) in ch345_broken_sysex_input()
486 ep->last_cin = cin; in ch345_broken_sysex_input()
511 * into multiple 4-byte packets, but lumps everything together in snd_usbmidi_cme_input()
549 int tmp_length = remaining - 2; in snd_usbmidi_cme_input()
553 tmp_length--; in snd_usbmidi_cme_input()
555 data_length = tmp_buf - buffer; in snd_usbmidi_cme_input()
568 remaining -= source_length; in snd_usbmidi_cme_input()
581 (uint8_t *)urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_output_standard_packet()
586 urb->transfer_buffer_length += 4; in snd_usbmidi_output_standard_packet()
598 (uint8_t *)urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_output_midiman_packet()
603 urb->transfer_buffer_length += 4; in snd_usbmidi_output_midiman_packet()
612 uint8_t p0 = port->cable; in snd_usbmidi_transmit_byte()
614 port->ep->umidi->usb_protocol_ops->output_packet; in snd_usbmidi_transmit_byte()
621 port->data[0] = b; in snd_usbmidi_transmit_byte()
622 port->state = STATE_SYSEX_1; in snd_usbmidi_transmit_byte()
626 port->data[0] = b; in snd_usbmidi_transmit_byte()
627 port->state = STATE_1PARAM; in snd_usbmidi_transmit_byte()
630 port->data[0] = b; in snd_usbmidi_transmit_byte()
631 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
635 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
639 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
642 switch (port->state) { in snd_usbmidi_transmit_byte()
647 output_packet(urb, p0 | 0x06, port->data[0], in snd_usbmidi_transmit_byte()
651 output_packet(urb, p0 | 0x07, port->data[0], in snd_usbmidi_transmit_byte()
652 port->data[1], 0xf7); in snd_usbmidi_transmit_byte()
655 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
659 port->data[0] = b; in snd_usbmidi_transmit_byte()
661 port->state = STATE_1PARAM; in snd_usbmidi_transmit_byte()
663 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
665 switch (port->state) { in snd_usbmidi_transmit_byte()
667 if (port->data[0] < 0xf0) { in snd_usbmidi_transmit_byte()
668 p0 |= port->data[0] >> 4; in snd_usbmidi_transmit_byte()
671 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
673 output_packet(urb, p0, port->data[0], b, 0); in snd_usbmidi_transmit_byte()
676 port->data[1] = b; in snd_usbmidi_transmit_byte()
677 port->state = STATE_2PARAM_2; in snd_usbmidi_transmit_byte()
680 if (port->data[0] < 0xf0) { in snd_usbmidi_transmit_byte()
681 p0 |= port->data[0] >> 4; in snd_usbmidi_transmit_byte()
682 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
685 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
687 output_packet(urb, p0, port->data[0], port->data[1], b); in snd_usbmidi_transmit_byte()
690 port->data[0] = b; in snd_usbmidi_transmit_byte()
691 port->state = STATE_SYSEX_1; in snd_usbmidi_transmit_byte()
694 port->data[1] = b; in snd_usbmidi_transmit_byte()
695 port->state = STATE_SYSEX_2; in snd_usbmidi_transmit_byte()
698 output_packet(urb, p0 | 0x04, port->data[0], in snd_usbmidi_transmit_byte()
699 port->data[1], b); in snd_usbmidi_transmit_byte()
700 port->state = STATE_SYSEX_0; in snd_usbmidi_transmit_byte()
711 /* FIXME: lower-numbered ports can starve higher-numbered ports */ in snd_usbmidi_standard_output()
713 struct usbmidi_out_port *port = &ep->ports[p]; in snd_usbmidi_standard_output()
714 if (!port->active) in snd_usbmidi_standard_output()
716 while (urb->transfer_buffer_length + 3 < ep->max_transfer) { in snd_usbmidi_standard_output()
718 if (snd_rawmidi_transmit(port->substream, &b, 1) != 1) { in snd_usbmidi_standard_output()
719 port->active = 0; in snd_usbmidi_standard_output()
779 unsigned int port = (buffer[pos] >> 4) - 1; in snd_usbmidi_akai_input()
796 struct snd_rawmidi_substream *substream = ep->ports[0].substream; in snd_usbmidi_akai_output()
798 if (!ep->ports[0].active) in snd_usbmidi_akai_output()
801 msg = urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_akai_output()
802 buf_end = ep->max_transfer - MAX_AKAI_SYSEX_LEN - 1; in snd_usbmidi_akai_output()
805 while (urb->transfer_buffer_length < buf_end) { in snd_usbmidi_akai_output()
809 ep->ports[0].active = 0; in snd_usbmidi_akai_output()
812 /* try to skip non-SysEx data */ in snd_usbmidi_akai_output()
827 /* it's incomplete - drop it */ in snd_usbmidi_akai_output()
838 urb->transfer_buffer_length += count + 1; in snd_usbmidi_akai_output()
842 /* less than 9 bytes and no end byte - wait for more */ in snd_usbmidi_akai_output()
844 ep->ports[0].active = 0; in snd_usbmidi_akai_output()
847 /* 9 bytes and no end marker in sight - malformed, skip it */ in snd_usbmidi_akai_output()
868 snd_usbmidi_input_data(ep, 0, &buffer[2], buffer[0] - 1); in snd_usbmidi_novation_input()
877 if (!ep->ports[0].active) in snd_usbmidi_novation_output()
879 transfer_buffer = urb->transfer_buffer; in snd_usbmidi_novation_output()
880 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_novation_output()
882 ep->max_transfer - 2); in snd_usbmidi_novation_output()
884 ep->ports[0].active = 0; in snd_usbmidi_novation_output()
889 urb->transfer_buffer_length = 2 + count; in snd_usbmidi_novation_output()
912 if (!ep->ports[0].active) in snd_usbmidi_raw_output()
914 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_raw_output()
915 urb->transfer_buffer, in snd_usbmidi_raw_output()
916 ep->max_transfer); in snd_usbmidi_raw_output()
918 ep->ports[0].active = 0; in snd_usbmidi_raw_output()
921 urb->transfer_buffer_length = count; in snd_usbmidi_raw_output()
937 snd_usbmidi_input_data(ep, 0, buffer + 2, buffer_length - 2); in snd_usbmidi_ftdi_input()
951 while (buffer_length && buffer[buffer_length - 1] == 0xFD) in snd_usbmidi_us122l_input()
952 buffer_length--; in snd_usbmidi_us122l_input()
962 if (!ep->ports[0].active) in snd_usbmidi_us122l_output()
964 switch (snd_usb_get_speed(ep->umidi->dev)) { in snd_usbmidi_us122l_output()
973 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_us122l_output()
974 urb->transfer_buffer, in snd_usbmidi_us122l_output()
977 ep->ports[0].active = 0; in snd_usbmidi_us122l_output()
981 memset(urb->transfer_buffer + count, 0xFD, ep->max_transfer - count); in snd_usbmidi_us122l_output()
982 urb->transfer_buffer_length = ep->max_transfer; in snd_usbmidi_us122l_output()
1040 if (ep->seen_f5) in snd_usbmidi_emagic_input()
1048 snd_usbmidi_input_data(ep, ep->current_port, buffer, i); in snd_usbmidi_emagic_input()
1050 buffer_length -= i; in snd_usbmidi_emagic_input()
1055 ep->seen_f5 = 1; in snd_usbmidi_emagic_input()
1057 --buffer_length; in snd_usbmidi_emagic_input()
1063 ep->current_port = (buffer[0] - 1) & 15; in snd_usbmidi_emagic_input()
1065 --buffer_length; in snd_usbmidi_emagic_input()
1067 ep->seen_f5 = 0; in snd_usbmidi_emagic_input()
1074 int port0 = ep->current_port; in snd_usbmidi_emagic_output()
1075 uint8_t *buf = urb->transfer_buffer; in snd_usbmidi_emagic_output()
1076 int buf_free = ep->max_transfer; in snd_usbmidi_emagic_output()
1080 /* round-robin, starting at the last current port */ in snd_usbmidi_emagic_output()
1082 struct usbmidi_out_port *port = &ep->ports[portnum]; in snd_usbmidi_emagic_output()
1084 if (!port->active) in snd_usbmidi_emagic_output()
1086 if (snd_rawmidi_transmit_peek(port->substream, buf, 1) != 1) { in snd_usbmidi_emagic_output()
1087 port->active = 0; in snd_usbmidi_emagic_output()
1091 if (portnum != ep->current_port) { in snd_usbmidi_emagic_output()
1094 ep->current_port = portnum; in snd_usbmidi_emagic_output()
1098 buf_free -= 2; in snd_usbmidi_emagic_output()
1103 length = snd_rawmidi_transmit(port->substream, buf, buf_free); in snd_usbmidi_emagic_output()
1106 buf_free -= length; in snd_usbmidi_emagic_output()
1111 if (buf_free < ep->max_transfer && buf_free > 0) { in snd_usbmidi_emagic_output()
1113 --buf_free; in snd_usbmidi_emagic_output()
1115 urb->transfer_buffer_length = ep->max_transfer - buf_free; in snd_usbmidi_emagic_output()
1133 intf = umidi->iface; in update_roland_altsetting()
1134 is_light_load = intf->cur_altsetting != intf->altsetting; in update_roland_altsetting()
1135 if (umidi->roland_load_ctl->private_value == is_light_load) in update_roland_altsetting()
1137 hostif = &intf->altsetting[umidi->roland_load_ctl->private_value]; in update_roland_altsetting()
1139 snd_usbmidi_input_stop(&umidi->list); in update_roland_altsetting()
1140 usb_set_interface(umidi->dev, intfd->bInterfaceNumber, in update_roland_altsetting()
1141 intfd->bAlternateSetting); in update_roland_altsetting()
1142 snd_usbmidi_input_start(&umidi->list); in update_roland_altsetting()
1148 struct snd_usb_midi *umidi = substream->rmidi->private_data; in substream_open()
1151 down_read(&umidi->disc_rwsem); in substream_open()
1152 if (umidi->disconnected) { in substream_open()
1153 up_read(&umidi->disc_rwsem); in substream_open()
1154 return open ? -ENODEV : 0; in substream_open()
1157 mutex_lock(&umidi->mutex); in substream_open()
1159 if (!umidi->opened[0] && !umidi->opened[1]) { in substream_open()
1160 if (umidi->roland_load_ctl) { in substream_open()
1161 ctl = umidi->roland_load_ctl; in substream_open()
1162 ctl->vd[0].access |= in substream_open()
1164 snd_ctl_notify(umidi->card, in substream_open()
1165 SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); in substream_open()
1169 umidi->opened[dir]++; in substream_open()
1170 if (umidi->opened[1]) in substream_open()
1171 snd_usbmidi_input_start(&umidi->list); in substream_open()
1173 umidi->opened[dir]--; in substream_open()
1174 if (!umidi->opened[1]) in substream_open()
1175 snd_usbmidi_input_stop(&umidi->list); in substream_open()
1176 if (!umidi->opened[0] && !umidi->opened[1]) { in substream_open()
1177 if (umidi->roland_load_ctl) { in substream_open()
1178 ctl = umidi->roland_load_ctl; in substream_open()
1179 ctl->vd[0].access &= in substream_open()
1181 snd_ctl_notify(umidi->card, in substream_open()
1182 SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); in substream_open()
1186 mutex_unlock(&umidi->mutex); in substream_open()
1187 up_read(&umidi->disc_rwsem); in substream_open()
1193 struct snd_usb_midi *umidi = substream->rmidi->private_data; in snd_usbmidi_output_open()
1198 if (umidi->endpoints[i].out) in snd_usbmidi_output_open()
1200 if (umidi->endpoints[i].out->ports[j].substream == substream) { in snd_usbmidi_output_open()
1201 port = &umidi->endpoints[i].out->ports[j]; in snd_usbmidi_output_open()
1205 return -ENXIO; in snd_usbmidi_output_open()
1207 substream->runtime->private_data = port; in snd_usbmidi_output_open()
1208 port->state = STATE_UNKNOWN; in snd_usbmidi_output_open()
1214 struct usbmidi_out_port *port = substream->runtime->private_data; in snd_usbmidi_output_close()
1216 flush_work(&port->ep->work); in snd_usbmidi_output_close()
1224 (struct usbmidi_out_port *)substream->runtime->private_data; in snd_usbmidi_output_trigger()
1226 port->active = up; in snd_usbmidi_output_trigger()
1228 if (port->ep->umidi->disconnected) { in snd_usbmidi_output_trigger()
1234 queue_work(system_highpri_wq, &port->ep->work); in snd_usbmidi_output_trigger()
1240 struct usbmidi_out_port *port = substream->runtime->private_data; in snd_usbmidi_output_drain()
1241 struct snd_usb_midi_out_endpoint *ep = port->ep; in snd_usbmidi_output_drain()
1246 if (ep->umidi->disconnected) in snd_usbmidi_output_drain()
1252 spin_lock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1253 drain_urbs = ep->active_urbs; in snd_usbmidi_output_drain()
1255 ep->drain_urbs |= drain_urbs; in snd_usbmidi_output_drain()
1257 prepare_to_wait(&ep->drain_wait, &wait, in snd_usbmidi_output_drain()
1259 spin_unlock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1261 spin_lock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1262 drain_urbs &= ep->drain_urbs; in snd_usbmidi_output_drain()
1264 finish_wait(&ep->drain_wait, &wait); in snd_usbmidi_output_drain()
1266 port->active = 0; in snd_usbmidi_output_drain()
1267 spin_unlock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1283 struct snd_usb_midi *umidi = substream->rmidi->private_data; in snd_usbmidi_input_trigger()
1286 set_bit(substream->number, &umidi->input_triggered); in snd_usbmidi_input_trigger()
1288 clear_bit(substream->number, &umidi->input_triggered); in snd_usbmidi_input_trigger()
1307 usb_free_coherent(umidi->dev, buffer_length, in free_urb_and_buffer()
1308 urb->transfer_buffer, urb->transfer_dma); in free_urb_and_buffer()
1321 if (ep->urbs[i]) in snd_usbmidi_in_endpoint_delete()
1322 free_urb_and_buffer(ep->umidi, ep->urbs[i], in snd_usbmidi_in_endpoint_delete()
1323 ep->urbs[i]->transfer_buffer_length); in snd_usbmidi_in_endpoint_delete()
1341 rep->in = NULL; in snd_usbmidi_in_endpoint_create()
1344 return -ENOMEM; in snd_usbmidi_in_endpoint_create()
1345 ep->umidi = umidi; in snd_usbmidi_in_endpoint_create()
1348 ep->urbs[i] = usb_alloc_urb(0, GFP_KERNEL); in snd_usbmidi_in_endpoint_create()
1349 if (!ep->urbs[i]) { in snd_usbmidi_in_endpoint_create()
1350 err = -ENOMEM; in snd_usbmidi_in_endpoint_create()
1354 if (ep_info->in_interval) in snd_usbmidi_in_endpoint_create()
1355 pipe = usb_rcvintpipe(umidi->dev, ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1357 pipe = usb_rcvbulkpipe(umidi->dev, ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1358 length = usb_maxpacket(umidi->dev, pipe); in snd_usbmidi_in_endpoint_create()
1360 buffer = usb_alloc_coherent(umidi->dev, length, GFP_KERNEL, in snd_usbmidi_in_endpoint_create()
1361 &ep->urbs[i]->transfer_dma); in snd_usbmidi_in_endpoint_create()
1363 err = -ENOMEM; in snd_usbmidi_in_endpoint_create()
1366 if (ep_info->in_interval) in snd_usbmidi_in_endpoint_create()
1367 usb_fill_int_urb(ep->urbs[i], umidi->dev, in snd_usbmidi_in_endpoint_create()
1370 ep, ep_info->in_interval); in snd_usbmidi_in_endpoint_create()
1372 usb_fill_bulk_urb(ep->urbs[i], umidi->dev, in snd_usbmidi_in_endpoint_create()
1375 ep->urbs[i]->transfer_flags = URB_NO_TRANSFER_DMA_MAP; in snd_usbmidi_in_endpoint_create()
1376 err = usb_urb_ep_type_check(ep->urbs[i]); in snd_usbmidi_in_endpoint_create()
1378 dev_err(&umidi->dev->dev, "invalid MIDI in EP %x\n", in snd_usbmidi_in_endpoint_create()
1379 ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1384 rep->in = ep; in snd_usbmidi_in_endpoint_create()
1401 if (ep->urbs[i].urb) { in snd_usbmidi_out_endpoint_clear()
1402 free_urb_and_buffer(ep->umidi, ep->urbs[i].urb, in snd_usbmidi_out_endpoint_clear()
1403 ep->max_transfer); in snd_usbmidi_out_endpoint_clear()
1404 ep->urbs[i].urb = NULL; in snd_usbmidi_out_endpoint_clear()
1427 rep->out = NULL; in snd_usbmidi_out_endpoint_create()
1430 return -ENOMEM; in snd_usbmidi_out_endpoint_create()
1431 ep->umidi = umidi; in snd_usbmidi_out_endpoint_create()
1434 ep->urbs[i].urb = usb_alloc_urb(0, GFP_KERNEL); in snd_usbmidi_out_endpoint_create()
1435 if (!ep->urbs[i].urb) { in snd_usbmidi_out_endpoint_create()
1436 err = -ENOMEM; in snd_usbmidi_out_endpoint_create()
1439 ep->urbs[i].ep = ep; in snd_usbmidi_out_endpoint_create()
1441 if (ep_info->out_interval) in snd_usbmidi_out_endpoint_create()
1442 pipe = usb_sndintpipe(umidi->dev, ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1444 pipe = usb_sndbulkpipe(umidi->dev, ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1445 switch (umidi->usb_id) { in snd_usbmidi_out_endpoint_create()
1447 ep->max_transfer = usb_maxpacket(umidi->dev, pipe); in snd_usbmidi_out_endpoint_create()
1458 case USB_ID(0x1a86, 0x752d): /* QinHeng CH345 "USB2.0-MIDI" */ in snd_usbmidi_out_endpoint_create()
1460 ep->max_transfer = 4; in snd_usbmidi_out_endpoint_create()
1465 case USB_ID(0x0644, 0x800e): /* Tascam US-122L */ in snd_usbmidi_out_endpoint_create()
1466 case USB_ID(0x0644, 0x800f): /* Tascam US-144 */ in snd_usbmidi_out_endpoint_create()
1467 ep->max_transfer = 9; in snd_usbmidi_out_endpoint_create()
1471 buffer = usb_alloc_coherent(umidi->dev, in snd_usbmidi_out_endpoint_create()
1472 ep->max_transfer, GFP_KERNEL, in snd_usbmidi_out_endpoint_create()
1473 &ep->urbs[i].urb->transfer_dma); in snd_usbmidi_out_endpoint_create()
1475 err = -ENOMEM; in snd_usbmidi_out_endpoint_create()
1478 if (ep_info->out_interval) in snd_usbmidi_out_endpoint_create()
1479 usb_fill_int_urb(ep->urbs[i].urb, umidi->dev, in snd_usbmidi_out_endpoint_create()
1480 pipe, buffer, ep->max_transfer, in snd_usbmidi_out_endpoint_create()
1482 &ep->urbs[i], ep_info->out_interval); in snd_usbmidi_out_endpoint_create()
1484 usb_fill_bulk_urb(ep->urbs[i].urb, umidi->dev, in snd_usbmidi_out_endpoint_create()
1485 pipe, buffer, ep->max_transfer, in snd_usbmidi_out_endpoint_create()
1487 &ep->urbs[i]); in snd_usbmidi_out_endpoint_create()
1488 err = usb_urb_ep_type_check(ep->urbs[i].urb); in snd_usbmidi_out_endpoint_create()
1490 dev_err(&umidi->dev->dev, "invalid MIDI out EP %x\n", in snd_usbmidi_out_endpoint_create()
1491 ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1494 ep->urbs[i].urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; in snd_usbmidi_out_endpoint_create()
1497 spin_lock_init(&ep->buffer_lock); in snd_usbmidi_out_endpoint_create()
1498 INIT_WORK(&ep->work, snd_usbmidi_out_work); in snd_usbmidi_out_endpoint_create()
1499 init_waitqueue_head(&ep->drain_wait); in snd_usbmidi_out_endpoint_create()
1502 if (ep_info->out_cables & (1 << i)) { in snd_usbmidi_out_endpoint_create()
1503 ep->ports[i].ep = ep; in snd_usbmidi_out_endpoint_create()
1504 ep->ports[i].cable = i << 4; in snd_usbmidi_out_endpoint_create()
1507 if (umidi->usb_protocol_ops->init_out_endpoint) in snd_usbmidi_out_endpoint_create()
1508 umidi->usb_protocol_ops->init_out_endpoint(ep); in snd_usbmidi_out_endpoint_create()
1510 rep->out = ep; in snd_usbmidi_out_endpoint_create()
1526 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_free()
1527 if (ep->out) in snd_usbmidi_free()
1528 snd_usbmidi_out_endpoint_delete(ep->out); in snd_usbmidi_free()
1529 if (ep->in) in snd_usbmidi_free()
1530 snd_usbmidi_in_endpoint_delete(ep->in); in snd_usbmidi_free()
1532 mutex_destroy(&umidi->mutex); in snd_usbmidi_free()
1550 down_write(&umidi->disc_rwsem); in snd_usbmidi_disconnect()
1551 spin_lock_irq(&umidi->disc_lock); in snd_usbmidi_disconnect()
1552 umidi->disconnected = 1; in snd_usbmidi_disconnect()
1553 spin_unlock_irq(&umidi->disc_lock); in snd_usbmidi_disconnect()
1554 up_write(&umidi->disc_rwsem); in snd_usbmidi_disconnect()
1556 timer_delete_sync(&umidi->error_timer); in snd_usbmidi_disconnect()
1559 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_disconnect()
1560 if (ep->out) in snd_usbmidi_disconnect()
1561 cancel_work_sync(&ep->out->work); in snd_usbmidi_disconnect()
1562 if (ep->out) { in snd_usbmidi_disconnect()
1564 usb_kill_urb(ep->out->urbs[j].urb); in snd_usbmidi_disconnect()
1565 if (umidi->usb_protocol_ops->finish_out_endpoint) in snd_usbmidi_disconnect()
1566 umidi->usb_protocol_ops->finish_out_endpoint(ep->out); in snd_usbmidi_disconnect()
1567 ep->out->active_urbs = 0; in snd_usbmidi_disconnect()
1568 if (ep->out->drain_urbs) { in snd_usbmidi_disconnect()
1569 ep->out->drain_urbs = 0; in snd_usbmidi_disconnect()
1570 wake_up(&ep->out->drain_wait); in snd_usbmidi_disconnect()
1573 if (ep->in) in snd_usbmidi_disconnect()
1575 usb_kill_urb(ep->in->urbs[j]); in snd_usbmidi_disconnect()
1576 /* free endpoints here; later call can result in Oops */ in snd_usbmidi_disconnect()
1577 if (ep->out) in snd_usbmidi_disconnect()
1578 snd_usbmidi_out_endpoint_clear(ep->out); in snd_usbmidi_disconnect()
1579 if (ep->in) { in snd_usbmidi_disconnect()
1580 snd_usbmidi_in_endpoint_delete(ep->in); in snd_usbmidi_disconnect()
1581 ep->in = NULL; in snd_usbmidi_disconnect()
1589 struct snd_usb_midi *umidi = rmidi->private_data; in snd_usbmidi_rawmidi_free()
1599 list_for_each_entry(substream, &umidi->rmidi->streams[stream].substreams, in snd_usbmidi_find_substream()
1601 if (substream->number == number) in snd_usbmidi_find_substream()
1662 /* Roland UA-100 */
1664 /* Roland SC-8850 */
1671 /* Roland U-8 */
1674 /* Roland SC-8820 */
1678 /* Roland SK-500 */
1682 /* Roland SC-D70 */
1686 /* Edirol UM-880 */
1688 /* Edirol SD-90 */
1693 /* Edirol UM-550 */
1695 /* Edirol SD-20 */
1699 /* Edirol SD-80 */
1704 /* Edirol UA-700 */
1715 /* BOSS GS-10 */
1718 /* Edirol UA-1000 */
1721 /* Edirol UR-80 */
1725 /* Edirol PCR-A */
1729 /* BOSS GT-PRO */
1731 /* Edirol UM-3EX */
1733 /* Roland VG-99 */
1736 /* Cakewalk Sonar V-Studio 100 */
1739 /* Roland VB-99 */
1742 /* Roland A-PRO */
1746 /* Roland SD-50 */
1750 /* Roland OCTA-CAPTURE */
1755 /* Roland SPD-SX */
1758 /* Roland A-Series */
1761 /* Roland INTEGRA-7 */
1764 /* M-Audio MidiSport 8x8 */
1792 if (snd_usbmidi_port_info[i].id == umidi->usb_id && in find_port_info()
1802 struct snd_usb_midi *umidi = rmidi->private_data; in snd_usbmidi_get_port_info()
1808 seq_port_info->type = port_info->seq_flags; in snd_usbmidi_get_port_info()
1809 seq_port_info->midi_voices = port_info->voices; in snd_usbmidi_get_port_info()
1816 unsigned char *extra = hostif->extra; in find_usb_ijack()
1817 int extralen = hostif->extralen; in find_usb_ijack()
1825 if (h->bDescriptorType != USB_DT_CS_INTERFACE) in find_usb_ijack()
1829 if (h->bLength >= sizeof(*outjd) && in find_usb_ijack()
1830 outjd->bDescriptorSubtype == UAC_MIDI_OUT_JACK && in find_usb_ijack()
1831 outjd->bJackID == jack_id) { in find_usb_ijack()
1832 sz = USB_DT_MIDI_OUT_SIZE(outjd->bNrInputPins); in find_usb_ijack()
1833 if (outjd->bLength < sz) in find_usb_ijack()
1835 return *(extra + sz - 1); in find_usb_ijack()
1839 if (injd->bLength >= sizeof(*injd) && in find_usb_ijack()
1840 injd->bDescriptorSubtype == UAC_MIDI_IN_JACK && in find_usb_ijack()
1841 injd->bJackID == jack_id) in find_usb_ijack()
1842 return injd->iJack; in find_usb_ijack()
1847 extralen -= extra[0]; in find_usb_ijack()
1870 dev_err(&umidi->dev->dev, "substream %d:%d not found\n", stream, in snd_usbmidi_init_substream()
1875 intf = umidi->iface; in snd_usbmidi_init_substream()
1877 hostif = intf->cur_altsetting; in snd_usbmidi_init_substream()
1880 res = usb_string(umidi->dev, iJack, jack_name_buf, in snd_usbmidi_init_substream()
1889 strncmp(umidi->card->shortname, jack_name, strlen(umidi->card->shortname)) != 0) { in snd_usbmidi_init_substream()
1890 name_format = port_info ? port_info->name : in snd_usbmidi_init_substream()
1892 snprintf(substream->name, sizeof(substream->name), in snd_usbmidi_init_substream()
1893 name_format, umidi->card->shortname, jack_name, number + 1); in snd_usbmidi_init_substream()
1898 strscpy(substream->name, jack_name); in snd_usbmidi_init_substream()
1905 * Creates the endpoints and their ports.
1908 struct snd_usb_midi_endpoint_info *endpoints) in snd_usbmidi_create_endpoints() argument
1914 if (endpoints[i].out_cables) { in snd_usbmidi_create_endpoints()
1916 &endpoints[i], in snd_usbmidi_create_endpoints()
1917 &umidi->endpoints[i]); in snd_usbmidi_create_endpoints()
1921 if (endpoints[i].in_cables) { in snd_usbmidi_create_endpoints()
1923 &endpoints[i], in snd_usbmidi_create_endpoints()
1924 &umidi->endpoints[i]); in snd_usbmidi_create_endpoints()
1930 if (endpoints[i].out_cables & (1 << j)) { in snd_usbmidi_create_endpoints()
1934 endpoints[i].assoc_out_jacks[j], in snd_usbmidi_create_endpoints()
1935 &umidi->endpoints[i].out->ports[j].substream); in snd_usbmidi_create_endpoints()
1938 if (endpoints[i].in_cables & (1 << j)) { in snd_usbmidi_create_endpoints()
1942 endpoints[i].assoc_in_jacks[j], in snd_usbmidi_create_endpoints()
1943 &umidi->endpoints[i].in->ports[j].substream); in snd_usbmidi_create_endpoints()
1948 dev_dbg(&umidi->dev->dev, "created %d output and %d input ports\n", in snd_usbmidi_create_endpoints()
1956 unsigned char *extra = hostep->extra; in find_usb_ms_endpoint_descriptor()
1957 int extralen = hostep->extralen; in find_usb_ms_endpoint_descriptor()
1963 if (ms_ep->bLength > 3 && in find_usb_ms_endpoint_descriptor()
1964 ms_ep->bDescriptorType == USB_DT_CS_ENDPOINT && in find_usb_ms_endpoint_descriptor()
1965 ms_ep->bDescriptorSubtype == UAC_MS_GENERAL) in find_usb_ms_endpoint_descriptor()
1969 extralen -= extra[0]; in find_usb_ms_endpoint_descriptor()
1979 struct snd_usb_midi_endpoint_info *endpoints) in snd_usbmidi_get_ms_info() argument
1990 intf = umidi->iface; in snd_usbmidi_get_ms_info()
1992 return -ENXIO; in snd_usbmidi_get_ms_info()
1993 hostif = &intf->altsetting[0]; in snd_usbmidi_get_ms_info()
1995 ms_header = (struct usb_ms_header_descriptor *)hostif->extra; in snd_usbmidi_get_ms_info()
1996 if (hostif->extralen >= 7 && in snd_usbmidi_get_ms_info()
1997 ms_header->bLength >= 7 && in snd_usbmidi_get_ms_info()
1998 ms_header->bDescriptorType == USB_DT_CS_INTERFACE && in snd_usbmidi_get_ms_info()
1999 ms_header->bDescriptorSubtype == UAC_HEADER) in snd_usbmidi_get_ms_info()
2000 dev_dbg(&umidi->dev->dev, "MIDIStreaming version %02x.%02x\n", in snd_usbmidi_get_ms_info()
2001 ((uint8_t *)&ms_header->bcdMSC)[1], ((uint8_t *)&ms_header->bcdMSC)[0]); in snd_usbmidi_get_ms_info()
2003 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
2007 for (i = 0; i < intfd->bNumEndpoints; ++i) { in snd_usbmidi_get_ms_info()
2008 hostep = &hostif->endpoint[i]; in snd_usbmidi_get_ms_info()
2015 if (ms_ep->bLength <= sizeof(*ms_ep)) in snd_usbmidi_get_ms_info()
2017 if (ms_ep->bNumEmbMIDIJack > 0x10) in snd_usbmidi_get_ms_info()
2019 if (ms_ep->bLength < sizeof(*ms_ep) + ms_ep->bNumEmbMIDIJack) in snd_usbmidi_get_ms_info()
2022 if (endpoints[epidx].out_ep) { in snd_usbmidi_get_ms_info()
2024 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
2025 "too many endpoints\n"); in snd_usbmidi_get_ms_info()
2029 endpoints[epidx].out_ep = usb_endpoint_num(ep); in snd_usbmidi_get_ms_info()
2031 endpoints[epidx].out_interval = ep->bInterval; in snd_usbmidi_get_ms_info()
2032 else if (snd_usb_get_speed(umidi->dev) == USB_SPEED_LOW) in snd_usbmidi_get_ms_info()
2038 endpoints[epidx].out_interval = 1; in snd_usbmidi_get_ms_info()
2039 endpoints[epidx].out_cables = in snd_usbmidi_get_ms_info()
2040 (1 << ms_ep->bNumEmbMIDIJack) - 1; in snd_usbmidi_get_ms_info()
2041 for (j = 0; j < ms_ep->bNumEmbMIDIJack; ++j) in snd_usbmidi_get_ms_info()
2042 endpoints[epidx].assoc_out_jacks[j] = ms_ep->baAssocJackID[j]; in snd_usbmidi_get_ms_info()
2043 for (; j < ARRAY_SIZE(endpoints[epidx].assoc_out_jacks); ++j) in snd_usbmidi_get_ms_info()
2044 endpoints[epidx].assoc_out_jacks[j] = -1; in snd_usbmidi_get_ms_info()
2045 dev_dbg(&umidi->dev->dev, "EP %02X: %d jack(s)\n", in snd_usbmidi_get_ms_info()
2046 ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); in snd_usbmidi_get_ms_info()
2048 if (endpoints[epidx].in_ep) { in snd_usbmidi_get_ms_info()
2050 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
2051 "too many endpoints\n"); in snd_usbmidi_get_ms_info()
2055 endpoints[epidx].in_ep = usb_endpoint_num(ep); in snd_usbmidi_get_ms_info()
2057 endpoints[epidx].in_interval = ep->bInterval; in snd_usbmidi_get_ms_info()
2058 else if (snd_usb_get_speed(umidi->dev) == USB_SPEED_LOW) in snd_usbmidi_get_ms_info()
2059 endpoints[epidx].in_interval = 1; in snd_usbmidi_get_ms_info()
2060 endpoints[epidx].in_cables = in snd_usbmidi_get_ms_info()
2061 (1 << ms_ep->bNumEmbMIDIJack) - 1; in snd_usbmidi_get_ms_info()
2062 for (j = 0; j < ms_ep->bNumEmbMIDIJack; ++j) in snd_usbmidi_get_ms_info()
2063 endpoints[epidx].assoc_in_jacks[j] = ms_ep->baAssocJackID[j]; in snd_usbmidi_get_ms_info()
2064 for (; j < ARRAY_SIZE(endpoints[epidx].assoc_in_jacks); ++j) in snd_usbmidi_get_ms_info()
2065 endpoints[epidx].assoc_in_jacks[j] = -1; in snd_usbmidi_get_ms_info()
2066 dev_dbg(&umidi->dev->dev, "EP %02X: %d jack(s)\n", in snd_usbmidi_get_ms_info()
2067 ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); in snd_usbmidi_get_ms_info()
2084 value->value.enumerated.item[0] = kcontrol->private_value; in roland_load_get()
2091 struct snd_usb_midi *umidi = kcontrol->private_data; in roland_load_put()
2094 if (value->value.enumerated.item[0] > 1) in roland_load_put()
2095 return -EINVAL; in roland_load_put()
2096 mutex_lock(&umidi->mutex); in roland_load_put()
2097 changed = value->value.enumerated.item[0] != kcontrol->private_value; in roland_load_put()
2099 kcontrol->private_value = value->value.enumerated.item[0]; in roland_load_put()
2100 mutex_unlock(&umidi->mutex); in roland_load_put()
2123 intf = umidi->iface; in snd_usbmidi_switch_roland_altsetting()
2124 if (!intf || intf->num_altsetting != 2) in snd_usbmidi_switch_roland_altsetting()
2127 hostif = &intf->altsetting[1]; in snd_usbmidi_switch_roland_altsetting()
2129 /* If either or both of the endpoints support interrupt transfer, in snd_usbmidi_switch_roland_altsetting()
2132 if (intfd->bNumEndpoints != 2 || in snd_usbmidi_switch_roland_altsetting()
2133 !((get_endpoint(hostif, 0)->bmAttributes & in snd_usbmidi_switch_roland_altsetting()
2135 (get_endpoint(hostif, 1)->bmAttributes & in snd_usbmidi_switch_roland_altsetting()
2139 dev_dbg(&umidi->dev->dev, "switching to altsetting %d with int ep\n", in snd_usbmidi_switch_roland_altsetting()
2140 intfd->bAlternateSetting); in snd_usbmidi_switch_roland_altsetting()
2141 usb_set_interface(umidi->dev, intfd->bInterfaceNumber, in snd_usbmidi_switch_roland_altsetting()
2142 intfd->bAlternateSetting); in snd_usbmidi_switch_roland_altsetting()
2144 umidi->roland_load_ctl = snd_ctl_new1(&roland_load_ctl, umidi); in snd_usbmidi_switch_roland_altsetting()
2145 if (snd_ctl_add(umidi->card, umidi->roland_load_ctl) < 0) in snd_usbmidi_switch_roland_altsetting()
2146 umidi->roland_load_ctl = NULL; in snd_usbmidi_switch_roland_altsetting()
2150 * Try to find any usable endpoints in the interface.
2162 if (USB_ID_VENDOR(umidi->usb_id) == 0x0582) in snd_usbmidi_detect_endpoints()
2168 intf = umidi->iface; in snd_usbmidi_detect_endpoints()
2169 if (!intf || intf->num_altsetting < 1) in snd_usbmidi_detect_endpoints()
2170 return -ENOENT; in snd_usbmidi_detect_endpoints()
2171 hostif = intf->cur_altsetting; in snd_usbmidi_detect_endpoints()
2174 for (i = 0; i < intfd->bNumEndpoints; ++i) { in snd_usbmidi_detect_endpoints()
2183 endpoint[out_eps].out_interval = epd->bInterval; in snd_usbmidi_detect_endpoints()
2190 endpoint[in_eps].in_interval = epd->bInterval; in snd_usbmidi_detect_endpoints()
2194 return (out_eps || in_eps) ? 0 : -ENOENT; in snd_usbmidi_detect_endpoints()
2198 * Detects the endpoints for one-port-per-endpoint protocols.
2201 struct snd_usb_midi_endpoint_info *endpoints) in snd_usbmidi_detect_per_port_endpoints() argument
2205 err = snd_usbmidi_detect_endpoints(umidi, endpoints, MIDI_MAX_ENDPOINTS); in snd_usbmidi_detect_per_port_endpoints()
2207 if (endpoints[i].out_ep) in snd_usbmidi_detect_per_port_endpoints()
2208 endpoints[i].out_cables = 0x0001; in snd_usbmidi_detect_per_port_endpoints()
2209 if (endpoints[i].in_ep) in snd_usbmidi_detect_per_port_endpoints()
2210 endpoints[i].in_cables = 0x0001; in snd_usbmidi_detect_per_port_endpoints()
2216 * Detects the endpoints and ports of Yamaha devices.
2226 intf = umidi->iface; in snd_usbmidi_detect_yamaha()
2228 return -ENOENT; in snd_usbmidi_detect_yamaha()
2229 hostif = intf->altsetting; in snd_usbmidi_detect_yamaha()
2231 if (intfd->bNumEndpoints < 1) in snd_usbmidi_detect_yamaha()
2232 return -ENOENT; in snd_usbmidi_detect_yamaha()
2238 for (cs_desc = hostif->extra; in snd_usbmidi_detect_yamaha()
2239 cs_desc < hostif->extra + hostif->extralen && cs_desc[0] >= 2; in snd_usbmidi_detect_yamaha()
2243 endpoint->in_cables = in snd_usbmidi_detect_yamaha()
2244 (endpoint->in_cables << 1) | 1; in snd_usbmidi_detect_yamaha()
2246 endpoint->out_cables = in snd_usbmidi_detect_yamaha()
2247 (endpoint->out_cables << 1) | 1; in snd_usbmidi_detect_yamaha()
2250 if (!endpoint->in_cables && !endpoint->out_cables) in snd_usbmidi_detect_yamaha()
2251 return -ENOENT; in snd_usbmidi_detect_yamaha()
2257 * Detects the endpoints and ports of Roland devices.
2266 intf = umidi->iface; in snd_usbmidi_detect_roland()
2268 return -ENOENT; in snd_usbmidi_detect_roland()
2269 hostif = intf->altsetting; in snd_usbmidi_detect_roland()
2274 for (cs_desc = hostif->extra; in snd_usbmidi_detect_roland()
2275 cs_desc < hostif->extra + hostif->extralen && cs_desc[0] >= 2; in snd_usbmidi_detect_roland()
2283 endpoint->in_cables = (1 << cs_desc[4]) - 1; in snd_usbmidi_detect_roland()
2284 endpoint->out_cables = (1 << cs_desc[5]) - 1; in snd_usbmidi_detect_roland()
2293 return -ENODEV; in snd_usbmidi_detect_roland()
2297 * Creates the endpoints and their ports for Midiman devices.
2309 intf = umidi->iface; in snd_usbmidi_create_endpoints_midiman()
2311 return -ENOENT; in snd_usbmidi_create_endpoints_midiman()
2312 hostif = intf->altsetting; in snd_usbmidi_create_endpoints_midiman()
2316 * numbers, so we have to identify the endpoints by their index in in snd_usbmidi_create_endpoints_midiman()
2320 * bulk output endpoint for even-numbered ports, and one for odd- in snd_usbmidi_create_endpoints_midiman()
2321 * numbered ports. Both bulk output endpoints have corresponding in snd_usbmidi_create_endpoints_midiman()
2322 * input bulk endpoints (at indices 1 and 3) which aren't used. in snd_usbmidi_create_endpoints_midiman()
2324 if (intfd->bNumEndpoints < (endpoint->out_cables > 0x0001 ? 5 : 3)) { in snd_usbmidi_create_endpoints_midiman()
2325 dev_dbg(&umidi->dev->dev, "not enough endpoints\n"); in snd_usbmidi_create_endpoints_midiman()
2326 return -ENOENT; in snd_usbmidi_create_endpoints_midiman()
2331 dev_dbg(&umidi->dev->dev, "endpoint[0] isn't interrupt\n"); in snd_usbmidi_create_endpoints_midiman()
2332 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2336 dev_dbg(&umidi->dev->dev, "endpoint[2] isn't bulk output\n"); in snd_usbmidi_create_endpoints_midiman()
2337 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2339 if (endpoint->out_cables > 0x0001) { in snd_usbmidi_create_endpoints_midiman()
2343 dev_dbg(&umidi->dev->dev, in snd_usbmidi_create_endpoints_midiman()
2345 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2349 ep_info.out_ep = get_endpoint(hostif, 2)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2352 ep_info.out_cables = endpoint->out_cables & 0x5555; in snd_usbmidi_create_endpoints_midiman()
2354 &umidi->endpoints[0]); in snd_usbmidi_create_endpoints_midiman()
2358 ep_info.in_ep = get_endpoint(hostif, 0)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2360 ep_info.in_interval = get_endpoint(hostif, 0)->bInterval; in snd_usbmidi_create_endpoints_midiman()
2361 ep_info.in_cables = endpoint->in_cables; in snd_usbmidi_create_endpoints_midiman()
2363 &umidi->endpoints[0]); in snd_usbmidi_create_endpoints_midiman()
2367 if (endpoint->out_cables > 0x0001) { in snd_usbmidi_create_endpoints_midiman()
2368 ep_info.out_ep = get_endpoint(hostif, 4)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2370 ep_info.out_cables = endpoint->out_cables & 0xaaaa; in snd_usbmidi_create_endpoints_midiman()
2372 &umidi->endpoints[1]); in snd_usbmidi_create_endpoints_midiman()
2378 if (endpoint->out_cables & (1 << cable)) in snd_usbmidi_create_endpoints_midiman()
2382 -1 /* prevent trying to find jack */, in snd_usbmidi_create_endpoints_midiman()
2383 &umidi->endpoints[cable & 1].out->ports[cable].substream); in snd_usbmidi_create_endpoints_midiman()
2384 if (endpoint->in_cables & (1 << cable)) in snd_usbmidi_create_endpoints_midiman()
2388 -1 /* prevent trying to find jack */, in snd_usbmidi_create_endpoints_midiman()
2389 &umidi->endpoints[0].in->ports[cable].substream); in snd_usbmidi_create_endpoints_midiman()
2404 err = snd_rawmidi_new(umidi->card, "USB MIDI", in snd_usbmidi_create_rawmidi()
2405 umidi->next_midi_device++, in snd_usbmidi_create_rawmidi()
2409 strcpy(rmidi->name, umidi->card->shortname); in snd_usbmidi_create_rawmidi()
2410 rmidi->info_flags = SNDRV_RAWMIDI_INFO_OUTPUT | in snd_usbmidi_create_rawmidi()
2413 rmidi->ops = &snd_usbmidi_ops; in snd_usbmidi_create_rawmidi()
2414 rmidi->private_data = umidi; in snd_usbmidi_create_rawmidi()
2415 rmidi->private_free = snd_usbmidi_rawmidi_free; in snd_usbmidi_create_rawmidi()
2421 umidi->rmidi = rmidi; in snd_usbmidi_create_rawmidi()
2434 if (!umidi->input_running) in snd_usbmidi_input_stop()
2437 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_input_stop()
2438 if (ep->in) in snd_usbmidi_input_stop()
2440 usb_kill_urb(ep->in->urbs[j]); in snd_usbmidi_input_stop()
2442 umidi->input_running = 0; in snd_usbmidi_input_stop()
2455 struct urb *urb = ep->urbs[i]; in snd_usbmidi_input_start_ep()
2456 spin_lock_irqsave(&umidi->disc_lock, flags); in snd_usbmidi_input_start_ep()
2457 if (!atomic_read(&urb->use_count)) { in snd_usbmidi_input_start_ep()
2458 urb->dev = ep->umidi->dev; in snd_usbmidi_input_start_ep()
2461 spin_unlock_irqrestore(&umidi->disc_lock, flags); in snd_usbmidi_input_start_ep()
2474 if (umidi->input_running || !umidi->opened[1]) in snd_usbmidi_input_start()
2477 snd_usbmidi_input_start_ep(umidi, umidi->endpoints[i].in); in snd_usbmidi_input_start()
2478 umidi->input_running = 1; in snd_usbmidi_input_start()
2490 mutex_lock(&umidi->mutex); in snd_usbmidi_suspend()
2492 mutex_unlock(&umidi->mutex); in snd_usbmidi_suspend()
2504 mutex_lock(&umidi->mutex); in snd_usbmidi_resume()
2506 mutex_unlock(&umidi->mutex); in snd_usbmidi_resume()
2521 struct snd_usb_midi_endpoint_info endpoints[MIDI_MAX_ENDPOINTS]; in __snd_usbmidi_create() local
2527 return -ENOMEM; in __snd_usbmidi_create()
2528 umidi->dev = interface_to_usbdev(iface); in __snd_usbmidi_create()
2529 umidi->card = card; in __snd_usbmidi_create()
2530 umidi->iface = iface; in __snd_usbmidi_create()
2531 umidi->quirk = quirk; in __snd_usbmidi_create()
2532 umidi->usb_protocol_ops = &snd_usbmidi_standard_ops; in __snd_usbmidi_create()
2534 umidi->next_midi_device = *num_rawmidis; in __snd_usbmidi_create()
2535 spin_lock_init(&umidi->disc_lock); in __snd_usbmidi_create()
2536 init_rwsem(&umidi->disc_rwsem); in __snd_usbmidi_create()
2537 mutex_init(&umidi->mutex); in __snd_usbmidi_create()
2539 usb_id = USB_ID(le16_to_cpu(umidi->dev->descriptor.idVendor), in __snd_usbmidi_create()
2540 le16_to_cpu(umidi->dev->descriptor.idProduct)); in __snd_usbmidi_create()
2541 umidi->usb_id = usb_id; in __snd_usbmidi_create()
2542 timer_setup(&umidi->error_timer, snd_usbmidi_error_timer, 0); in __snd_usbmidi_create()
2545 memset(endpoints, 0, sizeof(endpoints)); in __snd_usbmidi_create()
2546 switch (quirk ? quirk->type : QUIRK_MIDI_STANDARD_INTERFACE) { in __snd_usbmidi_create()
2548 err = snd_usbmidi_get_ms_info(umidi, endpoints); in __snd_usbmidi_create()
2549 if (umidi->usb_id == USB_ID(0x0763, 0x0150)) /* M-Audio Uno */ in __snd_usbmidi_create()
2550 umidi->usb_protocol_ops = in __snd_usbmidi_create()
2554 umidi->usb_protocol_ops = &snd_usbmidi_122l_ops; in __snd_usbmidi_create()
2557 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2559 err = snd_usbmidi_detect_endpoints(umidi, &endpoints[0], 1); in __snd_usbmidi_create()
2562 err = snd_usbmidi_detect_yamaha(umidi, &endpoints[0]); in __snd_usbmidi_create()
2565 err = snd_usbmidi_detect_roland(umidi, &endpoints[0]); in __snd_usbmidi_create()
2568 umidi->usb_protocol_ops = &snd_usbmidi_midiman_ops; in __snd_usbmidi_create()
2569 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2574 umidi->usb_protocol_ops = &snd_usbmidi_novation_ops; in __snd_usbmidi_create()
2575 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); in __snd_usbmidi_create()
2578 umidi->usb_protocol_ops = &snd_usbmidi_raw_ops; in __snd_usbmidi_create()
2580 * Interface 1 contains isochronous endpoints, but with the same in __snd_usbmidi_create()
2584 * attempts to submit bulk/interrupt URBs to the endpoints in in __snd_usbmidi_create()
2588 if (umidi->usb_id == USB_ID(0x07fd, 0x0001)) /* MOTU Fastlane */ in __snd_usbmidi_create()
2589 usb_set_interface(umidi->dev, 0, 0); in __snd_usbmidi_create()
2590 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); in __snd_usbmidi_create()
2593 umidi->usb_protocol_ops = &snd_usbmidi_emagic_ops; in __snd_usbmidi_create()
2594 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2596 err = snd_usbmidi_detect_endpoints(umidi, &endpoints[0], 1); in __snd_usbmidi_create()
2599 umidi->usb_protocol_ops = &snd_usbmidi_cme_ops; in __snd_usbmidi_create()
2600 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); in __snd_usbmidi_create()
2603 umidi->usb_protocol_ops = &snd_usbmidi_akai_ops; in __snd_usbmidi_create()
2604 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); in __snd_usbmidi_create()
2605 /* endpoint 1 is input-only */ in __snd_usbmidi_create()
2606 endpoints[1].out_cables = 0; in __snd_usbmidi_create()
2609 umidi->usb_protocol_ops = &snd_usbmidi_ftdi_ops; in __snd_usbmidi_create()
2612 err = usb_control_msg(umidi->dev, usb_sndctrlpipe(umidi->dev, 0), in __snd_usbmidi_create()
2617 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); in __snd_usbmidi_create()
2620 umidi->usb_protocol_ops = &snd_usbmidi_ch345_broken_sysex_ops; in __snd_usbmidi_create()
2621 err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints); in __snd_usbmidi_create()
2624 dev_err(&umidi->dev->dev, "invalid quirk type %d\n", in __snd_usbmidi_create()
2625 quirk->type); in __snd_usbmidi_create()
2626 err = -ENXIO; in __snd_usbmidi_create()
2636 out_ports += hweight16(endpoints[i].out_cables); in __snd_usbmidi_create()
2637 in_ports += hweight16(endpoints[i].in_cables); in __snd_usbmidi_create()
2644 if (quirk && quirk->type == QUIRK_MIDI_MIDIMAN) in __snd_usbmidi_create()
2645 err = snd_usbmidi_create_endpoints_midiman(umidi, &endpoints[0]); in __snd_usbmidi_create()
2647 err = snd_usbmidi_create_endpoints(umidi, endpoints); in __snd_usbmidi_create()
2651 usb_autopm_get_interface_no_resume(umidi->iface); in __snd_usbmidi_create()
2653 list_add_tail(&umidi->list, midi_list); in __snd_usbmidi_create()
2655 *num_rawmidis = umidi->next_midi_device; in __snd_usbmidi_create()