xref: /linux/sound/usb/midi2.c (revision 3a39d672e7f48b8d6b91a09afa4b55352773b4b5)
1  // SPDX-License-Identifier: GPL-2.0-or-later
2  /*
3   * MIDI 2.0 support
4   */
5  
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>
17  
18  #include <sound/core.h>
19  #include <sound/control.h>
20  #include <sound/ump.h>
21  #include "usbaudio.h"
22  #include "midi.h"
23  #include "midi2.h"
24  #include "helper.h"
25  
26  static bool midi2_enable = true;
27  module_param(midi2_enable, bool, 0444);
28  MODULE_PARM_DESC(midi2_enable, "Enable MIDI 2.0 support.");
29  
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.");
33  
34  /* stream direction; just shorter names */
35  enum {
36  	STR_OUT = SNDRV_RAWMIDI_STREAM_OUTPUT,
37  	STR_IN = SNDRV_RAWMIDI_STREAM_INPUT
38  };
39  
40  #define NUM_URBS	8
41  
42  struct snd_usb_midi2_urb;
43  struct snd_usb_midi2_endpoint;
44  struct snd_usb_midi2_ump;
45  struct snd_usb_midi2_interface;
46  
47  /* URB context */
48  struct snd_usb_midi2_urb {
49  	struct urb *urb;
50  	struct snd_usb_midi2_endpoint *ep;
51  	unsigned int index;		/* array index */
52  };
53  
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];
77  };
78  
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 */
89  };
90  
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 */
98  	bool disconnected;
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 */
102  };
103  
104  /* submit URBs as much as possible; used for both input and output */
do_submit_urbs_locked(struct snd_usb_midi2_endpoint * ep,int (* prepare)(struct snd_usb_midi2_endpoint *,struct urb *))105  static void do_submit_urbs_locked(struct snd_usb_midi2_endpoint *ep,
106  				  int (*prepare)(struct snd_usb_midi2_endpoint *,
107  						 struct urb *))
108  {
109  	struct snd_usb_midi2_urb *ctx;
110  	int index, err = 0;
111  
112  	if (ep->disconnected)
113  		return;
114  
115  	while (ep->urb_free) {
116  		index = find_first_bit(&ep->urb_free, ep->num_urbs);
117  		if (index >= ep->num_urbs)
118  			return;
119  		ctx = &ep->urbs[index];
120  		err = prepare(ep, ctx->urb);
121  		if (err < 0)
122  			return;
123  		if (!ctx->urb->transfer_buffer_length)
124  			return;
125  		ctx->urb->dev = ep->dev;
126  		err = usb_submit_urb(ctx->urb, GFP_ATOMIC);
127  		if (err < 0) {
128  			dev_dbg(&ep->dev->dev,
129  				"usb_submit_urb error %d\n", err);
130  			return;
131  		}
132  		clear_bit(index, &ep->urb_free);
133  	}
134  }
135  
136  /* prepare for output submission: copy from rawmidi buffer to urb packet */
prepare_output_urb(struct snd_usb_midi2_endpoint * ep,struct urb * urb)137  static int prepare_output_urb(struct snd_usb_midi2_endpoint *ep,
138  			      struct urb *urb)
139  {
140  	int count;
141  
142  	count = snd_ump_transmit(ep->ump, urb->transfer_buffer,
143  				 ep->packets);
144  	if (count < 0) {
145  		dev_dbg(&ep->dev->dev, "rawmidi transmit error %d\n", count);
146  		return count;
147  	}
148  	cpu_to_le32_array((u32 *)urb->transfer_buffer, count >> 2);
149  	urb->transfer_buffer_length = count;
150  	return 0;
151  }
152  
submit_output_urbs_locked(struct snd_usb_midi2_endpoint * ep)153  static void submit_output_urbs_locked(struct snd_usb_midi2_endpoint *ep)
154  {
155  	do_submit_urbs_locked(ep, prepare_output_urb);
156  }
157  
158  /* URB completion for output; re-filling and re-submit */
output_urb_complete(struct urb * urb)159  static void output_urb_complete(struct urb *urb)
160  {
161  	struct snd_usb_midi2_urb *ctx = urb->context;
162  	struct snd_usb_midi2_endpoint *ep = ctx->ep;
163  	unsigned long flags;
164  
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)
170  		wake_up(&ep->wait);
171  	spin_unlock_irqrestore(&ep->lock, flags);
172  }
173  
174  /* prepare for input submission: just set the buffer length */
prepare_input_urb(struct snd_usb_midi2_endpoint * ep,struct urb * urb)175  static int prepare_input_urb(struct snd_usb_midi2_endpoint *ep,
176  			     struct urb *urb)
177  {
178  	urb->transfer_buffer_length = ep->packets;
179  	return 0;
180  }
181  
submit_input_urbs_locked(struct snd_usb_midi2_endpoint * ep)182  static void submit_input_urbs_locked(struct snd_usb_midi2_endpoint *ep)
183  {
184  	do_submit_urbs_locked(ep, prepare_input_urb);
185  }
186  
187  /* URB completion for input; copy into rawmidi buffer and resubmit */
input_urb_complete(struct urb * urb)188  static void input_urb_complete(struct urb *urb)
189  {
190  	struct snd_usb_midi2_urb *ctx = urb->context;
191  	struct snd_usb_midi2_endpoint *ep = ctx->ep;
192  	unsigned long flags;
193  	int len;
194  
195  	spin_lock_irqsave(&ep->lock, flags);
196  	if (ep->disconnected || urb->status < 0)
197  		goto dequeue;
198  	len = urb->actual_length;
199  	len &= ~3; /* align UMP */
200  	if (len > ep->packets)
201  		len = ep->packets;
202  	if (len > 0) {
203  		le32_to_cpu_array((u32 *)urb->transfer_buffer, len >> 2);
204  		snd_ump_receive(ep->ump, (u32 *)urb->transfer_buffer, len);
205  	}
206   dequeue:
207  	set_bit(ctx->index, &ep->urb_free);
208  	submit_input_urbs_locked(ep);
209  	if (ep->urb_free == ep->urb_free_mask)
210  		wake_up(&ep->wait);
211  	spin_unlock_irqrestore(&ep->lock, flags);
212  }
213  
214  /* URB submission helper; for both direction */
submit_io_urbs(struct snd_usb_midi2_endpoint * ep)215  static void submit_io_urbs(struct snd_usb_midi2_endpoint *ep)
216  {
217  	unsigned long flags;
218  
219  	if (!ep)
220  		return;
221  	spin_lock_irqsave(&ep->lock, flags);
222  	if (ep->direction == STR_IN)
223  		submit_input_urbs_locked(ep);
224  	else
225  		submit_output_urbs_locked(ep);
226  	spin_unlock_irqrestore(&ep->lock, flags);
227  }
228  
229  /* kill URBs for close, suspend and disconnect */
kill_midi_urbs(struct snd_usb_midi2_endpoint * ep,bool suspending)230  static void kill_midi_urbs(struct snd_usb_midi2_endpoint *ep, bool suspending)
231  {
232  	int i;
233  
234  	if (!ep)
235  		return;
236  	if (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)
241  			break;
242  		usb_kill_urb(ep->urbs[i].urb);
243  	}
244  }
245  
246  /* wait until all URBs get freed */
drain_urb_queue(struct snd_usb_midi2_endpoint * ep)247  static void drain_urb_queue(struct snd_usb_midi2_endpoint *ep)
248  {
249  	if (!ep)
250  		return;
251  	spin_lock_irq(&ep->lock);
252  	atomic_set(&ep->running, 0);
253  	wait_event_lock_irq_timeout(ep->wait,
254  				    ep->disconnected ||
255  				    ep->urb_free == ep->urb_free_mask,
256  				    ep->lock, msecs_to_jiffies(500));
257  	spin_unlock_irq(&ep->lock);
258  }
259  
260  /* release URBs for an EP */
free_midi_urbs(struct snd_usb_midi2_endpoint * ep)261  static void free_midi_urbs(struct snd_usb_midi2_endpoint *ep)
262  {
263  	struct snd_usb_midi2_urb *ctx;
264  	int i;
265  
266  	if (!ep)
267  		return;
268  	for (i = 0; i < NUM_URBS; ++i) {
269  		ctx = &ep->urbs[i];
270  		if (!ctx->urb)
271  			break;
272  		usb_free_coherent(ep->dev, ep->packets,
273  				  ctx->urb->transfer_buffer,
274  				  ctx->urb->transfer_dma);
275  		usb_free_urb(ctx->urb);
276  		ctx->urb = NULL;
277  	}
278  	ep->num_urbs = 0;
279  }
280  
281  /* allocate URBs for an EP */
282  /* the callers should handle allocation errors via free_midi_urbs() */
alloc_midi_urbs(struct snd_usb_midi2_endpoint * ep)283  static int alloc_midi_urbs(struct snd_usb_midi2_endpoint *ep)
284  {
285  	struct snd_usb_midi2_urb *ctx;
286  	void (*comp)(struct urb *urb);
287  	void *buffer;
288  	int i, err;
289  	int endpoint, len;
290  
291  	endpoint = ep->endpoint;
292  	len = ep->packets;
293  	if (ep->direction == STR_IN)
294  		comp = input_urb_complete;
295  	else
296  		comp = output_urb_complete;
297  
298  	ep->num_urbs = 0;
299  	ep->urb_free = ep->urb_free_mask = 0;
300  	for (i = 0; i < NUM_URBS; i++) {
301  		ctx = &ep->urbs[i];
302  		ctx->index = i;
303  		ctx->urb = usb_alloc_urb(0, GFP_KERNEL);
304  		if (!ctx->urb) {
305  			dev_err(&ep->dev->dev, "URB alloc failed\n");
306  			return -ENOMEM;
307  		}
308  		ctx->ep = ep;
309  		buffer = usb_alloc_coherent(ep->dev, len, GFP_KERNEL,
310  					    &ctx->urb->transfer_dma);
311  		if (!buffer) {
312  			dev_err(&ep->dev->dev,
313  				"URB buffer alloc failed (size %d)\n", len);
314  			return -ENOMEM;
315  		}
316  		if (ep->interval)
317  			usb_fill_int_urb(ctx->urb, ep->dev, ep->pipe,
318  					 buffer, len, comp, ctx, ep->interval);
319  		else
320  			usb_fill_bulk_urb(ctx->urb, ep->dev, ep->pipe,
321  					  buffer, len, comp, ctx);
322  		err = usb_urb_ep_type_check(ctx->urb);
323  		if (err < 0) {
324  			dev_err(&ep->dev->dev, "invalid MIDI EP %x\n",
325  				endpoint);
326  			return err;
327  		}
328  		ctx->urb->transfer_flags = URB_NO_TRANSFER_DMA_MAP;
329  		ep->num_urbs++;
330  	}
331  	ep->urb_free = ep->urb_free_mask = GENMASK(ep->num_urbs - 1, 0);
332  	return 0;
333  }
334  
335  static struct snd_usb_midi2_endpoint *
ump_to_endpoint(struct snd_ump_endpoint * ump,int dir)336  ump_to_endpoint(struct snd_ump_endpoint *ump, int dir)
337  {
338  	struct snd_usb_midi2_ump *rmidi = ump->private_data;
339  
340  	return rmidi->eps[dir];
341  }
342  
343  /* ump open callback */
snd_usb_midi_v2_open(struct snd_ump_endpoint * ump,int dir)344  static int snd_usb_midi_v2_open(struct snd_ump_endpoint *ump, int dir)
345  {
346  	struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
347  	int err = 0;
348  
349  	if (!ep || !ep->endpoint)
350  		return -ENODEV;
351  	if (ep->disconnected)
352  		return -EIO;
353  	if (ep->direction == STR_OUT) {
354  		err = alloc_midi_urbs(ep);
355  		if (err) {
356  			free_midi_urbs(ep);
357  			return err;
358  		}
359  	}
360  	return 0;
361  }
362  
363  /* ump close callback */
snd_usb_midi_v2_close(struct snd_ump_endpoint * ump,int dir)364  static void snd_usb_midi_v2_close(struct snd_ump_endpoint *ump, int dir)
365  {
366  	struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
367  
368  	if (ep->direction == STR_OUT) {
369  		kill_midi_urbs(ep, false);
370  		drain_urb_queue(ep);
371  		free_midi_urbs(ep);
372  	}
373  }
374  
375  /* ump trigger callback */
snd_usb_midi_v2_trigger(struct snd_ump_endpoint * ump,int dir,int up)376  static void snd_usb_midi_v2_trigger(struct snd_ump_endpoint *ump, int dir,
377  				    int up)
378  {
379  	struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
380  
381  	atomic_set(&ep->running, up);
382  	if (up && ep->direction == STR_OUT && !ep->disconnected)
383  		submit_io_urbs(ep);
384  }
385  
386  /* ump drain callback */
snd_usb_midi_v2_drain(struct snd_ump_endpoint * ump,int dir)387  static void snd_usb_midi_v2_drain(struct snd_ump_endpoint *ump, int dir)
388  {
389  	struct snd_usb_midi2_endpoint *ep = ump_to_endpoint(ump, dir);
390  
391  	drain_urb_queue(ep);
392  }
393  
394  /* allocate and start all input streams */
start_input_streams(struct snd_usb_midi2_interface * umidi)395  static int start_input_streams(struct snd_usb_midi2_interface *umidi)
396  {
397  	struct snd_usb_midi2_endpoint *ep;
398  	int err;
399  
400  	list_for_each_entry(ep, &umidi->ep_list, list) {
401  		if (ep->direction == STR_IN) {
402  			err = alloc_midi_urbs(ep);
403  			if (err < 0)
404  				goto error;
405  		}
406  	}
407  
408  	list_for_each_entry(ep, &umidi->ep_list, list) {
409  		if (ep->direction == STR_IN)
410  			submit_io_urbs(ep);
411  	}
412  
413  	return 0;
414  
415   error:
416  	list_for_each_entry(ep, &umidi->ep_list, list) {
417  		if (ep->direction == STR_IN)
418  			free_midi_urbs(ep);
419  	}
420  
421  	return err;
422  }
423  
424  static const struct snd_ump_ops snd_usb_midi_v2_ump_ops = {
425  	.open = snd_usb_midi_v2_open,
426  	.close = snd_usb_midi_v2_close,
427  	.trigger = snd_usb_midi_v2_trigger,
428  	.drain = snd_usb_midi_v2_drain,
429  };
430  
431  /* create a USB MIDI 2.0 endpoint object */
create_midi2_endpoint(struct snd_usb_midi2_interface * umidi,struct usb_host_endpoint * hostep,const struct usb_ms20_endpoint_descriptor * ms_ep)432  static int create_midi2_endpoint(struct snd_usb_midi2_interface *umidi,
433  				 struct usb_host_endpoint *hostep,
434  				 const struct usb_ms20_endpoint_descriptor *ms_ep)
435  {
436  	struct snd_usb_midi2_endpoint *ep;
437  	int endpoint, dir;
438  
439  	usb_audio_dbg(umidi->chip, "Creating an EP 0x%02x, #GTB=%d\n",
440  		      hostep->desc.bEndpointAddress,
441  		      ms_ep->bNumGrpTrmBlock);
442  
443  	ep = kzalloc(sizeof(*ep), GFP_KERNEL);
444  	if (!ep)
445  		return -ENOMEM;
446  
447  	spin_lock_init(&ep->lock);
448  	init_waitqueue_head(&ep->wait);
449  	ep->dev = umidi->chip->dev;
450  	endpoint = hostep->desc.bEndpointAddress;
451  	dir = (endpoint & USB_DIR_IN) ? STR_IN : STR_OUT;
452  
453  	ep->endpoint = endpoint;
454  	ep->direction = dir;
455  	ep->ms_ep = ms_ep;
456  	if (usb_endpoint_xfer_int(&hostep->desc))
457  		ep->interval = hostep->desc.bInterval;
458  	else
459  		ep->interval = 0;
460  	if (dir == STR_IN) {
461  		if (ep->interval)
462  			ep->pipe = usb_rcvintpipe(ep->dev, endpoint);
463  		else
464  			ep->pipe = usb_rcvbulkpipe(ep->dev, endpoint);
465  	} else {
466  		if (ep->interval)
467  			ep->pipe = usb_sndintpipe(ep->dev, endpoint);
468  		else
469  			ep->pipe = usb_sndbulkpipe(ep->dev, endpoint);
470  	}
471  	ep->packets = usb_maxpacket(ep->dev, ep->pipe);
472  	list_add_tail(&ep->list, &umidi->ep_list);
473  
474  	return 0;
475  }
476  
477  /* destructor for endpoint; from snd_usb_midi_v2_free() */
free_midi2_endpoint(struct snd_usb_midi2_endpoint * ep)478  static void free_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
479  {
480  	list_del(&ep->list);
481  	free_midi_urbs(ep);
482  	kfree(ep);
483  }
484  
485  /* call all endpoint destructors */
free_all_midi2_endpoints(struct snd_usb_midi2_interface * umidi)486  static void free_all_midi2_endpoints(struct snd_usb_midi2_interface *umidi)
487  {
488  	struct snd_usb_midi2_endpoint *ep;
489  
490  	while (!list_empty(&umidi->ep_list)) {
491  		ep = list_first_entry(&umidi->ep_list,
492  				      struct snd_usb_midi2_endpoint, list);
493  		free_midi2_endpoint(ep);
494  	}
495  }
496  
497  /* find a MIDI STREAMING descriptor with a given subtype */
find_usb_ms_endpoint_descriptor(struct usb_host_endpoint * hostep,unsigned char subtype)498  static void *find_usb_ms_endpoint_descriptor(struct usb_host_endpoint *hostep,
499  					     unsigned char subtype)
500  {
501  	unsigned char *extra = hostep->extra;
502  	int extralen = hostep->extralen;
503  
504  	while (extralen > 3) {
505  		struct usb_ms_endpoint_descriptor *ms_ep =
506  			(struct usb_ms_endpoint_descriptor *)extra;
507  
508  		if (ms_ep->bLength > 3 &&
509  		    ms_ep->bDescriptorType == USB_DT_CS_ENDPOINT &&
510  		    ms_ep->bDescriptorSubtype == subtype)
511  			return ms_ep;
512  		if (!extra[0])
513  			break;
514  		extralen -= extra[0];
515  		extra += extra[0];
516  	}
517  	return NULL;
518  }
519  
520  /* get the full group terminal block descriptors and return the size */
get_group_terminal_block_descs(struct snd_usb_midi2_interface * umidi)521  static int get_group_terminal_block_descs(struct snd_usb_midi2_interface *umidi)
522  {
523  	struct usb_host_interface *hostif = umidi->hostif;
524  	struct usb_device *dev = umidi->chip->dev;
525  	struct usb_ms20_gr_trm_block_header_descriptor header = { 0 };
526  	unsigned char *data;
527  	int err, size;
528  
529  	err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
530  			      USB_REQ_GET_DESCRIPTOR,
531  			      USB_RECIP_INTERFACE | USB_TYPE_STANDARD | USB_DIR_IN,
532  			      USB_DT_CS_GR_TRM_BLOCK << 8 | hostif->desc.bAlternateSetting,
533  			      hostif->desc.bInterfaceNumber,
534  			      &header, sizeof(header));
535  	if (err < 0)
536  		return err;
537  	size = __le16_to_cpu(header.wTotalLength);
538  	if (!size) {
539  		dev_err(&dev->dev, "Failed to get GTB descriptors for %d:%d\n",
540  			hostif->desc.bInterfaceNumber, hostif->desc.bAlternateSetting);
541  		return -EINVAL;
542  	}
543  
544  	data = kzalloc(size, GFP_KERNEL);
545  	if (!data)
546  		return -ENOMEM;
547  
548  	err = snd_usb_ctl_msg(dev, usb_rcvctrlpipe(dev, 0),
549  			      USB_REQ_GET_DESCRIPTOR,
550  			      USB_RECIP_INTERFACE | USB_TYPE_STANDARD | USB_DIR_IN,
551  			      USB_DT_CS_GR_TRM_BLOCK << 8 | hostif->desc.bAlternateSetting,
552  			      hostif->desc.bInterfaceNumber, data, size);
553  	if (err < 0) {
554  		kfree(data);
555  		return err;
556  	}
557  
558  	umidi->blk_descs = data;
559  	umidi->blk_desc_size = size;
560  	return 0;
561  }
562  
563  /* find the corresponding group terminal block descriptor */
564  static const struct usb_ms20_gr_trm_block_descriptor *
find_group_terminal_block(struct snd_usb_midi2_interface * umidi,int id)565  find_group_terminal_block(struct snd_usb_midi2_interface *umidi, int id)
566  {
567  	const unsigned char *data = umidi->blk_descs;
568  	int size = umidi->blk_desc_size;
569  	const struct usb_ms20_gr_trm_block_descriptor *desc;
570  
571  	size -= sizeof(struct usb_ms20_gr_trm_block_header_descriptor);
572  	data += sizeof(struct usb_ms20_gr_trm_block_header_descriptor);
573  	while (size > 0 && *data && *data <= size) {
574  		desc = (const struct usb_ms20_gr_trm_block_descriptor *)data;
575  		if (desc->bLength >= sizeof(*desc) &&
576  		    desc->bDescriptorType == USB_DT_CS_GR_TRM_BLOCK &&
577  		    desc->bDescriptorSubtype == USB_MS_GR_TRM_BLOCK &&
578  		    desc->bGrpTrmBlkID == id)
579  			return desc;
580  		size -= *data;
581  		data += *data;
582  	}
583  
584  	return NULL;
585  }
586  
587  /* fill up the information from GTB */
parse_group_terminal_block(struct snd_usb_midi2_ump * rmidi,const struct usb_ms20_gr_trm_block_descriptor * desc)588  static int parse_group_terminal_block(struct snd_usb_midi2_ump *rmidi,
589  				      const struct usb_ms20_gr_trm_block_descriptor *desc)
590  {
591  	struct snd_ump_endpoint *ump = rmidi->ump;
592  	unsigned int protocol, protocol_caps;
593  
594  	/* set default protocol */
595  	switch (desc->bMIDIProtocol) {
596  	case USB_MS_MIDI_PROTO_1_0_64:
597  	case USB_MS_MIDI_PROTO_1_0_64_JRTS:
598  	case USB_MS_MIDI_PROTO_1_0_128:
599  	case USB_MS_MIDI_PROTO_1_0_128_JRTS:
600  		protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI1;
601  		break;
602  	case USB_MS_MIDI_PROTO_2_0:
603  	case USB_MS_MIDI_PROTO_2_0_JRTS:
604  		protocol = SNDRV_UMP_EP_INFO_PROTO_MIDI2;
605  		break;
606  	default:
607  		return 0;
608  	}
609  
610  	if (!ump->info.protocol)
611  		ump->info.protocol = protocol;
612  
613  	protocol_caps = protocol;
614  	switch (desc->bMIDIProtocol) {
615  	case USB_MS_MIDI_PROTO_1_0_64_JRTS:
616  	case USB_MS_MIDI_PROTO_1_0_128_JRTS:
617  	case USB_MS_MIDI_PROTO_2_0_JRTS:
618  		protocol_caps |= SNDRV_UMP_EP_INFO_PROTO_JRTS_TX |
619  			SNDRV_UMP_EP_INFO_PROTO_JRTS_RX;
620  		break;
621  	}
622  
623  	ump->info.protocol_caps |= protocol_caps;
624  	return 0;
625  }
626  
627  /* allocate and parse for each assigned group terminal block */
parse_group_terminal_blocks(struct snd_usb_midi2_interface * umidi)628  static int parse_group_terminal_blocks(struct snd_usb_midi2_interface *umidi)
629  {
630  	struct snd_usb_midi2_ump *rmidi;
631  	const struct usb_ms20_gr_trm_block_descriptor *desc;
632  	int err;
633  
634  	err = get_group_terminal_block_descs(umidi);
635  	if (err < 0)
636  		return err;
637  	if (!umidi->blk_descs)
638  		return 0;
639  
640  	list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
641  		desc = find_group_terminal_block(umidi, rmidi->usb_block_id);
642  		if (!desc)
643  			continue;
644  		err = parse_group_terminal_block(rmidi, desc);
645  		if (err < 0)
646  			return err;
647  	}
648  
649  	return 0;
650  }
651  
652  /* parse endpoints included in the given interface and create objects */
parse_midi_2_0_endpoints(struct snd_usb_midi2_interface * umidi)653  static int parse_midi_2_0_endpoints(struct snd_usb_midi2_interface *umidi)
654  {
655  	struct usb_host_interface *hostif = umidi->hostif;
656  	struct usb_host_endpoint *hostep;
657  	struct usb_ms20_endpoint_descriptor *ms_ep;
658  	int i, err;
659  
660  	for (i = 0; i < hostif->desc.bNumEndpoints; i++) {
661  		hostep = &hostif->endpoint[i];
662  		if (!usb_endpoint_xfer_bulk(&hostep->desc) &&
663  		    !usb_endpoint_xfer_int(&hostep->desc))
664  			continue;
665  		ms_ep = find_usb_ms_endpoint_descriptor(hostep, USB_MS_GENERAL_2_0);
666  		if (!ms_ep)
667  			continue;
668  		if (ms_ep->bLength <= sizeof(*ms_ep))
669  			continue;
670  		if (!ms_ep->bNumGrpTrmBlock)
671  			continue;
672  		if (ms_ep->bLength < sizeof(*ms_ep) + ms_ep->bNumGrpTrmBlock)
673  			continue;
674  		err = create_midi2_endpoint(umidi, hostep, ms_ep);
675  		if (err < 0)
676  			return err;
677  	}
678  	return 0;
679  }
680  
free_all_midi2_umps(struct snd_usb_midi2_interface * umidi)681  static void free_all_midi2_umps(struct snd_usb_midi2_interface *umidi)
682  {
683  	struct snd_usb_midi2_ump *rmidi;
684  
685  	while (!list_empty(&umidi->rawmidi_list)) {
686  		rmidi = list_first_entry(&umidi->rawmidi_list,
687  					 struct snd_usb_midi2_ump, list);
688  		list_del(&rmidi->list);
689  		kfree(rmidi);
690  	}
691  }
692  
create_midi2_ump(struct snd_usb_midi2_interface * umidi,struct snd_usb_midi2_endpoint * ep_in,struct snd_usb_midi2_endpoint * ep_out,int blk_id)693  static int create_midi2_ump(struct snd_usb_midi2_interface *umidi,
694  			    struct snd_usb_midi2_endpoint *ep_in,
695  			    struct snd_usb_midi2_endpoint *ep_out,
696  			    int blk_id)
697  {
698  	struct snd_usb_midi2_ump *rmidi;
699  	struct snd_ump_endpoint *ump;
700  	int input, output;
701  	char idstr[16];
702  	int err;
703  
704  	rmidi = kzalloc(sizeof(*rmidi), GFP_KERNEL);
705  	if (!rmidi)
706  		return -ENOMEM;
707  	INIT_LIST_HEAD(&rmidi->list);
708  	rmidi->dev = umidi->chip->dev;
709  	rmidi->umidi = umidi;
710  	rmidi->usb_block_id = blk_id;
711  
712  	rmidi->index = umidi->chip->num_rawmidis;
713  	snprintf(idstr, sizeof(idstr), "UMP %d", rmidi->index);
714  	input = ep_in ? 1 : 0;
715  	output = ep_out ? 1 : 0;
716  	err = snd_ump_endpoint_new(umidi->chip->card, idstr, rmidi->index,
717  				   output, input, &ump);
718  	if (err < 0) {
719  		usb_audio_dbg(umidi->chip, "Failed to create a UMP object\n");
720  		kfree(rmidi);
721  		return err;
722  	}
723  
724  	rmidi->ump = ump;
725  	umidi->chip->num_rawmidis++;
726  
727  	ump->private_data = rmidi;
728  	ump->ops = &snd_usb_midi_v2_ump_ops;
729  
730  	rmidi->eps[STR_IN] = ep_in;
731  	rmidi->eps[STR_OUT] = ep_out;
732  	if (ep_in) {
733  		ep_in->pair = ep_out;
734  		ep_in->rmidi = rmidi;
735  		ep_in->ump = ump;
736  	}
737  	if (ep_out) {
738  		ep_out->pair = ep_in;
739  		ep_out->rmidi = rmidi;
740  		ep_out->ump = ump;
741  	}
742  
743  	list_add_tail(&rmidi->list, &umidi->rawmidi_list);
744  	return 0;
745  }
746  
747  /* find the UMP EP with the given USB block id */
748  static struct snd_usb_midi2_ump *
find_midi2_ump(struct snd_usb_midi2_interface * umidi,int blk_id)749  find_midi2_ump(struct snd_usb_midi2_interface *umidi, int blk_id)
750  {
751  	struct snd_usb_midi2_ump *rmidi;
752  
753  	list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
754  		if (rmidi->usb_block_id == blk_id)
755  			return rmidi;
756  	}
757  	return NULL;
758  }
759  
760  /* look for the matching output endpoint and create UMP object if found */
find_matching_ep_partner(struct snd_usb_midi2_interface * umidi,struct snd_usb_midi2_endpoint * ep,int blk_id)761  static int find_matching_ep_partner(struct snd_usb_midi2_interface *umidi,
762  				    struct snd_usb_midi2_endpoint *ep,
763  				    int blk_id)
764  {
765  	struct snd_usb_midi2_endpoint *pair_ep;
766  	int blk;
767  
768  	usb_audio_dbg(umidi->chip, "Looking for a pair for EP-in 0x%02x\n",
769  		      ep->endpoint);
770  	list_for_each_entry(pair_ep, &umidi->ep_list, list) {
771  		if (pair_ep->direction != STR_OUT)
772  			continue;
773  		if (pair_ep->pair)
774  			continue; /* already paired */
775  		for (blk = 0; blk < pair_ep->ms_ep->bNumGrpTrmBlock; blk++) {
776  			if (pair_ep->ms_ep->baAssoGrpTrmBlkID[blk] == blk_id) {
777  				usb_audio_dbg(umidi->chip,
778  					      "Found a match with EP-out 0x%02x blk %d\n",
779  					      pair_ep->endpoint, blk);
780  				return create_midi2_ump(umidi, ep, pair_ep, blk_id);
781  			}
782  		}
783  	}
784  	return 0;
785  }
786  
787  /* Call UMP helper to parse UMP endpoints;
788   * this needs to be called after starting the input streams for bi-directional
789   * communications
790   */
parse_ump_endpoints(struct snd_usb_midi2_interface * umidi)791  static int parse_ump_endpoints(struct snd_usb_midi2_interface *umidi)
792  {
793  	struct snd_usb_midi2_ump *rmidi;
794  	int err;
795  
796  	list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
797  		if (!rmidi->ump ||
798  		    !(rmidi->ump->core.info_flags & SNDRV_RAWMIDI_INFO_DUPLEX))
799  			continue;
800  		err = snd_ump_parse_endpoint(rmidi->ump);
801  		if (!err) {
802  			rmidi->ump_parsed = true;
803  		} else {
804  			if (err == -ENOMEM)
805  				return err;
806  			/* fall back to GTB later */
807  		}
808  	}
809  	return 0;
810  }
811  
812  /* create a UMP block from a GTB entry */
create_gtb_block(struct snd_usb_midi2_ump * rmidi,int dir,int blk)813  static int create_gtb_block(struct snd_usb_midi2_ump *rmidi, int dir, int blk)
814  {
815  	struct snd_usb_midi2_interface *umidi = rmidi->umidi;
816  	const struct usb_ms20_gr_trm_block_descriptor *desc;
817  	struct snd_ump_block *fb;
818  	int type, err;
819  
820  	desc = find_group_terminal_block(umidi, blk);
821  	if (!desc)
822  		return 0;
823  
824  	usb_audio_dbg(umidi->chip,
825  		      "GTB %d: type=%d, group=%d/%d, protocol=%d, in bw=%d, out bw=%d\n",
826  		      blk, desc->bGrpTrmBlkType, desc->nGroupTrm,
827  		      desc->nNumGroupTrm, desc->bMIDIProtocol,
828  		      __le16_to_cpu(desc->wMaxInputBandwidth),
829  		      __le16_to_cpu(desc->wMaxOutputBandwidth));
830  
831  	/* assign the direction */
832  	switch (desc->bGrpTrmBlkType) {
833  	case USB_MS_GR_TRM_BLOCK_TYPE_BIDIRECTIONAL:
834  		type = SNDRV_UMP_DIR_BIDIRECTION;
835  		break;
836  	case USB_MS_GR_TRM_BLOCK_TYPE_INPUT_ONLY:
837  		type = SNDRV_UMP_DIR_INPUT;
838  		break;
839  	case USB_MS_GR_TRM_BLOCK_TYPE_OUTPUT_ONLY:
840  		type = SNDRV_UMP_DIR_OUTPUT;
841  		break;
842  	default:
843  		usb_audio_dbg(umidi->chip, "Unsupported GTB type %d\n",
844  			      desc->bGrpTrmBlkType);
845  		return 0; /* unsupported */
846  	}
847  
848  	/* guess work: set blk-1 as the (0-based) block ID */
849  	err = snd_ump_block_new(rmidi->ump, blk - 1, type,
850  				desc->nGroupTrm, desc->nNumGroupTrm,
851  				&fb);
852  	if (err == -EBUSY)
853  		return 0; /* already present */
854  	else if (err)
855  		return err;
856  
857  	if (desc->iBlockItem)
858  		usb_string(rmidi->dev, desc->iBlockItem,
859  			   fb->info.name, sizeof(fb->info.name));
860  
861  	if (__le16_to_cpu(desc->wMaxInputBandwidth) == 1 ||
862  	    __le16_to_cpu(desc->wMaxOutputBandwidth) == 1)
863  		fb->info.flags |= SNDRV_UMP_BLOCK_IS_MIDI1 |
864  			SNDRV_UMP_BLOCK_IS_LOWSPEED;
865  
866  	/* if MIDI 2.0 protocol is supported and yet the GTB shows MIDI 1.0,
867  	 * treat it as a MIDI 1.0-specific block
868  	 */
869  	if (rmidi->ump->info.protocol_caps & SNDRV_UMP_EP_INFO_PROTO_MIDI2) {
870  		switch (desc->bMIDIProtocol) {
871  		case USB_MS_MIDI_PROTO_1_0_64:
872  		case USB_MS_MIDI_PROTO_1_0_64_JRTS:
873  		case USB_MS_MIDI_PROTO_1_0_128:
874  		case USB_MS_MIDI_PROTO_1_0_128_JRTS:
875  			fb->info.flags |= SNDRV_UMP_BLOCK_IS_MIDI1;
876  			break;
877  		}
878  	}
879  
880  	snd_ump_update_group_attrs(rmidi->ump);
881  
882  	usb_audio_dbg(umidi->chip,
883  		      "Created a UMP block %d from GTB, name=%s, flags=0x%x\n",
884  		      blk, fb->info.name, fb->info.flags);
885  	return 0;
886  }
887  
888  /* Create UMP blocks for each UMP EP */
create_blocks_from_gtb(struct snd_usb_midi2_interface * umidi)889  static int create_blocks_from_gtb(struct snd_usb_midi2_interface *umidi)
890  {
891  	struct snd_usb_midi2_ump *rmidi;
892  	int i, blk, err, dir;
893  
894  	list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
895  		if (!rmidi->ump)
896  			continue;
897  		/* Blocks have been already created? */
898  		if (rmidi->ump_parsed || rmidi->ump->info.num_blocks)
899  			continue;
900  		/* GTB is static-only */
901  		rmidi->ump->info.flags |= SNDRV_UMP_EP_INFO_STATIC_BLOCKS;
902  		/* loop over GTBs */
903  		for (dir = 0; dir < 2; dir++) {
904  			if (!rmidi->eps[dir])
905  				continue;
906  			for (i = 0; i < rmidi->eps[dir]->ms_ep->bNumGrpTrmBlock; i++) {
907  				blk = rmidi->eps[dir]->ms_ep->baAssoGrpTrmBlkID[i];
908  				err = create_gtb_block(rmidi, dir, blk);
909  				if (err < 0)
910  					return err;
911  			}
912  		}
913  	}
914  
915  	return 0;
916  }
917  
918  /* attach legacy rawmidis */
attach_legacy_rawmidi(struct snd_usb_midi2_interface * umidi)919  static int attach_legacy_rawmidi(struct snd_usb_midi2_interface *umidi)
920  {
921  #if IS_ENABLED(CONFIG_SND_UMP_LEGACY_RAWMIDI)
922  	struct snd_usb_midi2_ump *rmidi;
923  	int err;
924  
925  	list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
926  		err = snd_ump_attach_legacy_rawmidi(rmidi->ump,
927  						    "Legacy MIDI",
928  						    umidi->chip->num_rawmidis);
929  		if (err < 0)
930  			return err;
931  		umidi->chip->num_rawmidis++;
932  	}
933  #endif
934  	return 0;
935  }
936  
snd_usb_midi_v2_free(struct snd_usb_midi2_interface * umidi)937  static void snd_usb_midi_v2_free(struct snd_usb_midi2_interface *umidi)
938  {
939  	free_all_midi2_endpoints(umidi);
940  	free_all_midi2_umps(umidi);
941  	list_del(&umidi->list);
942  	kfree(umidi->blk_descs);
943  	kfree(umidi);
944  }
945  
946  /* parse the interface for MIDI 2.0 */
parse_midi_2_0(struct snd_usb_midi2_interface * umidi)947  static int parse_midi_2_0(struct snd_usb_midi2_interface *umidi)
948  {
949  	struct snd_usb_midi2_endpoint *ep;
950  	int blk, id, err;
951  
952  	/* First, create an object for each USB MIDI Endpoint */
953  	err = parse_midi_2_0_endpoints(umidi);
954  	if (err < 0)
955  		return err;
956  	if (list_empty(&umidi->ep_list)) {
957  		usb_audio_warn(umidi->chip, "No MIDI endpoints found\n");
958  		return -ENODEV;
959  	}
960  
961  	/*
962  	 * Next, look for EP I/O pairs that are found in group terminal blocks
963  	 * A UMP object is created for each EP I/O pair as bidirecitonal
964  	 * UMP EP
965  	 */
966  	list_for_each_entry(ep, &umidi->ep_list, list) {
967  		/* only input in this loop; output is matched in find_midi_ump() */
968  		if (ep->direction != STR_IN)
969  			continue;
970  		for (blk = 0; blk < ep->ms_ep->bNumGrpTrmBlock; blk++) {
971  			id = ep->ms_ep->baAssoGrpTrmBlkID[blk];
972  			err = find_matching_ep_partner(umidi, ep, id);
973  			if (err < 0)
974  				return err;
975  		}
976  	}
977  
978  	/*
979  	 * For the remaining EPs, treat as singles, create a UMP object with
980  	 * unidirectional EP
981  	 */
982  	list_for_each_entry(ep, &umidi->ep_list, list) {
983  		if (ep->rmidi)
984  			continue; /* already paired */
985  		for (blk = 0; blk < ep->ms_ep->bNumGrpTrmBlock; blk++) {
986  			id = ep->ms_ep->baAssoGrpTrmBlkID[blk];
987  			if (find_midi2_ump(umidi, id))
988  				continue;
989  			usb_audio_dbg(umidi->chip,
990  				      "Creating a unidirection UMP for EP=0x%02x, blk=%d\n",
991  				      ep->endpoint, id);
992  			if (ep->direction == STR_IN)
993  				err = create_midi2_ump(umidi, ep, NULL, id);
994  			else
995  				err = create_midi2_ump(umidi, NULL, ep, id);
996  			if (err < 0)
997  				return err;
998  			break;
999  		}
1000  	}
1001  
1002  	return 0;
1003  }
1004  
1005  /* is the given interface for MIDI 2.0? */
is_midi2_altset(struct usb_host_interface * hostif)1006  static bool is_midi2_altset(struct usb_host_interface *hostif)
1007  {
1008  	struct usb_ms_header_descriptor *ms_header =
1009  		(struct usb_ms_header_descriptor *)hostif->extra;
1010  
1011  	if (hostif->extralen < 7 ||
1012  	    ms_header->bLength < 7 ||
1013  	    ms_header->bDescriptorType != USB_DT_CS_INTERFACE ||
1014  	    ms_header->bDescriptorSubtype != UAC_HEADER)
1015  		return false;
1016  
1017  	return le16_to_cpu(ms_header->bcdMSC) == USB_MS_REV_MIDI_2_0;
1018  }
1019  
1020  /* change the altsetting */
set_altset(struct snd_usb_midi2_interface * umidi)1021  static int set_altset(struct snd_usb_midi2_interface *umidi)
1022  {
1023  	usb_audio_dbg(umidi->chip, "Setting host iface %d:%d\n",
1024  		      umidi->hostif->desc.bInterfaceNumber,
1025  		      umidi->hostif->desc.bAlternateSetting);
1026  	return usb_set_interface(umidi->chip->dev,
1027  				 umidi->hostif->desc.bInterfaceNumber,
1028  				 umidi->hostif->desc.bAlternateSetting);
1029  }
1030  
1031  /* fill UMP Endpoint name string from USB descriptor */
fill_ump_ep_name(struct snd_ump_endpoint * ump,struct usb_device * dev,int id)1032  static void fill_ump_ep_name(struct snd_ump_endpoint *ump,
1033  			     struct usb_device *dev, int id)
1034  {
1035  	int len;
1036  
1037  	usb_string(dev, id, ump->info.name, sizeof(ump->info.name));
1038  
1039  	/* trim superfluous "MIDI" suffix */
1040  	len = strlen(ump->info.name);
1041  	if (len > 5 && !strcmp(ump->info.name + len - 5, " MIDI"))
1042  		ump->info.name[len - 5] = 0;
1043  }
1044  
1045  /* fill the fallback name string for each rawmidi instance */
set_fallback_rawmidi_names(struct snd_usb_midi2_interface * umidi)1046  static void set_fallback_rawmidi_names(struct snd_usb_midi2_interface *umidi)
1047  {
1048  	struct usb_device *dev = umidi->chip->dev;
1049  	struct snd_usb_midi2_ump *rmidi;
1050  	struct snd_ump_endpoint *ump;
1051  
1052  	list_for_each_entry(rmidi, &umidi->rawmidi_list, list) {
1053  		ump = rmidi->ump;
1054  		/* fill UMP EP name from USB descriptors */
1055  		if (!*ump->info.name && umidi->hostif->desc.iInterface)
1056  			fill_ump_ep_name(ump, dev, umidi->hostif->desc.iInterface);
1057  		else if (!*ump->info.name && dev->descriptor.iProduct)
1058  			fill_ump_ep_name(ump, dev, dev->descriptor.iProduct);
1059  		/* fill fallback name */
1060  		if (!*ump->info.name)
1061  			sprintf(ump->info.name, "USB MIDI %d", rmidi->index);
1062  		/* copy as rawmidi name if not set */
1063  		if (!*ump->core.name)
1064  			strscpy(ump->core.name, ump->info.name,
1065  				sizeof(ump->core.name));
1066  		/* use serial number string as unique UMP product id */
1067  		if (!*ump->info.product_id && dev->descriptor.iSerialNumber)
1068  			usb_string(dev, dev->descriptor.iSerialNumber,
1069  				   ump->info.product_id,
1070  				   sizeof(ump->info.product_id));
1071  	}
1072  }
1073  
1074  /* create MIDI interface; fallback to MIDI 1.0 if needed */
snd_usb_midi_v2_create(struct snd_usb_audio * chip,struct usb_interface * iface,const struct snd_usb_audio_quirk * quirk,unsigned int usb_id)1075  int snd_usb_midi_v2_create(struct snd_usb_audio *chip,
1076  			   struct usb_interface *iface,
1077  			   const struct snd_usb_audio_quirk *quirk,
1078  			   unsigned int usb_id)
1079  {
1080  	struct snd_usb_midi2_interface *umidi;
1081  	struct usb_host_interface *hostif;
1082  	int err;
1083  
1084  	usb_audio_dbg(chip, "Parsing interface %d...\n",
1085  		      iface->altsetting[0].desc.bInterfaceNumber);
1086  
1087  	/* fallback to MIDI 1.0? */
1088  	if (!midi2_enable) {
1089  		usb_audio_info(chip, "Falling back to MIDI 1.0 by module option\n");
1090  		goto fallback_to_midi1;
1091  	}
1092  	if ((quirk && quirk->type != QUIRK_MIDI_STANDARD_INTERFACE) ||
1093  	    iface->num_altsetting < 2) {
1094  		usb_audio_info(chip, "Quirk or no altset; falling back to MIDI 1.0\n");
1095  		goto fallback_to_midi1;
1096  	}
1097  	hostif = &iface->altsetting[1];
1098  	if (!is_midi2_altset(hostif)) {
1099  		usb_audio_info(chip, "No MIDI 2.0 at altset 1, falling back to MIDI 1.0\n");
1100  		goto fallback_to_midi1;
1101  	}
1102  	if (!hostif->desc.bNumEndpoints) {
1103  		usb_audio_info(chip, "No endpoint at altset 1, falling back to MIDI 1.0\n");
1104  		goto fallback_to_midi1;
1105  	}
1106  
1107  	usb_audio_dbg(chip, "Creating a MIDI 2.0 instance for %d:%d\n",
1108  		      hostif->desc.bInterfaceNumber,
1109  		      hostif->desc.bAlternateSetting);
1110  
1111  	umidi = kzalloc(sizeof(*umidi), GFP_KERNEL);
1112  	if (!umidi)
1113  		return -ENOMEM;
1114  	umidi->chip = chip;
1115  	umidi->iface = iface;
1116  	umidi->hostif = hostif;
1117  	INIT_LIST_HEAD(&umidi->rawmidi_list);
1118  	INIT_LIST_HEAD(&umidi->ep_list);
1119  
1120  	list_add_tail(&umidi->list, &chip->midi_v2_list);
1121  
1122  	err = set_altset(umidi);
1123  	if (err < 0) {
1124  		usb_audio_err(chip, "Failed to set altset\n");
1125  		goto error;
1126  	}
1127  
1128  	/* assume only altset 1 corresponding to MIDI 2.0 interface */
1129  	err = parse_midi_2_0(umidi);
1130  	if (err < 0) {
1131  		usb_audio_err(chip, "Failed to parse MIDI 2.0 interface\n");
1132  		goto error;
1133  	}
1134  
1135  	/* parse USB group terminal blocks */
1136  	err = parse_group_terminal_blocks(umidi);
1137  	if (err < 0) {
1138  		usb_audio_err(chip, "Failed to parse GTB\n");
1139  		goto error;
1140  	}
1141  
1142  	err = start_input_streams(umidi);
1143  	if (err < 0) {
1144  		usb_audio_err(chip, "Failed to start input streams\n");
1145  		goto error;
1146  	}
1147  
1148  	if (midi2_ump_probe) {
1149  		err = parse_ump_endpoints(umidi);
1150  		if (err < 0) {
1151  			usb_audio_err(chip, "Failed to parse UMP endpoint\n");
1152  			goto error;
1153  		}
1154  	}
1155  
1156  	err = create_blocks_from_gtb(umidi);
1157  	if (err < 0) {
1158  		usb_audio_err(chip, "Failed to create GTB blocks\n");
1159  		goto error;
1160  	}
1161  
1162  	set_fallback_rawmidi_names(umidi);
1163  
1164  	err = attach_legacy_rawmidi(umidi);
1165  	if (err < 0) {
1166  		usb_audio_err(chip, "Failed to create legacy rawmidi\n");
1167  		goto error;
1168  	}
1169  
1170  	return 0;
1171  
1172   error:
1173  	snd_usb_midi_v2_free(umidi);
1174  	return err;
1175  
1176   fallback_to_midi1:
1177  	return __snd_usbmidi_create(chip->card, iface, &chip->midi_list,
1178  				    quirk, usb_id, &chip->num_rawmidis);
1179  }
1180  
suspend_midi2_endpoint(struct snd_usb_midi2_endpoint * ep)1181  static void suspend_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
1182  {
1183  	kill_midi_urbs(ep, true);
1184  	drain_urb_queue(ep);
1185  }
1186  
snd_usb_midi_v2_suspend_all(struct snd_usb_audio * chip)1187  void snd_usb_midi_v2_suspend_all(struct snd_usb_audio *chip)
1188  {
1189  	struct snd_usb_midi2_interface *umidi;
1190  	struct snd_usb_midi2_endpoint *ep;
1191  
1192  	list_for_each_entry(umidi, &chip->midi_v2_list, list) {
1193  		list_for_each_entry(ep, &umidi->ep_list, list)
1194  			suspend_midi2_endpoint(ep);
1195  	}
1196  }
1197  
resume_midi2_endpoint(struct snd_usb_midi2_endpoint * ep)1198  static void resume_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
1199  {
1200  	ep->running = ep->suspended;
1201  	if (ep->direction == STR_IN)
1202  		submit_io_urbs(ep);
1203  	/* FIXME: does it all? */
1204  }
1205  
snd_usb_midi_v2_resume_all(struct snd_usb_audio * chip)1206  void snd_usb_midi_v2_resume_all(struct snd_usb_audio *chip)
1207  {
1208  	struct snd_usb_midi2_interface *umidi;
1209  	struct snd_usb_midi2_endpoint *ep;
1210  
1211  	list_for_each_entry(umidi, &chip->midi_v2_list, list) {
1212  		set_altset(umidi);
1213  		list_for_each_entry(ep, &umidi->ep_list, list)
1214  			resume_midi2_endpoint(ep);
1215  	}
1216  }
1217  
snd_usb_midi_v2_disconnect_all(struct snd_usb_audio * chip)1218  void snd_usb_midi_v2_disconnect_all(struct snd_usb_audio *chip)
1219  {
1220  	struct snd_usb_midi2_interface *umidi;
1221  	struct snd_usb_midi2_endpoint *ep;
1222  
1223  	list_for_each_entry(umidi, &chip->midi_v2_list, list) {
1224  		umidi->disconnected = 1;
1225  		list_for_each_entry(ep, &umidi->ep_list, list) {
1226  			ep->disconnected = 1;
1227  			kill_midi_urbs(ep, false);
1228  			drain_urb_queue(ep);
1229  		}
1230  	}
1231  }
1232  
1233  /* release the MIDI instance */
snd_usb_midi_v2_free_all(struct snd_usb_audio * chip)1234  void snd_usb_midi_v2_free_all(struct snd_usb_audio *chip)
1235  {
1236  	struct snd_usb_midi2_interface *umidi, *next;
1237  
1238  	list_for_each_entry_safe(umidi, next, &chip->midi_v2_list, list)
1239  		snd_usb_midi_v2_free(umidi);
1240  }
1241