1 // SPDX-License-Identifier: GPL-2.0-or-later
6 #include <linux/bitops.h>
7 #include <linux/string.h>
8 #include <linux/init.h>
9 #include <linux/slab.h>
10 #include <linux/usb.h>
11 #include <linux/wait.h>
12 #include <linux/module.h>
13 #include <linux/moduleparam.h>
14 #include <linux/usb/audio.h>
15 #include <linux/usb/midi.h>
16 #include <linux/usb/midi-v2.h>
18 #include <sound/core.h>
19 #include <sound/control.h>
20 #include <sound/ump.h>
26 static bool midi2_enable = true;
27 module_param(midi2_enable, bool, 0444);
28 MODULE_PARM_DESC(midi2_enable, "Enable MIDI 2.0 support.");
30 static bool midi2_ump_probe = true;
31 module_param(midi2_ump_probe, bool, 0444);
32 MODULE_PARM_DESC(midi2_ump_probe, "Probe UMP v1.1 support at first.");
34 /* stream direction; just shorter names */
36 STR_OUT = SNDRV_RAWMIDI_STREAM_OUTPUT,
37 STR_IN = SNDRV_RAWMIDI_STREAM_INPUT
42 struct snd_usb_midi2_urb;
43 struct snd_usb_midi2_endpoint;
44 struct snd_usb_midi2_ump;
45 struct snd_usb_midi2_interface;
48 struct snd_usb_midi2_urb {
50 struct snd_usb_midi2_endpoint *ep;
51 unsigned int index; /* array index */
54 /* A USB MIDI input/output endpoint */
55 struct snd_usb_midi2_endpoint {
56 struct usb_device *dev;
57 const struct usb_ms20_endpoint_descriptor *ms_ep; /* reference to EP descriptor */
58 struct snd_usb_midi2_endpoint *pair; /* bidirectional pair EP */
59 struct snd_usb_midi2_ump *rmidi; /* assigned UMP EP pair */
60 struct snd_ump_endpoint *ump; /* assigned UMP EP */
61 int direction; /* direction (STR_IN/OUT) */
62 unsigned int endpoint; /* EP number */
63 unsigned int pipe; /* URB pipe */
64 unsigned int packets; /* packet buffer size in bytes */
65 unsigned int interval; /* interval for INT EP */
66 wait_queue_head_t wait; /* URB waiter */
67 spinlock_t lock; /* URB locking */
68 struct snd_rawmidi_substream *substream; /* NULL when closed */
69 unsigned int num_urbs; /* number of allocated URBs */
70 unsigned long urb_free; /* bitmap for free URBs */
71 unsigned long urb_free_mask; /* bitmask for free URBs */
72 atomic_t running; /* running status */
73 atomic_t suspended; /* saved running status for suspend */
74 bool disconnected; /* shadow of umidi->disconnected */
75 struct list_head list; /* list to umidi->ep_list */
76 struct snd_usb_midi2_urb urbs[NUM_URBS];
79 /* A UMP endpoint - one or two USB MIDI endpoints are assigned */
80 struct snd_usb_midi2_ump {
81 struct usb_device *dev;
82 struct snd_usb_midi2_interface *umidi; /* reference to MIDI iface */
83 struct snd_ump_endpoint *ump; /* assigned UMP EP object */
84 struct snd_usb_midi2_endpoint *eps[2]; /* USB MIDI endpoints */
85 int index; /* rawmidi device index */
86 unsigned char usb_block_id; /* USB GTB id used for finding a pair */
87 bool ump_parsed; /* Parsed UMP 1.1 EP/FB info*/
88 struct list_head list; /* list to umidi->rawmidi_list */
91 /* top-level instance per USB MIDI interface */
92 struct snd_usb_midi2_interface {
93 struct snd_usb_audio *chip; /* assigned USB-audio card */
94 struct usb_interface *iface; /* assigned USB interface */
95 struct usb_host_interface *hostif;
96 const char *blk_descs; /* group terminal block descriptors */
97 unsigned int blk_desc_size; /* size of GTB descriptors */
99 struct list_head ep_list; /* list of endpoints */
100 struct list_head rawmidi_list; /* list of UMP rawmidis */
101 struct list_head list; /* list to chip->midi_v2_list */
104 /* submit URBs as much as possible; used for both input and output */
105 static void do_submit_urbs_locked(struct snd_usb_midi2_endpoint *ep,
106 int (*prepare)(struct snd_usb_midi2_endpoint *,
109 struct snd_usb_midi2_urb *ctx;
112 if (ep->disconnected)
115 while (ep->urb_free) {
116 index = find_first_bit(&ep->urb_free, ep->num_urbs);
117 if (index >= ep->num_urbs)
119 ctx = &ep->urbs[index];
120 err = prepare(ep, ctx->urb);
123 if (!ctx->urb->transfer_buffer_length)
125 ctx->urb->dev = ep->dev;
126 err = usb_submit_urb(ctx->urb, GFP_ATOMIC);
128 dev_dbg(&ep->dev->dev,
129 "usb_submit_urb error %d\n", err);
132 clear_bit(index, &ep->urb_free);
136 /* prepare for output submission: copy from rawmidi buffer to urb packet */
137 static int prepare_output_urb(struct snd_usb_midi2_endpoint *ep,
142 count = snd_ump_transmit(ep->ump, urb->transfer_buffer,
145 dev_dbg(&ep->dev->dev, "rawmidi transmit error %d\n", count);
148 cpu_to_le32_array((u32 *)urb->transfer_buffer, count >> 2);
149 urb->transfer_buffer_length = count;
153 static void submit_output_urbs_locked(struct snd_usb_midi2_endpoint *ep)
155 do_submit_urbs_locked(ep, prepare_output_urb);
158 /* URB completion for output; re-filling and re-submit */
159 static void output_urb_complete(struct urb *urb)
161 struct snd_usb_midi2_urb *ctx = urb->context;
162 struct snd_usb_midi2_endpoint *ep = ctx->ep;
165 spin_lock_irqsave(&ep->lock, flags);
166 set_bit(ctx->index, &ep->urb_free);
167 if (urb->status >= 0 && atomic_read(&ep->running))
168 submit_output_urbs_locked(ep);
169 if (ep->urb_free == ep->urb_free_mask)
171 spin_unlock_irqrestore(&ep->lock, flags);
174 /* prepare for input submission: just set the buffer length */
175 static int prepare_input_urb(struct snd_usb_midi2_endpoint *ep,
178 urb->transfer_buffer_length = ep->packets;
182 static void submit_input_urbs_locked(struct snd_usb_midi2_endpoint *ep)
184 do_submit_urbs_locked(ep, prepare_input_urb);
187 /* URB completion for input; copy into rawmidi buffer and resubmit */
188 static void input_urb_complete(struct urb *urb)
190 struct snd_usb_midi2_urb *ctx = urb->context;
191 struct snd_usb_midi2_endpoint *ep = ctx->ep;
195 spin_lock_irqsave(&ep->lock, flags);
196 if (ep->disconnected || urb->status < 0)
198 len = urb->actual_length;
199 len &= ~3; /* align UMP */
200 if (len > ep->packets)
203 le32_to_cpu_array((u32 *)urb->transfer_buffer, len >> 2);
204 snd_ump_receive(ep->ump, (u32 *)urb->transfer_buffer, len);
207 set_bit(ctx->index, &ep->urb_free);
208 submit_input_urbs_locked(ep);
209 if (ep->urb_free == ep->urb_free_mask)
211 spin_unlock_irqrestore(&ep->lock, flags);
214 /* URB submission helper; for both direction */
215 static void submit_io_urbs(struct snd_usb_midi2_endpoint *ep)
221 spin_lock_irqsave(&ep->lock, flags);
222 if (ep->direction == STR_IN)
223 submit_input_urbs_locked(ep);
225 submit_output_urbs_locked(ep);
226 spin_unlock_irqrestore(&ep->lock, flags);
229 /* kill URBs for close, suspend and disconnect */
230 static void kill_midi_urbs(struct snd_usb_midi2_endpoint *ep, bool suspending)
237 ep->suspended = ep->running;
238 atomic_set(&ep->running, 0);
239 for (i = 0; i < ep->num_urbs; i++) {
240 if (!ep->urbs[i].urb)
242 usb_kill_urb(ep->urbs[i].urb);
246 /* wait until all URBs get freed */
247 static void drain_urb_queue(struct snd_usb_midi2_endpoint *ep)
251 spin_lock_irq(&ep->lock);
252 atomic_set(&ep->running, 0);
253 wait_event_lock_irq_timeout(ep->wait,
255 ep->urb_free == ep->urb_free_mask,
256 ep->lock, msecs_to_jiffies(500));
257 spin_unlock_irq(&ep->lock);
260 /* release URBs for an EP */
261 static void free_midi_urbs(struct snd_usb_midi2_endpoint *ep)
263 struct snd_usb_midi2_urb *ctx;
268 for (i = 0; i < ep->num_urbs; ++i) {
272 usb_free_coherent(ep->dev, ep->packets,
273 ctx->urb->transfer_buffer,
274 ctx->urb->transfer_dma);
275 usb_free_urb(ctx->urb);
281 /* allocate URBs for an EP */
282 static int alloc_midi_urbs(struct snd_usb_midi2_endpoint *ep)
284 struct snd_usb_midi2_urb *ctx;
285 void (*comp)(struct urb *urb);
290 endpoint = ep->endpoint;
292 if (ep->direction == STR_IN)
293 comp = input_urb_complete;
295 comp = output_urb_complete;
298 ep->urb_free = ep->urb_free_mask = 0;
299 for (i = 0; i < NUM_URBS; i++) {
302 ctx->urb = usb_alloc_urb(0, GFP_KERNEL);
304 dev_err(&ep->dev->dev, "URB alloc failed\n");
308 buffer = usb_alloc_coherent(ep->dev, len, GFP_KERNEL,
309 &ctx->urb->transfer_dma);
311 dev_err(&ep->dev->dev,
312 "URB buffer alloc failed (size %d)\n", len);
316 usb_fill_int_urb(ctx->urb, ep->dev, ep->pipe,
317 buffer, len, comp, ctx, ep->interval);
319 usb_fill_bulk_urb(ctx->urb, ep->dev, ep->pipe,
320 buffer, len, comp, ctx);
321 err = usb_urb_ep_type_check(ctx->urb);
323 dev_err(&ep->dev->dev, "invalid MIDI EP %x\n",
327 ctx->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
330 ep->urb_free = ep->urb_free_mask = GENMASK(ep->num_urbs - 1, 0);
334 static struct snd_usb_midi2_endpoint *
335 ump_to_endpoint(struct snd_ump_endpoint *ump, int dir)
337 struct snd_usb_midi2_ump *rmidi = ump->private_data;
339 return rmidi->eps[dir];
342 /* ump open callback */
343 static int snd_usb_midi_v2_open(struct snd_ump_endpoint *ump, int dir)
345 struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
348 if (!ep || !ep->endpoint)
350 if (ep->disconnected)
352 if (ep->direction == STR_OUT) {
353 err = alloc_midi_urbs(ep);
360 /* ump close callback */
361 static void snd_usb_midi_v2_close(struct snd_ump_endpoint *ump, int dir)
363 struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
365 if (ep->direction == STR_OUT) {
366 kill_midi_urbs(ep, false);
372 /* ump trigger callback */
373 static void snd_usb_midi_v2_trigger(struct snd_ump_endpoint *ump, int dir,
376 struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
378 atomic_set(&ep->running, up);
379 if (up && ep->direction == STR_OUT && !ep->disconnected)
383 /* ump drain callback */
384 static void snd_usb_midi_v2_drain(struct snd_ump_endpoint *ump, int dir)
386 struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
391 /* allocate and start all input streams */
392 static int start_input_streams(struct snd_usb_midi2_interface *umidi)
394 struct snd_usb_midi2_endpoint *ep;
397 list_for_each_entry(ep, &umidi->ep_list, list) {
398 if (ep->direction == STR_IN) {
399 err = alloc_midi_urbs(ep);
405 list_for_each_entry(ep, &umidi->ep_list, list) {
406 if (ep->direction == STR_IN)
413 list_for_each_entry(ep, &umidi->ep_list, list) {
414 if (ep->direction == STR_IN)
421 static const struct snd_ump_ops snd_usb_midi_v2_ump_ops = {
422 .open = snd_usb_midi_v2_open,
423 .close = snd_usb_midi_v2_close,
424 .trigger = snd_usb_midi_v2_trigger,
425 .drain = snd_usb_midi_v2_drain,
428 /* create a USB MIDI 2.0 endpoint object */
429 static int create_midi2_endpoint(struct snd_usb_midi2_interface *umidi,
430 struct usb_host_endpoint *hostep,
431 const struct usb_ms20_endpoint_descriptor *ms_ep)
433 struct snd_usb_midi2_endpoint *ep;
436 usb_audio_dbg(umidi->chip, "Creating an EP 0x%02x, #GTB=%d\n",
437 hostep->desc.bEndpointAddress,
438 ms_ep->bNumGrpTrmBlock);
440 ep = kzalloc(sizeof(*ep), GFP_KERNEL);
444 spin_lock_init(&ep->lock);
445 init_waitqueue_head(&ep->wait);
446 ep->dev = umidi->chip->dev;
447 endpoint = hostep->desc.bEndpointAddress;
448 dir = (endpoint & USB_DIR_IN) ? STR_IN : STR_OUT;
450 ep->endpoint = endpoint;
453 if (usb_endpoint_xfer_int(&hostep->desc))
454 ep->interval = hostep->desc.bInterval;
459 ep->pipe = usb_rcvintpipe(ep->dev, endpoint);
461 ep->pipe = usb_rcvbulkpipe(ep->dev, endpoint);
464 ep->pipe = usb_sndintpipe(ep->dev, endpoint);
466 ep->pipe = usb_sndbulkpipe(ep->dev, endpoint);
468 ep->packets = usb_maxpacket(ep->dev, ep->pipe);
469 list_add_tail(&ep->list, &umidi->ep_list);
474 /* destructor for endpoint; from snd_usb_midi_v2_free() */
475 static void free_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
482 /* call all endpoint destructors */
483 static void free_all_midi2_endpoints(struct snd_usb_midi2_interface *umidi)
485 struct snd_usb_midi2_endpoint *ep;
487 while (!list_empty(&umidi->ep_list)) {
488 ep = list_first_entry(&umidi->ep_list,
489 struct snd_usb_midi2_endpoint, list);
490 free_midi2_endpoint(ep);
494 /* find a MIDI STREAMING descriptor with a given subtype */
495 static void *find_usb_ms_endpoint_descriptor(struct usb_host_endpoint *hostep,
496 unsigned char subtype)
498 unsigned char *extra = hostep->extra;
499 int extralen = hostep->extralen;
501 while (extralen > 3) {
502 struct usb_ms_endpoint_descriptor *ms_ep =
503 (struct usb_ms_endpoint_descriptor *)extra;
505 if (ms_ep->bLength > 3 &&
506 ms_ep->bDescriptorType == USB_DT_CS_ENDPOINT &&
507 ms_ep->bDescriptorSubtype == subtype)
511 extralen -= extra[0];
517 /* get the full group terminal block descriptors and return the size */
518 static int get_group_terminal_block_descs(struct snd_usb_midi2_interface *umidi)
520 struct usb_host_interface *hostif = umidi->hostif;
521 struct usb_device *dev = umidi->chip->dev;
522 struct usb_ms20_gr_trm_block_header_descriptor header = { 0 };
526 err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
527 USB_REQ_GET_DESCRIPTOR,
528 USB_RECIP_INTERFACE | USB_TYPE_STANDARD | USB_DIR_IN,
529 USB_DT_CS_GR_TRM_BLOCK << 8 | hostif->desc.bAlternateSetting,
530 hostif->desc.bInterfaceNumber,
531 &header, sizeof(header));
534 size = __le16_to_cpu(header.wTotalLength);
536 dev_err(&dev->dev, "Failed to get GTB descriptors for %d:%d\n",
537 hostif->desc.bInterfaceNumber, hostif->desc.bAlternateSetting);
541 data = kzalloc(size, GFP_KERNEL);
545 err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
546 USB_REQ_GET_DESCRIPTOR,
547 USB_RECIP_INTERFACE | USB_TYPE_STANDARD | USB_DIR_IN,
548 USB_DT_CS_GR_TRM_BLOCK << 8 | hostif->desc.bAlternateSetting,
549 hostif->desc.bInterfaceNumber, data, size);
555 umidi->blk_descs = data;
556 umidi->blk_desc_size = size;
560 /* find the corresponding group terminal block descriptor */
561 static const struct usb_ms20_gr_trm_block_descriptor *
562 find_group_terminal_block(struct snd_usb_midi2_interface *umidi, int id)
564 const unsigned char *data = umidi->blk_descs;
565 int size = umidi->blk_desc_size;
566 const struct usb_ms20_gr_trm_block_descriptor *desc;
568 size -= sizeof(struct usb_ms20_gr_trm_block_header_descriptor);
569 data += sizeof(struct usb_ms20_gr_trm_block_header_descriptor);
570 while (size > 0 && *data && *data <= size) {
571 desc = (const struct usb_ms20_gr_trm_block_descriptor *)data;
572 if (desc->bLength >= sizeof(*desc) &&
573 desc->bDescriptorType == USB_DT_CS_GR_TRM_BLOCK &&
574 desc->bDescriptorSubtype == USB_MS_GR_TRM_BLOCK &&
575 desc->bGrpTrmBlkID == id)
584 /* fill up the information from GTB */
585 static int parse_group_terminal_block(struct snd_usb_midi2_ump *rmidi,
586 const struct usb_ms20_gr_trm_block_descriptor *desc)
588 struct snd_ump_endpoint *ump = rmidi->ump;
589 unsigned int protocol, protocol_caps;
591 /* set default protocol */
592 switch (desc->bMIDIProtocol) {
593 case USB_MS_MIDI_PROTO_1_0_64:
594 case USB_MS_MIDI_PROTO_1_0_64_JRTS:
595 case USB_MS_MIDI_PROTO_1_0_128:
596 case USB_MS_MIDI_PROTO_1_0_128_JRTS:
597 protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI1;
599 case USB_MS_MIDI_PROTO_2_0:
600 case USB_MS_MIDI_PROTO_2_0_JRTS:
601 protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI2;
607 if (ump->info.protocol && ump->info.protocol != protocol)
608 usb_audio_info(rmidi->umidi->chip,
609 "Overriding preferred MIDI protocol in GTB %d: %x -> %x\n",
610 rmidi->usb_block_id, ump->info.protocol,
612 ump->info.protocol = protocol;
614 protocol_caps = protocol;
615 switch (desc->bMIDIProtocol) {
616 case USB_MS_MIDI_PROTO_1_0_64_JRTS:
617 case USB_MS_MIDI_PROTO_1_0_128_JRTS:
618 case USB_MS_MIDI_PROTO_2_0_JRTS:
619 protocol_caps |= SNDRV_UMP_EP_INFO_PROTO_JRTS_TX |
620 SNDRV_UMP_EP_INFO_PROTO_JRTS_RX;
624 if (ump->info.protocol_caps && ump->info.protocol_caps != protocol_caps)
625 usb_audio_info(rmidi->umidi->chip,
626 "Overriding MIDI protocol caps in GTB %d: %x -> %x\n",
627 rmidi->usb_block_id, ump->info.protocol_caps,
629 ump->info.protocol_caps = protocol_caps;
634 /* allocate and parse for each assigned group terminal block */
635 static int parse_group_terminal_blocks(struct snd_usb_midi2_interface *umidi)
637 struct snd_usb_midi2_ump *rmidi;
638 const struct usb_ms20_gr_trm_block_descriptor *desc;
641 err = get_group_terminal_block_descs(umidi);
644 if (!umidi->blk_descs)
647 list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
648 desc = find_group_terminal_block(umidi, rmidi->usb_block_id);
651 err = parse_group_terminal_block(rmidi, desc);
659 /* parse endpoints included in the given interface and create objects */
660 static int parse_midi_2_0_endpoints(struct snd_usb_midi2_interface *umidi)
662 struct usb_host_interface *hostif = umidi->hostif;
663 struct usb_host_endpoint *hostep;
664 struct usb_ms20_endpoint_descriptor *ms_ep;
667 for (i = 0; i < hostif->desc.bNumEndpoints; i++) {
668 hostep = &hostif->endpoint[i];
669 if (!usb_endpoint_xfer_bulk(&hostep->desc) &&
670 !usb_endpoint_xfer_int(&hostep->desc))
672 ms_ep = find_usb_ms_endpoint_descriptor(hostep, USB_MS_GENERAL_2_0);
675 if (ms_ep->bLength <= sizeof(*ms_ep))
677 if (!ms_ep->bNumGrpTrmBlock)
679 if (ms_ep->bLength < sizeof(*ms_ep) + ms_ep->bNumGrpTrmBlock)
681 err = create_midi2_endpoint(umidi, hostep, ms_ep);
688 static void free_all_midi2_umps(struct snd_usb_midi2_interface *umidi)
690 struct snd_usb_midi2_ump *rmidi;
692 while (!list_empty(&umidi->rawmidi_list)) {
693 rmidi = list_first_entry(&umidi->rawmidi_list,
694 struct snd_usb_midi2_ump, list);
695 list_del(&rmidi->list);
700 static int create_midi2_ump(struct snd_usb_midi2_interface *umidi,
701 struct snd_usb_midi2_endpoint *ep_in,
702 struct snd_usb_midi2_endpoint *ep_out,
705 struct snd_usb_midi2_ump *rmidi;
706 struct snd_ump_endpoint *ump;
711 rmidi = kzalloc(sizeof(*rmidi), GFP_KERNEL);
714 INIT_LIST_HEAD(&rmidi->list);
715 rmidi->dev = umidi->chip->dev;
716 rmidi->umidi = umidi;
717 rmidi->usb_block_id = blk_id;
719 rmidi->index = umidi->chip->num_rawmidis;
720 snprintf(idstr, sizeof(idstr), "UMP %d", rmidi->index);
721 input = ep_in ? 1 : 0;
722 output = ep_out ? 1 : 0;
723 err = snd_ump_endpoint_new(umidi->chip->card, idstr, rmidi->index,
724 output, input, &ump);
726 usb_audio_dbg(umidi->chip, "Failed to create a UMP object\n");
732 umidi->chip->num_rawmidis++;
734 ump->private_data = rmidi;
735 ump->ops = &snd_usb_midi_v2_ump_ops;
737 rmidi->eps[STR_IN] = ep_in;
738 rmidi->eps[STR_OUT] = ep_out;
740 ep_in->pair = ep_out;
741 ep_in->rmidi = rmidi;
745 ep_out->pair = ep_in;
746 ep_out->rmidi = rmidi;
750 list_add_tail(&rmidi->list, &umidi->rawmidi_list);
754 /* find the UMP EP with the given USB block id */
755 static struct snd_usb_midi2_ump *
756 find_midi2_ump(struct snd_usb_midi2_interface *umidi, int blk_id)
758 struct snd_usb_midi2_ump *rmidi;
760 list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
761 if (rmidi->usb_block_id == blk_id)
767 /* look for the matching output endpoint and create UMP object if found */
768 static int find_matching_ep_partner(struct snd_usb_midi2_interface *umidi,
769 struct snd_usb_midi2_endpoint *ep,
772 struct snd_usb_midi2_endpoint *pair_ep;
775 usb_audio_dbg(umidi->chip, "Looking for a pair for EP-in 0x%02x\n",
777 list_for_each_entry(pair_ep, &umidi->ep_list, list) {
778 if (pair_ep->direction != STR_OUT)
781 continue; /* already paired */
782 for (blk = 0; blk < pair_ep->ms_ep->bNumGrpTrmBlock; blk++) {
783 if (pair_ep->ms_ep->baAssoGrpTrmBlkID[blk] == blk_id) {
784 usb_audio_dbg(umidi->chip,
785 "Found a match with EP-out 0x%02x blk %d\n",
786 pair_ep->endpoint, blk);
787 return create_midi2_ump(umidi, ep, pair_ep, blk_id);
794 /* Call UMP helper to parse UMP endpoints;
795 * this needs to be called after starting the input streams for bi-directional
798 static int parse_ump_endpoints(struct snd_usb_midi2_interface *umidi)
800 struct snd_usb_midi2_ump *rmidi;
803 list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
805 !(rmidi->ump->core.info_flags & SNDRV_RAWMIDI_INFO_DUPLEX))
807 err = snd_ump_parse_endpoint(rmidi->ump);
809 rmidi->ump_parsed = true;
813 /* fall back to GTB later */
819 /* create a UMP block from a GTB entry */
820 static int create_gtb_block(struct snd_usb_midi2_ump *rmidi, int dir, int blk)
822 struct snd_usb_midi2_interface *umidi = rmidi->umidi;
823 const struct usb_ms20_gr_trm_block_descriptor *desc;
824 struct snd_ump_block *fb;
827 desc = find_group_terminal_block(umidi, blk);
831 usb_audio_dbg(umidi->chip,
832 "GTB %d: type=%d, group=%d/%d, protocol=%d, in bw=%d, out bw=%d\n",
833 blk, desc->bGrpTrmBlkType, desc->nGroupTrm,
834 desc->nNumGroupTrm, desc->bMIDIProtocol,
835 __le16_to_cpu(desc->wMaxInputBandwidth),
836 __le16_to_cpu(desc->wMaxOutputBandwidth));
838 /* assign the direction */
839 switch (desc->bGrpTrmBlkType) {
840 case USB_MS_GR_TRM_BLOCK_TYPE_BIDIRECTIONAL:
841 type = SNDRV_UMP_DIR_BIDIRECTION;
843 case USB_MS_GR_TRM_BLOCK_TYPE_INPUT_ONLY:
844 type = SNDRV_UMP_DIR_INPUT;
846 case USB_MS_GR_TRM_BLOCK_TYPE_OUTPUT_ONLY:
847 type = SNDRV_UMP_DIR_OUTPUT;
850 usb_audio_dbg(umidi->chip, "Unsupported GTB type %d\n",
851 desc->bGrpTrmBlkType);
852 return 0; /* unsupported */
855 /* guess work: set blk-1 as the (0-based) block ID */
856 err = snd_ump_block_new(rmidi->ump, blk - 1, type,
857 desc->nGroupTrm, desc->nNumGroupTrm,
860 return 0; /* already present */
864 if (desc->iBlockItem)
865 usb_string(rmidi->dev, desc->iBlockItem,
866 fb->info.name, sizeof(fb->info.name));
868 if (__le16_to_cpu(desc->wMaxInputBandwidth) == 1 ||
869 __le16_to_cpu(desc->wMaxOutputBandwidth) == 1)
870 fb->info.flags |= SNDRV_UMP_BLOCK_IS_MIDI1 |
871 SNDRV_UMP_BLOCK_IS_LOWSPEED;
873 usb_audio_dbg(umidi->chip,
874 "Created a UMP block %d from GTB, name=%s\n",
879 /* Create UMP blocks for each UMP EP */
880 static int create_blocks_from_gtb(struct snd_usb_midi2_interface *umidi)
882 struct snd_usb_midi2_ump *rmidi;
883 int i, blk, err, dir;
885 list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
888 /* Blocks have been already created? */
889 if (rmidi->ump_parsed || rmidi->ump->info.num_blocks)
891 /* GTB is static-only */
892 rmidi->ump->info.flags |= SNDRV_UMP_EP_INFO_STATIC_BLOCKS;
894 for (dir = 0; dir < 2; dir++) {
895 if (!rmidi->eps[dir])
897 for (i = 0; i < rmidi->eps[dir]->ms_ep->bNumGrpTrmBlock; i++) {
898 blk = rmidi->eps[dir]->ms_ep->baAssoGrpTrmBlkID[i];
899 err = create_gtb_block(rmidi, dir, blk);
909 /* attach legacy rawmidis */
910 static int attach_legacy_rawmidi(struct snd_usb_midi2_interface *umidi)
912 #if IS_ENABLED(CONFIG_SND_UMP_LEGACY_RAWMIDI)
913 struct snd_usb_midi2_ump *rmidi;
916 list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
917 err = snd_ump_attach_legacy_rawmidi(rmidi->ump,
919 umidi->chip->num_rawmidis);
922 umidi->chip->num_rawmidis++;
928 static void snd_usb_midi_v2_free(struct snd_usb_midi2_interface *umidi)
930 free_all_midi2_endpoints(umidi);
931 free_all_midi2_umps(umidi);
932 list_del(&umidi->list);
933 kfree(umidi->blk_descs);
937 /* parse the interface for MIDI 2.0 */
938 static int parse_midi_2_0(struct snd_usb_midi2_interface *umidi)
940 struct snd_usb_midi2_endpoint *ep;
943 /* First, create an object for each USB MIDI Endpoint */
944 err = parse_midi_2_0_endpoints(umidi);
947 if (list_empty(&umidi->ep_list)) {
948 usb_audio_warn(umidi->chip, "No MIDI endpoints found\n");
953 * Next, look for EP I/O pairs that are found in group terminal blocks
954 * A UMP object is created for each EP I/O pair as bidirecitonal
957 list_for_each_entry(ep, &umidi->ep_list, list) {
958 /* only input in this loop; output is matched in find_midi_ump() */
959 if (ep->direction != STR_IN)
961 for (blk = 0; blk < ep->ms_ep->bNumGrpTrmBlock; blk++) {
962 id = ep->ms_ep->baAssoGrpTrmBlkID[blk];
963 err = find_matching_ep_partner(umidi, ep, id);
970 * For the remaining EPs, treat as singles, create a UMP object with
973 list_for_each_entry(ep, &umidi->ep_list, list) {
975 continue; /* already paired */
976 for (blk = 0; blk < ep->ms_ep->bNumGrpTrmBlock; blk++) {
977 id = ep->ms_ep->baAssoGrpTrmBlkID[blk];
978 if (find_midi2_ump(umidi, id))
980 usb_audio_dbg(umidi->chip,
981 "Creating a unidirection UMP for EP=0x%02x, blk=%d\n",
983 if (ep->direction == STR_IN)
984 err = create_midi2_ump(umidi, ep, NULL, id);
986 err = create_midi2_ump(umidi, NULL, ep, id);
993 return attach_legacy_rawmidi(umidi);
996 /* is the given interface for MIDI 2.0? */
997 static bool is_midi2_altset(struct usb_host_interface *hostif)
999 struct usb_ms_header_descriptor *ms_header =
1000 (struct usb_ms_header_descriptor *)hostif->extra;
1002 if (hostif->extralen < 7 ||
1003 ms_header->bLength < 7 ||
1004 ms_header->bDescriptorType != USB_DT_CS_INTERFACE ||
1005 ms_header->bDescriptorSubtype != UAC_HEADER)
1008 return le16_to_cpu(ms_header->bcdMSC) == USB_MS_REV_MIDI_2_0;
1011 /* change the altsetting */
1012 static int set_altset(struct snd_usb_midi2_interface *umidi)
1014 usb_audio_dbg(umidi->chip, "Setting host iface %d:%d\n",
1015 umidi->hostif->desc.bInterfaceNumber,
1016 umidi->hostif->desc.bAlternateSetting);
1017 return usb_set_interface(umidi->chip->dev,
1018 umidi->hostif->desc.bInterfaceNumber,
1019 umidi->hostif->desc.bAlternateSetting);
1022 /* fill UMP Endpoint name string from USB descriptor */
1023 static void fill_ump_ep_name(struct snd_ump_endpoint *ump,
1024 struct usb_device *dev, int id)
1028 usb_string(dev, id, ump->info.name, sizeof(ump->info.name));
1030 /* trim superfluous "MIDI" suffix */
1031 len = strlen(ump->info.name);
1032 if (len > 5 && !strcmp(ump->info.name + len - 5, " MIDI"))
1033 ump->info.name[len - 5] = 0;
1036 /* fill the fallback name string for each rawmidi instance */
1037 static void set_fallback_rawmidi_names(struct snd_usb_midi2_interface *umidi)
1039 struct usb_device *dev = umidi->chip->dev;
1040 struct snd_usb_midi2_ump *rmidi;
1041 struct snd_ump_endpoint *ump;
1043 list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
1045 /* fill UMP EP name from USB descriptors */
1046 if (!*ump->info.name && umidi->hostif->desc.iInterface)
1047 fill_ump_ep_name(ump, dev, umidi->hostif->desc.iInterface);
1048 else if (!*ump->info.name && dev->descriptor.iProduct)
1049 fill_ump_ep_name(ump, dev, dev->descriptor.iProduct);
1050 /* fill fallback name */
1051 if (!*ump->info.name)
1052 sprintf(ump->info.name, "USB MIDI %d", rmidi->index);
1053 /* copy as rawmidi name if not set */
1054 if (!*ump->core.name)
1055 strscpy(ump->core.name, ump->info.name,
1056 sizeof(ump->core.name));
1057 /* use serial number string as unique UMP product id */
1058 if (!*ump->info.product_id && dev->descriptor.iSerialNumber)
1059 usb_string(dev, dev->descriptor.iSerialNumber,
1060 ump->info.product_id,
1061 sizeof(ump->info.product_id));
1062 #if IS_ENABLED(CONFIG_SND_UMP_LEGACY_RAWMIDI)
1063 if (ump->legacy_rmidi && !*ump->legacy_rmidi->name)
1064 snprintf(ump->legacy_rmidi->name,
1065 sizeof(ump->legacy_rmidi->name),
1066 "%s (MIDI 1.0)", ump->info.name);
1071 /* create MIDI interface; fallback to MIDI 1.0 if needed */
1072 int snd_usb_midi_v2_create(struct snd_usb_audio *chip,
1073 struct usb_interface *iface,
1074 const struct snd_usb_audio_quirk *quirk,
1075 unsigned int usb_id)
1077 struct snd_usb_midi2_interface *umidi;
1078 struct usb_host_interface *hostif;
1081 usb_audio_dbg(chip, "Parsing interface %d...\n",
1082 iface->altsetting[0].desc.bInterfaceNumber);
1084 /* fallback to MIDI 1.0? */
1085 if (!midi2_enable) {
1086 usb_audio_info(chip, "Falling back to MIDI 1.0 by module option\n");
1087 goto fallback_to_midi1;
1089 if ((quirk && quirk->type != QUIRK_MIDI_STANDARD_INTERFACE) ||
1090 iface->num_altsetting < 2) {
1091 usb_audio_info(chip, "Quirk or no altest; falling back to MIDI 1.0\n");
1092 goto fallback_to_midi1;
1094 hostif = &iface->altsetting[1];
1095 if (!is_midi2_altset(hostif)) {
1096 usb_audio_info(chip, "No MIDI 2.0 at altset 1, falling back to MIDI 1.0\n");
1097 goto fallback_to_midi1;
1099 if (!hostif->desc.bNumEndpoints) {
1100 usb_audio_info(chip, "No endpoint at altset 1, falling back to MIDI 1.0\n");
1101 goto fallback_to_midi1;
1104 usb_audio_dbg(chip, "Creating a MIDI 2.0 instance for %d:%d\n",
1105 hostif->desc.bInterfaceNumber,
1106 hostif->desc.bAlternateSetting);
1108 umidi = kzalloc(sizeof(*umidi), GFP_KERNEL);
1112 umidi->iface = iface;
1113 umidi->hostif = hostif;
1114 INIT_LIST_HEAD(&umidi->rawmidi_list);
1115 INIT_LIST_HEAD(&umidi->ep_list);
1117 list_add_tail(&umidi->list, &chip->midi_v2_list);
1119 err = set_altset(umidi);
1121 usb_audio_err(chip, "Failed to set altset\n");
1125 /* assume only altset 1 corresponding to MIDI 2.0 interface */
1126 err = parse_midi_2_0(umidi);
1128 usb_audio_err(chip, "Failed to parse MIDI 2.0 interface\n");
1132 /* parse USB group terminal blocks */
1133 err = parse_group_terminal_blocks(umidi);
1135 usb_audio_err(chip, "Failed to parse GTB\n");
1139 err = start_input_streams(umidi);
1141 usb_audio_err(chip, "Failed to start input streams\n");
1145 if (midi2_ump_probe) {
1146 err = parse_ump_endpoints(umidi);
1148 usb_audio_err(chip, "Failed to parse UMP endpoint\n");
1153 err = create_blocks_from_gtb(umidi);
1155 usb_audio_err(chip, "Failed to create GTB blocks\n");
1159 set_fallback_rawmidi_names(umidi);
1163 snd_usb_midi_v2_free(umidi);
1167 return __snd_usbmidi_create(chip->card, iface, &chip->midi_list,
1168 quirk, usb_id, &chip->num_rawmidis);
1171 static void suspend_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
1173 kill_midi_urbs(ep, true);
1174 drain_urb_queue(ep);
1177 void snd_usb_midi_v2_suspend_all(struct snd_usb_audio *chip)
1179 struct snd_usb_midi2_interface *umidi;
1180 struct snd_usb_midi2_endpoint *ep;
1182 list_for_each_entry(umidi, &chip->midi_v2_list, list) {
1183 list_for_each_entry(ep, &umidi->ep_list, list)
1184 suspend_midi2_endpoint(ep);
1188 static void resume_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
1190 ep->running = ep->suspended;
1191 if (ep->direction == STR_IN)
1193 /* FIXME: does it all? */
1196 void snd_usb_midi_v2_resume_all(struct snd_usb_audio *chip)
1198 struct snd_usb_midi2_interface *umidi;
1199 struct snd_usb_midi2_endpoint *ep;
1201 list_for_each_entry(umidi, &chip->midi_v2_list, list) {
1203 list_for_each_entry(ep, &umidi->ep_list, list)
1204 resume_midi2_endpoint(ep);
1208 void snd_usb_midi_v2_disconnect_all(struct snd_usb_audio *chip)
1210 struct snd_usb_midi2_interface *umidi;
1211 struct snd_usb_midi2_endpoint *ep;
1213 list_for_each_entry(umidi, &chip->midi_v2_list, list) {
1214 umidi->disconnected = 1;
1215 list_for_each_entry(ep, &umidi->ep_list, list) {
1216 ep->disconnected = 1;
1217 kill_midi_urbs(ep, false);
1218 drain_urb_queue(ep);
1223 /* release the MIDI instance */
1224 void snd_usb_midi_v2_free_all(struct snd_usb_audio *chip)
1226 struct snd_usb_midi2_interface *umidi, *next;
1228 list_for_each_entry_safe(umidi, next, &chip->midi_v2_list, list)
1229 snd_usb_midi_v2_free(umidi);