Lines Matching +full:odd +full:- +full:numbered

2  * usbmidi.c - ALSA USB MIDI driver
4 * Copyright (c) 2002-2009 Clemens Ladisch
7 * Based on the OSS usb-midi driver by NAGANO Daisuke,
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()
501 &buffer[1], buffer_length - 1); in snd_usbmidi_cme_input()
513 (uint8_t *)urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_output_standard_packet()
518 urb->transfer_buffer_length += 4; in snd_usbmidi_output_standard_packet()
530 (uint8_t *)urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_output_midiman_packet()
535 urb->transfer_buffer_length += 4; in snd_usbmidi_output_midiman_packet()
544 uint8_t p0 = port->cable; in snd_usbmidi_transmit_byte()
546 port->ep->umidi->usb_protocol_ops->output_packet; in snd_usbmidi_transmit_byte()
553 port->data[0] = b; in snd_usbmidi_transmit_byte()
554 port->state = STATE_SYSEX_1; in snd_usbmidi_transmit_byte()
558 port->data[0] = b; in snd_usbmidi_transmit_byte()
559 port->state = STATE_1PARAM; in snd_usbmidi_transmit_byte()
562 port->data[0] = b; in snd_usbmidi_transmit_byte()
563 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
567 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
571 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
574 switch (port->state) { in snd_usbmidi_transmit_byte()
579 output_packet(urb, p0 | 0x06, port->data[0], in snd_usbmidi_transmit_byte()
583 output_packet(urb, p0 | 0x07, port->data[0], in snd_usbmidi_transmit_byte()
584 port->data[1], 0xf7); in snd_usbmidi_transmit_byte()
587 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
591 port->data[0] = b; in snd_usbmidi_transmit_byte()
593 port->state = STATE_1PARAM; in snd_usbmidi_transmit_byte()
595 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
597 switch (port->state) { in snd_usbmidi_transmit_byte()
599 if (port->data[0] < 0xf0) { in snd_usbmidi_transmit_byte()
600 p0 |= port->data[0] >> 4; in snd_usbmidi_transmit_byte()
603 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
605 output_packet(urb, p0, port->data[0], b, 0); in snd_usbmidi_transmit_byte()
608 port->data[1] = b; in snd_usbmidi_transmit_byte()
609 port->state = STATE_2PARAM_2; in snd_usbmidi_transmit_byte()
612 if (port->data[0] < 0xf0) { in snd_usbmidi_transmit_byte()
613 p0 |= port->data[0] >> 4; in snd_usbmidi_transmit_byte()
614 port->state = STATE_2PARAM_1; in snd_usbmidi_transmit_byte()
617 port->state = STATE_UNKNOWN; in snd_usbmidi_transmit_byte()
619 output_packet(urb, p0, port->data[0], port->data[1], b); in snd_usbmidi_transmit_byte()
622 port->data[0] = b; in snd_usbmidi_transmit_byte()
623 port->state = STATE_SYSEX_1; in snd_usbmidi_transmit_byte()
626 port->data[1] = b; in snd_usbmidi_transmit_byte()
627 port->state = STATE_SYSEX_2; in snd_usbmidi_transmit_byte()
630 output_packet(urb, p0 | 0x04, port->data[0], in snd_usbmidi_transmit_byte()
631 port->data[1], b); in snd_usbmidi_transmit_byte()
632 port->state = STATE_SYSEX_0; in snd_usbmidi_transmit_byte()
643 /* FIXME: lower-numbered ports can starve higher-numbered ports */ in snd_usbmidi_standard_output()
645 struct usbmidi_out_port *port = &ep->ports[p]; in snd_usbmidi_standard_output()
646 if (!port->active) in snd_usbmidi_standard_output()
648 while (urb->transfer_buffer_length + 3 < ep->max_transfer) { in snd_usbmidi_standard_output()
650 if (snd_rawmidi_transmit(port->substream, &b, 1) != 1) { in snd_usbmidi_standard_output()
651 port->active = 0; in snd_usbmidi_standard_output()
711 unsigned int port = (buffer[pos] >> 4) - 1; in snd_usbmidi_akai_input()
728 struct snd_rawmidi_substream *substream = ep->ports[0].substream; in snd_usbmidi_akai_output()
730 if (!ep->ports[0].active) in snd_usbmidi_akai_output()
733 msg = urb->transfer_buffer + urb->transfer_buffer_length; in snd_usbmidi_akai_output()
734 buf_end = ep->max_transfer - MAX_AKAI_SYSEX_LEN - 1; in snd_usbmidi_akai_output()
737 while (urb->transfer_buffer_length < buf_end) { in snd_usbmidi_akai_output()
741 ep->ports[0].active = 0; in snd_usbmidi_akai_output()
744 /* try to skip non-SysEx data */ in snd_usbmidi_akai_output()
759 /* it's incomplete - drop it */ in snd_usbmidi_akai_output()
770 urb->transfer_buffer_length += count + 1; in snd_usbmidi_akai_output()
774 /* less than 9 bytes and no end byte - wait for more */ in snd_usbmidi_akai_output()
776 ep->ports[0].active = 0; in snd_usbmidi_akai_output()
779 /* 9 bytes and no end marker in sight - malformed, skip it */ in snd_usbmidi_akai_output()
800 snd_usbmidi_input_data(ep, 0, &buffer[2], buffer[0] - 1); in snd_usbmidi_novation_input()
809 if (!ep->ports[0].active) in snd_usbmidi_novation_output()
811 transfer_buffer = urb->transfer_buffer; in snd_usbmidi_novation_output()
812 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_novation_output()
814 ep->max_transfer - 2); in snd_usbmidi_novation_output()
816 ep->ports[0].active = 0; in snd_usbmidi_novation_output()
821 urb->transfer_buffer_length = 2 + count; in snd_usbmidi_novation_output()
844 if (!ep->ports[0].active) in snd_usbmidi_raw_output()
846 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_raw_output()
847 urb->transfer_buffer, in snd_usbmidi_raw_output()
848 ep->max_transfer); in snd_usbmidi_raw_output()
850 ep->ports[0].active = 0; in snd_usbmidi_raw_output()
853 urb->transfer_buffer_length = count; in snd_usbmidi_raw_output()
869 snd_usbmidi_input_data(ep, 0, buffer + 2, buffer_length - 2); in snd_usbmidi_ftdi_input()
883 while (buffer_length && buffer[buffer_length - 1] == 0xFD) in snd_usbmidi_us122l_input()
884 buffer_length--; in snd_usbmidi_us122l_input()
894 if (!ep->ports[0].active) in snd_usbmidi_us122l_output()
896 switch (snd_usb_get_speed(ep->umidi->dev)) { in snd_usbmidi_us122l_output()
905 count = snd_rawmidi_transmit(ep->ports[0].substream, in snd_usbmidi_us122l_output()
906 urb->transfer_buffer, in snd_usbmidi_us122l_output()
909 ep->ports[0].active = 0; in snd_usbmidi_us122l_output()
913 memset(urb->transfer_buffer + count, 0xFD, ep->max_transfer - count); in snd_usbmidi_us122l_output()
914 urb->transfer_buffer_length = ep->max_transfer; in snd_usbmidi_us122l_output()
972 if (ep->seen_f5) in snd_usbmidi_emagic_input()
980 snd_usbmidi_input_data(ep, ep->current_port, buffer, i); in snd_usbmidi_emagic_input()
982 buffer_length -= i; in snd_usbmidi_emagic_input()
987 ep->seen_f5 = 1; in snd_usbmidi_emagic_input()
989 --buffer_length; in snd_usbmidi_emagic_input()
995 ep->current_port = (buffer[0] - 1) & 15; in snd_usbmidi_emagic_input()
997 --buffer_length; in snd_usbmidi_emagic_input()
999 ep->seen_f5 = 0; in snd_usbmidi_emagic_input()
1006 int port0 = ep->current_port; in snd_usbmidi_emagic_output()
1007 uint8_t *buf = urb->transfer_buffer; in snd_usbmidi_emagic_output()
1008 int buf_free = ep->max_transfer; in snd_usbmidi_emagic_output()
1012 /* round-robin, starting at the last current port */ in snd_usbmidi_emagic_output()
1014 struct usbmidi_out_port *port = &ep->ports[portnum]; in snd_usbmidi_emagic_output()
1016 if (!port->active) in snd_usbmidi_emagic_output()
1018 if (snd_rawmidi_transmit_peek(port->substream, buf, 1) != 1) { in snd_usbmidi_emagic_output()
1019 port->active = 0; in snd_usbmidi_emagic_output()
1023 if (portnum != ep->current_port) { in snd_usbmidi_emagic_output()
1026 ep->current_port = portnum; in snd_usbmidi_emagic_output()
1030 buf_free -= 2; in snd_usbmidi_emagic_output()
1035 length = snd_rawmidi_transmit(port->substream, buf, buf_free); in snd_usbmidi_emagic_output()
1038 buf_free -= length; in snd_usbmidi_emagic_output()
1043 if (buf_free < ep->max_transfer && buf_free > 0) { in snd_usbmidi_emagic_output()
1045 --buf_free; in snd_usbmidi_emagic_output()
1047 urb->transfer_buffer_length = ep->max_transfer - buf_free; in snd_usbmidi_emagic_output()
1065 intf = umidi->iface; in update_roland_altsetting()
1066 is_light_load = intf->cur_altsetting != intf->altsetting; in update_roland_altsetting()
1067 if (umidi->roland_load_ctl->private_value == is_light_load) in update_roland_altsetting()
1069 hostif = &intf->altsetting[umidi->roland_load_ctl->private_value]; in update_roland_altsetting()
1071 snd_usbmidi_input_stop(&umidi->list); in update_roland_altsetting()
1072 usb_set_interface(umidi->dev, intfd->bInterfaceNumber, in update_roland_altsetting()
1073 intfd->bAlternateSetting); in update_roland_altsetting()
1074 snd_usbmidi_input_start(&umidi->list); in update_roland_altsetting()
1080 struct snd_usb_midi *umidi = substream->rmidi->private_data; in substream_open()
1083 down_read(&umidi->disc_rwsem); in substream_open()
1084 if (umidi->disconnected) { in substream_open()
1085 up_read(&umidi->disc_rwsem); in substream_open()
1086 return open ? -ENODEV : 0; in substream_open()
1089 mutex_lock(&umidi->mutex); in substream_open()
1091 if (!umidi->opened[0] && !umidi->opened[1]) { in substream_open()
1092 if (umidi->roland_load_ctl) { in substream_open()
1093 ctl = umidi->roland_load_ctl; in substream_open()
1094 ctl->vd[0].access |= in substream_open()
1096 snd_ctl_notify(umidi->card, in substream_open()
1097 SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); in substream_open()
1101 umidi->opened[dir]++; in substream_open()
1102 if (umidi->opened[1]) in substream_open()
1103 snd_usbmidi_input_start(&umidi->list); in substream_open()
1105 umidi->opened[dir]--; in substream_open()
1106 if (!umidi->opened[1]) in substream_open()
1107 snd_usbmidi_input_stop(&umidi->list); in substream_open()
1108 if (!umidi->opened[0] && !umidi->opened[1]) { in substream_open()
1109 if (umidi->roland_load_ctl) { in substream_open()
1110 ctl = umidi->roland_load_ctl; in substream_open()
1111 ctl->vd[0].access &= in substream_open()
1113 snd_ctl_notify(umidi->card, in substream_open()
1114 SNDRV_CTL_EVENT_MASK_INFO, &ctl->id); in substream_open()
1118 mutex_unlock(&umidi->mutex); in substream_open()
1119 up_read(&umidi->disc_rwsem); in substream_open()
1125 struct snd_usb_midi *umidi = substream->rmidi->private_data; in snd_usbmidi_output_open()
1130 if (umidi->endpoints[i].out) in snd_usbmidi_output_open()
1132 if (umidi->endpoints[i].out->ports[j].substream == substream) { in snd_usbmidi_output_open()
1133 port = &umidi->endpoints[i].out->ports[j]; in snd_usbmidi_output_open()
1137 return -ENXIO; in snd_usbmidi_output_open()
1139 substream->runtime->private_data = port; in snd_usbmidi_output_open()
1140 port->state = STATE_UNKNOWN; in snd_usbmidi_output_open()
1146 struct usbmidi_out_port *port = substream->runtime->private_data; in snd_usbmidi_output_close()
1148 flush_work(&port->ep->work); in snd_usbmidi_output_close()
1156 (struct usbmidi_out_port *)substream->runtime->private_data; in snd_usbmidi_output_trigger()
1158 port->active = up; in snd_usbmidi_output_trigger()
1160 if (port->ep->umidi->disconnected) { in snd_usbmidi_output_trigger()
1166 queue_work(system_highpri_wq, &port->ep->work); in snd_usbmidi_output_trigger()
1172 struct usbmidi_out_port *port = substream->runtime->private_data; in snd_usbmidi_output_drain()
1173 struct snd_usb_midi_out_endpoint *ep = port->ep; in snd_usbmidi_output_drain()
1178 if (ep->umidi->disconnected) in snd_usbmidi_output_drain()
1184 spin_lock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1185 drain_urbs = ep->active_urbs; in snd_usbmidi_output_drain()
1187 ep->drain_urbs |= drain_urbs; in snd_usbmidi_output_drain()
1189 prepare_to_wait(&ep->drain_wait, &wait, in snd_usbmidi_output_drain()
1191 spin_unlock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1193 spin_lock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1194 drain_urbs &= ep->drain_urbs; in snd_usbmidi_output_drain()
1196 finish_wait(&ep->drain_wait, &wait); in snd_usbmidi_output_drain()
1198 port->active = 0; in snd_usbmidi_output_drain()
1199 spin_unlock_irq(&ep->buffer_lock); in snd_usbmidi_output_drain()
1215 struct snd_usb_midi *umidi = substream->rmidi->private_data; in snd_usbmidi_input_trigger()
1218 set_bit(substream->number, &umidi->input_triggered); in snd_usbmidi_input_trigger()
1220 clear_bit(substream->number, &umidi->input_triggered); in snd_usbmidi_input_trigger()
1239 usb_free_coherent(umidi->dev, buffer_length, in free_urb_and_buffer()
1240 urb->transfer_buffer, urb->transfer_dma); in free_urb_and_buffer()
1253 if (ep->urbs[i]) in snd_usbmidi_in_endpoint_delete()
1254 free_urb_and_buffer(ep->umidi, ep->urbs[i], in snd_usbmidi_in_endpoint_delete()
1255 ep->urbs[i]->transfer_buffer_length); in snd_usbmidi_in_endpoint_delete()
1273 rep->in = NULL; in snd_usbmidi_in_endpoint_create()
1276 return -ENOMEM; in snd_usbmidi_in_endpoint_create()
1277 ep->umidi = umidi; in snd_usbmidi_in_endpoint_create()
1280 ep->urbs[i] = usb_alloc_urb(0, GFP_KERNEL); in snd_usbmidi_in_endpoint_create()
1281 if (!ep->urbs[i]) { in snd_usbmidi_in_endpoint_create()
1282 err = -ENOMEM; in snd_usbmidi_in_endpoint_create()
1286 if (ep_info->in_interval) in snd_usbmidi_in_endpoint_create()
1287 pipe = usb_rcvintpipe(umidi->dev, ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1289 pipe = usb_rcvbulkpipe(umidi->dev, ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1290 length = usb_maxpacket(umidi->dev, pipe); in snd_usbmidi_in_endpoint_create()
1292 buffer = usb_alloc_coherent(umidi->dev, length, GFP_KERNEL, in snd_usbmidi_in_endpoint_create()
1293 &ep->urbs[i]->transfer_dma); in snd_usbmidi_in_endpoint_create()
1295 err = -ENOMEM; in snd_usbmidi_in_endpoint_create()
1298 if (ep_info->in_interval) in snd_usbmidi_in_endpoint_create()
1299 usb_fill_int_urb(ep->urbs[i], umidi->dev, in snd_usbmidi_in_endpoint_create()
1302 ep, ep_info->in_interval); in snd_usbmidi_in_endpoint_create()
1304 usb_fill_bulk_urb(ep->urbs[i], umidi->dev, in snd_usbmidi_in_endpoint_create()
1307 ep->urbs[i]->transfer_flags = URB_NO_TRANSFER_DMA_MAP; in snd_usbmidi_in_endpoint_create()
1308 err = usb_urb_ep_type_check(ep->urbs[i]); in snd_usbmidi_in_endpoint_create()
1310 dev_err(&umidi->dev->dev, "invalid MIDI in EP %x\n", in snd_usbmidi_in_endpoint_create()
1311 ep_info->in_ep); in snd_usbmidi_in_endpoint_create()
1316 rep->in = ep; in snd_usbmidi_in_endpoint_create()
1333 if (ep->urbs[i].urb) { in snd_usbmidi_out_endpoint_clear()
1334 free_urb_and_buffer(ep->umidi, ep->urbs[i].urb, in snd_usbmidi_out_endpoint_clear()
1335 ep->max_transfer); in snd_usbmidi_out_endpoint_clear()
1336 ep->urbs[i].urb = NULL; in snd_usbmidi_out_endpoint_clear()
1359 rep->out = NULL; in snd_usbmidi_out_endpoint_create()
1362 return -ENOMEM; in snd_usbmidi_out_endpoint_create()
1363 ep->umidi = umidi; in snd_usbmidi_out_endpoint_create()
1366 ep->urbs[i].urb = usb_alloc_urb(0, GFP_KERNEL); in snd_usbmidi_out_endpoint_create()
1367 if (!ep->urbs[i].urb) { in snd_usbmidi_out_endpoint_create()
1368 err = -ENOMEM; in snd_usbmidi_out_endpoint_create()
1371 ep->urbs[i].ep = ep; in snd_usbmidi_out_endpoint_create()
1373 if (ep_info->out_interval) in snd_usbmidi_out_endpoint_create()
1374 pipe = usb_sndintpipe(umidi->dev, ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1376 pipe = usb_sndbulkpipe(umidi->dev, ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1377 switch (umidi->usb_id) { in snd_usbmidi_out_endpoint_create()
1379 ep->max_transfer = usb_maxpacket(umidi->dev, pipe); in snd_usbmidi_out_endpoint_create()
1390 case USB_ID(0x1a86, 0x752d): /* QinHeng CH345 "USB2.0-MIDI" */ in snd_usbmidi_out_endpoint_create()
1392 ep->max_transfer = 4; in snd_usbmidi_out_endpoint_create()
1397 case USB_ID(0x0644, 0x800e): /* Tascam US-122L */ in snd_usbmidi_out_endpoint_create()
1398 case USB_ID(0x0644, 0x800f): /* Tascam US-144 */ in snd_usbmidi_out_endpoint_create()
1399 ep->max_transfer = 9; in snd_usbmidi_out_endpoint_create()
1403 buffer = usb_alloc_coherent(umidi->dev, in snd_usbmidi_out_endpoint_create()
1404 ep->max_transfer, GFP_KERNEL, in snd_usbmidi_out_endpoint_create()
1405 &ep->urbs[i].urb->transfer_dma); in snd_usbmidi_out_endpoint_create()
1407 err = -ENOMEM; in snd_usbmidi_out_endpoint_create()
1410 if (ep_info->out_interval) in snd_usbmidi_out_endpoint_create()
1411 usb_fill_int_urb(ep->urbs[i].urb, umidi->dev, in snd_usbmidi_out_endpoint_create()
1412 pipe, buffer, ep->max_transfer, in snd_usbmidi_out_endpoint_create()
1414 &ep->urbs[i], ep_info->out_interval); in snd_usbmidi_out_endpoint_create()
1416 usb_fill_bulk_urb(ep->urbs[i].urb, umidi->dev, in snd_usbmidi_out_endpoint_create()
1417 pipe, buffer, ep->max_transfer, in snd_usbmidi_out_endpoint_create()
1419 &ep->urbs[i]); in snd_usbmidi_out_endpoint_create()
1420 err = usb_urb_ep_type_check(ep->urbs[i].urb); in snd_usbmidi_out_endpoint_create()
1422 dev_err(&umidi->dev->dev, "invalid MIDI out EP %x\n", in snd_usbmidi_out_endpoint_create()
1423 ep_info->out_ep); in snd_usbmidi_out_endpoint_create()
1426 ep->urbs[i].urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP; in snd_usbmidi_out_endpoint_create()
1429 spin_lock_init(&ep->buffer_lock); in snd_usbmidi_out_endpoint_create()
1430 INIT_WORK(&ep->work, snd_usbmidi_out_work); in snd_usbmidi_out_endpoint_create()
1431 init_waitqueue_head(&ep->drain_wait); in snd_usbmidi_out_endpoint_create()
1434 if (ep_info->out_cables & (1 << i)) { in snd_usbmidi_out_endpoint_create()
1435 ep->ports[i].ep = ep; in snd_usbmidi_out_endpoint_create()
1436 ep->ports[i].cable = i << 4; in snd_usbmidi_out_endpoint_create()
1439 if (umidi->usb_protocol_ops->init_out_endpoint) in snd_usbmidi_out_endpoint_create()
1440 umidi->usb_protocol_ops->init_out_endpoint(ep); in snd_usbmidi_out_endpoint_create()
1442 rep->out = ep; in snd_usbmidi_out_endpoint_create()
1458 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_free()
1459 if (ep->out) in snd_usbmidi_free()
1460 snd_usbmidi_out_endpoint_delete(ep->out); in snd_usbmidi_free()
1461 if (ep->in) in snd_usbmidi_free()
1462 snd_usbmidi_in_endpoint_delete(ep->in); in snd_usbmidi_free()
1464 mutex_destroy(&umidi->mutex); in snd_usbmidi_free()
1482 down_write(&umidi->disc_rwsem); in snd_usbmidi_disconnect()
1483 spin_lock_irq(&umidi->disc_lock); in snd_usbmidi_disconnect()
1484 umidi->disconnected = 1; in snd_usbmidi_disconnect()
1485 spin_unlock_irq(&umidi->disc_lock); in snd_usbmidi_disconnect()
1486 up_write(&umidi->disc_rwsem); in snd_usbmidi_disconnect()
1488 del_timer_sync(&umidi->error_timer); in snd_usbmidi_disconnect()
1491 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_disconnect()
1492 if (ep->out) in snd_usbmidi_disconnect()
1493 cancel_work_sync(&ep->out->work); in snd_usbmidi_disconnect()
1494 if (ep->out) { in snd_usbmidi_disconnect()
1496 usb_kill_urb(ep->out->urbs[j].urb); in snd_usbmidi_disconnect()
1497 if (umidi->usb_protocol_ops->finish_out_endpoint) in snd_usbmidi_disconnect()
1498 umidi->usb_protocol_ops->finish_out_endpoint(ep->out); in snd_usbmidi_disconnect()
1499 ep->out->active_urbs = 0; in snd_usbmidi_disconnect()
1500 if (ep->out->drain_urbs) { in snd_usbmidi_disconnect()
1501 ep->out->drain_urbs = 0; in snd_usbmidi_disconnect()
1502 wake_up(&ep->out->drain_wait); in snd_usbmidi_disconnect()
1505 if (ep->in) in snd_usbmidi_disconnect()
1507 usb_kill_urb(ep->in->urbs[j]); in snd_usbmidi_disconnect()
1509 if (ep->out) in snd_usbmidi_disconnect()
1510 snd_usbmidi_out_endpoint_clear(ep->out); in snd_usbmidi_disconnect()
1511 if (ep->in) { in snd_usbmidi_disconnect()
1512 snd_usbmidi_in_endpoint_delete(ep->in); in snd_usbmidi_disconnect()
1513 ep->in = NULL; in snd_usbmidi_disconnect()
1521 struct snd_usb_midi *umidi = rmidi->private_data; in snd_usbmidi_rawmidi_free()
1531 list_for_each_entry(substream, &umidi->rmidi->streams[stream].substreams, in snd_usbmidi_find_substream()
1533 if (substream->number == number) in snd_usbmidi_find_substream()
1594 /* Roland UA-100 */
1596 /* Roland SC-8850 */
1603 /* Roland U-8 */
1606 /* Roland SC-8820 */
1610 /* Roland SK-500 */
1614 /* Roland SC-D70 */
1618 /* Edirol UM-880 */
1620 /* Edirol SD-90 */
1625 /* Edirol UM-550 */
1627 /* Edirol SD-20 */
1631 /* Edirol SD-80 */
1636 /* Edirol UA-700 */
1647 /* BOSS GS-10 */
1650 /* Edirol UA-1000 */
1653 /* Edirol UR-80 */
1657 /* Edirol PCR-A */
1661 /* BOSS GT-PRO */
1663 /* Edirol UM-3EX */
1665 /* Roland VG-99 */
1668 /* Cakewalk Sonar V-Studio 100 */
1671 /* Roland VB-99 */
1674 /* Roland A-PRO */
1678 /* Roland SD-50 */
1682 /* Roland OCTA-CAPTURE */
1687 /* Roland SPD-SX */
1690 /* Roland A-Series */
1693 /* Roland INTEGRA-7 */
1696 /* M-Audio MidiSport 8x8 */
1724 if (snd_usbmidi_port_info[i].id == umidi->usb_id && in find_port_info()
1734 struct snd_usb_midi *umidi = rmidi->private_data; in snd_usbmidi_get_port_info()
1740 seq_port_info->type = port_info->seq_flags; in snd_usbmidi_get_port_info()
1741 seq_port_info->midi_voices = port_info->voices; in snd_usbmidi_get_port_info()
1748 unsigned char *extra = hostif->extra; in find_usb_ijack()
1749 int extralen = hostif->extralen; in find_usb_ijack()
1757 if (h->bDescriptorType != USB_DT_CS_INTERFACE) in find_usb_ijack()
1761 if (h->bLength >= sizeof(*outjd) && in find_usb_ijack()
1762 outjd->bDescriptorSubtype == UAC_MIDI_OUT_JACK && in find_usb_ijack()
1763 outjd->bJackID == jack_id) { in find_usb_ijack()
1764 sz = USB_DT_MIDI_OUT_SIZE(outjd->bNrInputPins); in find_usb_ijack()
1765 if (outjd->bLength < sz) in find_usb_ijack()
1767 return *(extra + sz - 1); in find_usb_ijack()
1771 if (injd->bLength >= sizeof(*injd) && in find_usb_ijack()
1772 injd->bDescriptorSubtype == UAC_MIDI_IN_JACK && in find_usb_ijack()
1773 injd->bJackID == jack_id) in find_usb_ijack()
1774 return injd->iJack; in find_usb_ijack()
1779 extralen -= extra[0]; in find_usb_ijack()
1802 dev_err(&umidi->dev->dev, "substream %d:%d not found\n", stream, in snd_usbmidi_init_substream()
1807 intf = umidi->iface; in snd_usbmidi_init_substream()
1809 hostif = intf->cur_altsetting; in snd_usbmidi_init_substream()
1812 res = usb_string(umidi->dev, iJack, jack_name_buf, in snd_usbmidi_init_substream()
1820 name_format = port_info ? port_info->name : in snd_usbmidi_init_substream()
1822 snprintf(substream->name, sizeof(substream->name), in snd_usbmidi_init_substream()
1823 name_format, umidi->card->shortname, jack_name, number + 1); in snd_usbmidi_init_substream()
1841 &umidi->endpoints[i]); in snd_usbmidi_create_endpoints()
1848 &umidi->endpoints[i]); in snd_usbmidi_create_endpoints()
1859 &umidi->endpoints[i].out->ports[j].substream); in snd_usbmidi_create_endpoints()
1867 &umidi->endpoints[i].in->ports[j].substream); in snd_usbmidi_create_endpoints()
1872 dev_dbg(&umidi->dev->dev, "created %d output and %d input ports\n", in snd_usbmidi_create_endpoints()
1880 unsigned char *extra = hostep->extra; in find_usb_ms_endpoint_descriptor()
1881 int extralen = hostep->extralen; in find_usb_ms_endpoint_descriptor()
1887 if (ms_ep->bLength > 3 && in find_usb_ms_endpoint_descriptor()
1888 ms_ep->bDescriptorType == USB_DT_CS_ENDPOINT && in find_usb_ms_endpoint_descriptor()
1889 ms_ep->bDescriptorSubtype == UAC_MS_GENERAL) in find_usb_ms_endpoint_descriptor()
1893 extralen -= extra[0]; in find_usb_ms_endpoint_descriptor()
1914 intf = umidi->iface; in snd_usbmidi_get_ms_info()
1916 return -ENXIO; in snd_usbmidi_get_ms_info()
1917 hostif = &intf->altsetting[0]; in snd_usbmidi_get_ms_info()
1919 ms_header = (struct usb_ms_header_descriptor *)hostif->extra; in snd_usbmidi_get_ms_info()
1920 if (hostif->extralen >= 7 && in snd_usbmidi_get_ms_info()
1921 ms_header->bLength >= 7 && in snd_usbmidi_get_ms_info()
1922 ms_header->bDescriptorType == USB_DT_CS_INTERFACE && in snd_usbmidi_get_ms_info()
1923 ms_header->bDescriptorSubtype == UAC_HEADER) in snd_usbmidi_get_ms_info()
1924 dev_dbg(&umidi->dev->dev, "MIDIStreaming version %02x.%02x\n", in snd_usbmidi_get_ms_info()
1925 ((uint8_t *)&ms_header->bcdMSC)[1], ((uint8_t *)&ms_header->bcdMSC)[0]); in snd_usbmidi_get_ms_info()
1927 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
1931 for (i = 0; i < intfd->bNumEndpoints; ++i) { in snd_usbmidi_get_ms_info()
1932 hostep = &hostif->endpoint[i]; in snd_usbmidi_get_ms_info()
1939 if (ms_ep->bLength <= sizeof(*ms_ep)) in snd_usbmidi_get_ms_info()
1941 if (ms_ep->bNumEmbMIDIJack > 0x10) in snd_usbmidi_get_ms_info()
1943 if (ms_ep->bLength < sizeof(*ms_ep) + ms_ep->bNumEmbMIDIJack) in snd_usbmidi_get_ms_info()
1948 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
1955 endpoints[epidx].out_interval = ep->bInterval; in snd_usbmidi_get_ms_info()
1956 else if (snd_usb_get_speed(umidi->dev) == USB_SPEED_LOW) in snd_usbmidi_get_ms_info()
1964 (1 << ms_ep->bNumEmbMIDIJack) - 1; in snd_usbmidi_get_ms_info()
1965 for (j = 0; j < ms_ep->bNumEmbMIDIJack; ++j) in snd_usbmidi_get_ms_info()
1966 endpoints[epidx].assoc_out_jacks[j] = ms_ep->baAssocJackID[j]; in snd_usbmidi_get_ms_info()
1968 endpoints[epidx].assoc_out_jacks[j] = -1; in snd_usbmidi_get_ms_info()
1969 dev_dbg(&umidi->dev->dev, "EP %02X: %d jack(s)\n", in snd_usbmidi_get_ms_info()
1970 ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); in snd_usbmidi_get_ms_info()
1974 dev_warn(&umidi->dev->dev, in snd_usbmidi_get_ms_info()
1981 endpoints[epidx].in_interval = ep->bInterval; in snd_usbmidi_get_ms_info()
1982 else if (snd_usb_get_speed(umidi->dev) == USB_SPEED_LOW) in snd_usbmidi_get_ms_info()
1985 (1 << ms_ep->bNumEmbMIDIJack) - 1; in snd_usbmidi_get_ms_info()
1986 for (j = 0; j < ms_ep->bNumEmbMIDIJack; ++j) in snd_usbmidi_get_ms_info()
1987 endpoints[epidx].assoc_in_jacks[j] = ms_ep->baAssocJackID[j]; in snd_usbmidi_get_ms_info()
1989 endpoints[epidx].assoc_in_jacks[j] = -1; in snd_usbmidi_get_ms_info()
1990 dev_dbg(&umidi->dev->dev, "EP %02X: %d jack(s)\n", in snd_usbmidi_get_ms_info()
1991 ep->bEndpointAddress, ms_ep->bNumEmbMIDIJack); in snd_usbmidi_get_ms_info()
2008 value->value.enumerated.item[0] = kcontrol->private_value; in roland_load_get()
2015 struct snd_usb_midi *umidi = kcontrol->private_data; in roland_load_put()
2018 if (value->value.enumerated.item[0] > 1) in roland_load_put()
2019 return -EINVAL; in roland_load_put()
2020 mutex_lock(&umidi->mutex); in roland_load_put()
2021 changed = value->value.enumerated.item[0] != kcontrol->private_value; in roland_load_put()
2023 kcontrol->private_value = value->value.enumerated.item[0]; in roland_load_put()
2024 mutex_unlock(&umidi->mutex); in roland_load_put()
2047 intf = umidi->iface; in snd_usbmidi_switch_roland_altsetting()
2048 if (!intf || intf->num_altsetting != 2) in snd_usbmidi_switch_roland_altsetting()
2051 hostif = &intf->altsetting[1]; in snd_usbmidi_switch_roland_altsetting()
2056 if (intfd->bNumEndpoints != 2 || in snd_usbmidi_switch_roland_altsetting()
2057 !((get_endpoint(hostif, 0)->bmAttributes & in snd_usbmidi_switch_roland_altsetting()
2059 (get_endpoint(hostif, 1)->bmAttributes & in snd_usbmidi_switch_roland_altsetting()
2063 dev_dbg(&umidi->dev->dev, "switching to altsetting %d with int ep\n", in snd_usbmidi_switch_roland_altsetting()
2064 intfd->bAlternateSetting); in snd_usbmidi_switch_roland_altsetting()
2065 usb_set_interface(umidi->dev, intfd->bInterfaceNumber, in snd_usbmidi_switch_roland_altsetting()
2066 intfd->bAlternateSetting); in snd_usbmidi_switch_roland_altsetting()
2068 umidi->roland_load_ctl = snd_ctl_new1(&roland_load_ctl, umidi); in snd_usbmidi_switch_roland_altsetting()
2069 if (snd_ctl_add(umidi->card, umidi->roland_load_ctl) < 0) in snd_usbmidi_switch_roland_altsetting()
2070 umidi->roland_load_ctl = NULL; in snd_usbmidi_switch_roland_altsetting()
2086 if (USB_ID_VENDOR(umidi->usb_id) == 0x0582) in snd_usbmidi_detect_endpoints()
2092 intf = umidi->iface; in snd_usbmidi_detect_endpoints()
2093 if (!intf || intf->num_altsetting < 1) in snd_usbmidi_detect_endpoints()
2094 return -ENOENT; in snd_usbmidi_detect_endpoints()
2095 hostif = intf->cur_altsetting; in snd_usbmidi_detect_endpoints()
2098 for (i = 0; i < intfd->bNumEndpoints; ++i) { in snd_usbmidi_detect_endpoints()
2107 endpoint[out_eps].out_interval = epd->bInterval; in snd_usbmidi_detect_endpoints()
2114 endpoint[in_eps].in_interval = epd->bInterval; in snd_usbmidi_detect_endpoints()
2118 return (out_eps || in_eps) ? 0 : -ENOENT; in snd_usbmidi_detect_endpoints()
2122 * Detects the endpoints for one-port-per-endpoint protocols.
2150 intf = umidi->iface; in snd_usbmidi_detect_yamaha()
2152 return -ENOENT; in snd_usbmidi_detect_yamaha()
2153 hostif = intf->altsetting; in snd_usbmidi_detect_yamaha()
2155 if (intfd->bNumEndpoints < 1) in snd_usbmidi_detect_yamaha()
2156 return -ENOENT; in snd_usbmidi_detect_yamaha()
2162 for (cs_desc = hostif->extra; in snd_usbmidi_detect_yamaha()
2163 cs_desc < hostif->extra + hostif->extralen && cs_desc[0] >= 2; in snd_usbmidi_detect_yamaha()
2167 endpoint->in_cables = in snd_usbmidi_detect_yamaha()
2168 (endpoint->in_cables << 1) | 1; in snd_usbmidi_detect_yamaha()
2170 endpoint->out_cables = in snd_usbmidi_detect_yamaha()
2171 (endpoint->out_cables << 1) | 1; in snd_usbmidi_detect_yamaha()
2174 if (!endpoint->in_cables && !endpoint->out_cables) in snd_usbmidi_detect_yamaha()
2175 return -ENOENT; in snd_usbmidi_detect_yamaha()
2190 intf = umidi->iface; in snd_usbmidi_detect_roland()
2192 return -ENOENT; in snd_usbmidi_detect_roland()
2193 hostif = intf->altsetting; in snd_usbmidi_detect_roland()
2198 for (cs_desc = hostif->extra; in snd_usbmidi_detect_roland()
2199 cs_desc < hostif->extra + hostif->extralen && cs_desc[0] >= 2; in snd_usbmidi_detect_roland()
2207 endpoint->in_cables = (1 << cs_desc[4]) - 1; in snd_usbmidi_detect_roland()
2208 endpoint->out_cables = (1 << cs_desc[5]) - 1; in snd_usbmidi_detect_roland()
2217 return -ENODEV; in snd_usbmidi_detect_roland()
2233 intf = umidi->iface; in snd_usbmidi_create_endpoints_midiman()
2235 return -ENOENT; in snd_usbmidi_create_endpoints_midiman()
2236 hostif = intf->altsetting; in snd_usbmidi_create_endpoints_midiman()
2244 * bulk output endpoint for even-numbered ports, and one for odd- in snd_usbmidi_create_endpoints_midiman()
2245 * numbered ports. Both bulk output endpoints have corresponding in snd_usbmidi_create_endpoints_midiman()
2248 if (intfd->bNumEndpoints < (endpoint->out_cables > 0x0001 ? 5 : 3)) { in snd_usbmidi_create_endpoints_midiman()
2249 dev_dbg(&umidi->dev->dev, "not enough endpoints\n"); in snd_usbmidi_create_endpoints_midiman()
2250 return -ENOENT; in snd_usbmidi_create_endpoints_midiman()
2255 dev_dbg(&umidi->dev->dev, "endpoint[0] isn't interrupt\n"); in snd_usbmidi_create_endpoints_midiman()
2256 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2260 dev_dbg(&umidi->dev->dev, "endpoint[2] isn't bulk output\n"); in snd_usbmidi_create_endpoints_midiman()
2261 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2263 if (endpoint->out_cables > 0x0001) { in snd_usbmidi_create_endpoints_midiman()
2267 dev_dbg(&umidi->dev->dev, in snd_usbmidi_create_endpoints_midiman()
2269 return -ENXIO; in snd_usbmidi_create_endpoints_midiman()
2273 ep_info.out_ep = get_endpoint(hostif, 2)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2276 ep_info.out_cables = endpoint->out_cables & 0x5555; in snd_usbmidi_create_endpoints_midiman()
2278 &umidi->endpoints[0]); in snd_usbmidi_create_endpoints_midiman()
2282 ep_info.in_ep = get_endpoint(hostif, 0)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2284 ep_info.in_interval = get_endpoint(hostif, 0)->bInterval; in snd_usbmidi_create_endpoints_midiman()
2285 ep_info.in_cables = endpoint->in_cables; in snd_usbmidi_create_endpoints_midiman()
2287 &umidi->endpoints[0]); in snd_usbmidi_create_endpoints_midiman()
2291 if (endpoint->out_cables > 0x0001) { in snd_usbmidi_create_endpoints_midiman()
2292 ep_info.out_ep = get_endpoint(hostif, 4)->bEndpointAddress & in snd_usbmidi_create_endpoints_midiman()
2294 ep_info.out_cables = endpoint->out_cables & 0xaaaa; in snd_usbmidi_create_endpoints_midiman()
2296 &umidi->endpoints[1]); in snd_usbmidi_create_endpoints_midiman()
2302 if (endpoint->out_cables & (1 << cable)) in snd_usbmidi_create_endpoints_midiman()
2306 -1 /* prevent trying to find jack */, in snd_usbmidi_create_endpoints_midiman()
2307 &umidi->endpoints[cable & 1].out->ports[cable].substream); in snd_usbmidi_create_endpoints_midiman()
2308 if (endpoint->in_cables & (1 << cable)) in snd_usbmidi_create_endpoints_midiman()
2312 -1 /* prevent trying to find jack */, in snd_usbmidi_create_endpoints_midiman()
2313 &umidi->endpoints[0].in->ports[cable].substream); in snd_usbmidi_create_endpoints_midiman()
2328 err = snd_rawmidi_new(umidi->card, "USB MIDI", in snd_usbmidi_create_rawmidi()
2329 umidi->next_midi_device++, in snd_usbmidi_create_rawmidi()
2333 strcpy(rmidi->name, umidi->card->shortname); in snd_usbmidi_create_rawmidi()
2334 rmidi->info_flags = SNDRV_RAWMIDI_INFO_OUTPUT | in snd_usbmidi_create_rawmidi()
2337 rmidi->ops = &snd_usbmidi_ops; in snd_usbmidi_create_rawmidi()
2338 rmidi->private_data = umidi; in snd_usbmidi_create_rawmidi()
2339 rmidi->private_free = snd_usbmidi_rawmidi_free; in snd_usbmidi_create_rawmidi()
2345 umidi->rmidi = rmidi; in snd_usbmidi_create_rawmidi()
2358 if (!umidi->input_running) in snd_usbmidi_input_stop()
2361 struct snd_usb_midi_endpoint *ep = &umidi->endpoints[i]; in snd_usbmidi_input_stop()
2362 if (ep->in) in snd_usbmidi_input_stop()
2364 usb_kill_urb(ep->in->urbs[j]); in snd_usbmidi_input_stop()
2366 umidi->input_running = 0; in snd_usbmidi_input_stop()
2379 struct urb *urb = ep->urbs[i]; in snd_usbmidi_input_start_ep()
2380 spin_lock_irqsave(&umidi->disc_lock, flags); in snd_usbmidi_input_start_ep()
2381 if (!atomic_read(&urb->use_count)) { in snd_usbmidi_input_start_ep()
2382 urb->dev = ep->umidi->dev; in snd_usbmidi_input_start_ep()
2385 spin_unlock_irqrestore(&umidi->disc_lock, flags); in snd_usbmidi_input_start_ep()
2398 if (umidi->input_running || !umidi->opened[1]) in snd_usbmidi_input_start()
2401 snd_usbmidi_input_start_ep(umidi, umidi->endpoints[i].in); in snd_usbmidi_input_start()
2402 umidi->input_running = 1; in snd_usbmidi_input_start()
2414 mutex_lock(&umidi->mutex); in snd_usbmidi_suspend()
2416 mutex_unlock(&umidi->mutex); in snd_usbmidi_suspend()
2428 mutex_lock(&umidi->mutex); in snd_usbmidi_resume()
2430 mutex_unlock(&umidi->mutex); in snd_usbmidi_resume()
2451 return -ENOMEM; in __snd_usbmidi_create()
2452 umidi->dev = interface_to_usbdev(iface); in __snd_usbmidi_create()
2453 umidi->card = card; in __snd_usbmidi_create()
2454 umidi->iface = iface; in __snd_usbmidi_create()
2455 umidi->quirk = quirk; in __snd_usbmidi_create()
2456 umidi->usb_protocol_ops = &snd_usbmidi_standard_ops; in __snd_usbmidi_create()
2458 umidi->next_midi_device = *num_rawmidis; in __snd_usbmidi_create()
2459 spin_lock_init(&umidi->disc_lock); in __snd_usbmidi_create()
2460 init_rwsem(&umidi->disc_rwsem); in __snd_usbmidi_create()
2461 mutex_init(&umidi->mutex); in __snd_usbmidi_create()
2463 usb_id = USB_ID(le16_to_cpu(umidi->dev->descriptor.idVendor), in __snd_usbmidi_create()
2464 le16_to_cpu(umidi->dev->descriptor.idProduct)); in __snd_usbmidi_create()
2465 umidi->usb_id = usb_id; in __snd_usbmidi_create()
2466 timer_setup(&umidi->error_timer, snd_usbmidi_error_timer, 0); in __snd_usbmidi_create()
2470 switch (quirk ? quirk->type : QUIRK_MIDI_STANDARD_INTERFACE) { in __snd_usbmidi_create()
2473 if (umidi->usb_id == USB_ID(0x0763, 0x0150)) /* M-Audio Uno */ in __snd_usbmidi_create()
2474 umidi->usb_protocol_ops = in __snd_usbmidi_create()
2478 umidi->usb_protocol_ops = &snd_usbmidi_122l_ops; in __snd_usbmidi_create()
2481 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2492 umidi->usb_protocol_ops = &snd_usbmidi_midiman_ops; in __snd_usbmidi_create()
2493 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2498 umidi->usb_protocol_ops = &snd_usbmidi_novation_ops; in __snd_usbmidi_create()
2502 umidi->usb_protocol_ops = &snd_usbmidi_raw_ops; in __snd_usbmidi_create()
2512 if (umidi->usb_id == USB_ID(0x07fd, 0x0001)) /* MOTU Fastlane */ in __snd_usbmidi_create()
2513 usb_set_interface(umidi->dev, 0, 0); in __snd_usbmidi_create()
2517 umidi->usb_protocol_ops = &snd_usbmidi_emagic_ops; in __snd_usbmidi_create()
2518 memcpy(&endpoints[0], quirk->data, in __snd_usbmidi_create()
2523 umidi->usb_protocol_ops = &snd_usbmidi_cme_ops; in __snd_usbmidi_create()
2527 umidi->usb_protocol_ops = &snd_usbmidi_akai_ops; in __snd_usbmidi_create()
2529 /* endpoint 1 is input-only */ in __snd_usbmidi_create()
2533 umidi->usb_protocol_ops = &snd_usbmidi_ftdi_ops; in __snd_usbmidi_create()
2536 err = usb_control_msg(umidi->dev, usb_sndctrlpipe(umidi->dev, 0), in __snd_usbmidi_create()
2544 umidi->usb_protocol_ops = &snd_usbmidi_ch345_broken_sysex_ops; in __snd_usbmidi_create()
2548 dev_err(&umidi->dev->dev, "invalid quirk type %d\n", in __snd_usbmidi_create()
2549 quirk->type); in __snd_usbmidi_create()
2550 err = -ENXIO; in __snd_usbmidi_create()
2568 if (quirk && quirk->type == QUIRK_MIDI_MIDIMAN) in __snd_usbmidi_create()
2575 usb_autopm_get_interface_no_resume(umidi->iface); in __snd_usbmidi_create()
2577 list_add_tail(&umidi->list, midi_list); in __snd_usbmidi_create()
2579 *num_rawmidis = umidi->next_midi_device; in __snd_usbmidi_create()