File Index
Files and directories
Sign in
FILE

midi2.c

File preview with syntax highlighting.

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