Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/sound/usb/midi2.c
29265 views
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 */
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 */
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
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 */
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
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 */
173
static 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
180
static 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 */
186
static 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 */
211
static 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 */
223
static 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 */
240
static 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 */
253
static 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() */
275
static 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
327
static struct snd_usb_midi2_endpoint *
328
ump_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 */
336
static 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 */
356
static 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 */
368
static 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 */
379
static 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 */
387
static 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
416
static 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 */
424
static 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() */
470
static 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 */
478
static 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 */
490
static 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 */
513
static 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 */
556
static const struct usb_ms20_gr_trm_block_descriptor *
557
find_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 */
580
static 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 */
620
static 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 */
645
static 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
673
static 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
685
static 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 */
740
static struct snd_usb_midi2_ump *
741
find_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 */
753
static 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
*/
783
static 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 */
805
static 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 */
881
static 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 */
911
static 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
929
static 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 */
939
static 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? */
998
static 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 */
1013
static 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 */
1024
static 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 */
1038
static 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 */
1068
int 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
1174
static void suspend_midi2_endpoint(struct snd_usb_midi2_endpoint *ep)
1175
{
1176
kill_midi_urbs(ep, true);
1177
drain_urb_queue(ep);
1178
}
1179
1180
void 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
1191
static 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
1199
void 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
1211
void 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 */
1227
void 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
}
1234
1235